diff --git a/lib/protobuf/field/base_field.rb b/lib/protobuf/field/base_field.rb index 440bbd72..35ffe930 100644 --- a/lib/protobuf/field/base_field.rb +++ b/lib/protobuf/field/base_field.rb @@ -194,6 +194,11 @@ def define_array_setter message_class.class_eval do define_method(method_name) do |val| + if val.nil? || (val.respond_to?(:empty?) && val.empty?) + @values.delete(field.name) + return + end + if val.is_a?(Array) val = val.dup val.compact! @@ -204,12 +209,8 @@ def define_array_setter TYPE_ERROR end - if val.nil? || (val.respond_to?(:empty?) && val.empty?) - @values.delete(field.name) - else - @values[field.name] ||= ::Protobuf::Field::FieldArray.new(field) - @values[field.name].replace(val) - end + @values[field.name] ||= ::Protobuf::Field::FieldArray.new(field) + @values[field.name].replace(val) end end diff --git a/lib/protobuf/field/field_array.rb b/lib/protobuf/field/field_array.rb index 78bb79e0..8cc521aa 100644 --- a/lib/protobuf/field/field_array.rb +++ b/lib/protobuf/field/field_array.rb @@ -71,7 +71,7 @@ def normalize(value) elsif field.is_a?(::Protobuf::Field::MessageField) && value.respond_to?(:to_hash) field.type_class.new(value.to_hash) else - value + field.coerce!(value) end end diff --git a/spec/lib/protobuf/field/field_array_spec.rb b/spec/lib/protobuf/field/field_array_spec.rb index 48133381..c980d46c 100644 --- a/spec/lib/protobuf/field/field_array_spec.rb +++ b/spec/lib/protobuf/field/field_array_spec.rb @@ -17,6 +17,7 @@ class SomeRepeatMessage < ::Protobuf::Message optional :string, :some_string, 1 repeated :string, :multiple_strings, 2 repeated SomeBasicMessage, :multiple_basic_msgs, 3 + repeated :int64, :multiple_integers, 4 end let(:instance) { SomeRepeatMessage.new } @@ -64,6 +65,24 @@ class SomeRepeatMessage < ::Protobuf::Message expect(instance.multiple_basic_msgs.first).to be_a(MoreComplexMessage) end end + + context 'when applied to an Integer field array' do + it 'does conversion if adding a string' do + expect(instance.multiple_integers).to be_empty + instance.multiple_integers.send(method, '1') + expect(instance.multiple_integers).to eq([1]) + end + end + end + + describe 'assign' do + context 'nil to an array' do + it 'empties the array' do + instance.multiple_strings = ['string 1'] + instance.multiple_strings = nil + expect(instance.multiple_strings).to be_empty + end + end end end end