diff --git a/ruby/lib/google/protobuf/ffi/repeated_field.rb b/ruby/lib/google/protobuf/ffi/repeated_field.rb index 92840680e136e..6ce381ae64791 100644 --- a/ruby/lib/google/protobuf/ffi/repeated_field.rb +++ b/ruby/lib/google/protobuf/ffi/repeated_field.rb @@ -222,6 +222,8 @@ def ==(other) return true if other.object_id == object_id if other.is_a? RepeatedField return false unless other.length == length + return true if length == 0 + return false if type != other.send(:type) or descriptor != other.send(:descriptor) each_msg_val_with_index do |msg_val, i| other_msg_val = Google::Protobuf::FFI.get_msgval_at(other.send(:array), i) unless Google::Protobuf::FFI.message_value_equal(msg_val, other_msg_val, type, descriptor) diff --git a/ruby/tests/common_tests.rb b/ruby/tests/common_tests.rb index 40e80d644000d..12538182269e9 100644 --- a/ruby/tests/common_tests.rb +++ b/ruby/tests/common_tests.rb @@ -342,6 +342,61 @@ def test_rptfield_initialize end end + def test_rptfield_eq + rf_int32 = Google::Protobuf::RepeatedField.new(:int32) + rf_int64 = Google::Protobuf::RepeatedField.new(:int64) + rf_string = Google::Protobuf::RepeatedField.new(:string) + rf_msg1 = Google::Protobuf::RepeatedField.new(:message, proto_module::TestMessage) + rf_msg2 = Google::Protobuf::RepeatedField.new(:message, proto_module::TestMessage2) + rf_enum = Google::Protobuf::RepeatedField.new(:enum, proto_module::TestEnum) + + assert_equal [], rf_int32 + assert_equal rf_int32, [] + assert_equal [], rf_int64 + assert_equal rf_int64, [] + assert_equal [], rf_string + assert_equal rf_string, [] + assert_equal [], rf_msg1 + assert_equal rf_msg1, [] + assert_equal [], rf_enum + assert_equal rf_enum, [] + + l1 = Google::Protobuf::RepeatedField.new(:int32) + l2 = Google::Protobuf::RepeatedField.new(:int32) + assert_equal l1, l2 + l1.push 1 + l2.push 1 + assert_equal l1, l2 + assert_equal [1], l1 + assert_equal l1, [1] + + if !defined?(JRUBY_VERSION) && Google::Protobuf::IMPLEMENTATION == :NATIVE + refute_equal rf_int32, rf_int64 + refute_equal rf_int32, rf_string + refute_equal rf_int32, rf_msg1 + refute_equal rf_msg1, rf_msg2 + else + assert_equal rf_int32, rf_int64 + assert_equal rf_int32, rf_string + assert_equal rf_int32, rf_msg1 + assert_equal rf_msg1, rf_msg2 + end + + rf_int32_one = Google::Protobuf::RepeatedField.new(:int32, [1]) + rf_int64_one = Google::Protobuf::RepeatedField.new(:int64, [1]) + + if defined?(JRUBY_VERSION) && Google::Protobuf::IMPLEMENTATION == :NATIVE + assert_equal rf_int32_one, rf_int64_one + else + refute_equal rf_int32_one, rf_int64_one + end + + msg1 = Google::Protobuf::RepeatedField.new(:message, proto_module::TestMessage, [proto_module::TestMessage.new]) + msg2 = Google::Protobuf::RepeatedField.new(:message, proto_module::TestMessage2, [proto_module::TestMessage2.new]) + refute_equal msg1, msg2 + refute_equal rf_int32_one, msg1 + end + def test_rptfield_array_ducktyping l = Google::Protobuf::RepeatedField.new(:int32) length_methods = %w(count length size) @@ -566,6 +621,42 @@ def test_map_dup_deep_copy refute_same m["b"], m2["b"] end + def test_map_eq + map_str_int32 = Google::Protobuf::Map.new(:string, :int32) + map_str_int64 = Google::Protobuf::Map.new(:string, :int64) + map_int32_str = Google::Protobuf::Map.new(:int32, :string) + map_int32_int32 = Google::Protobuf::Map.new(:int32, :int32) + map_str_msg1 = Google::Protobuf::Map.new(:string, :message, proto_module::TestMessage) + map_str_msg2 = Google::Protobuf::Map.new(:string, :message, proto_module::TestMessage2) + map_str_enum = Google::Protobuf::Map.new(:string, :enum, proto_module::TestEnum) + + assert_equal map_str_int32, {} + assert_equal map_str_int64, {} + assert_equal map_int32_str, {} + assert_equal map_str_msg1, {} + assert_equal map_str_enum, {} + + m1 = Google::Protobuf::Map.new(:string, :int32) + m2 = Google::Protobuf::Map.new(:string, :int32) + assert_equal m1, m2 + m1["a"] = 1 + m2["a"] = 1 + assert_equal m1, m2 + assert_equal m1, {"a" => 1} + + refute_equal map_str_int32, map_str_int64 + refute_equal map_str_int32, map_int32_int32 + refute_equal map_str_msg1, map_str_msg2 + refute_equal map_str_enum, map_str_int32 + + refute_equal Google::Protobuf::Map.new(:string, :int32, {"a" => 1}), + Google::Protobuf::Map.new(:string, :int64, {"a" => 1}) + refute_equal Google::Protobuf::Map.new(:string, :int32, {"1" => 1}), + Google::Protobuf::Map.new(:int32, :int32, {1 => 1}) + refute_equal Google::Protobuf::Map.new(:string, :message, proto_module::TestMessage, {"a" => proto_module::TestMessage.new}), + Google::Protobuf::Map.new(:string, :message, proto_module::TestMessage2, {"a" => proto_module::TestMessage2.new}) + end + def test_oneof_descriptors d = proto_module::OneofMessage.descriptor o = d.lookup_oneof("my_oneof")