spec/lib/protobuf/message_spec.rb in protobuf-3.0.5 vs spec/lib/protobuf/message_spec.rb in protobuf-3.1.0
- old
+ new
@@ -6,9 +6,68 @@
let(:message) { ::Test::Resource.new(:name => "Jim") }
it 'creates a new message object decoded from the given bytes' do
expect(::Test::Resource.decode(message.encode)).to eq message
end
+
+ context 'with a new enum value' do
+ let(:older_message) do
+ Class.new(Protobuf::Message) do
+ enum_class = Class.new(::Protobuf::Enum) do
+ define :YAY, 1
+ end
+
+ optional enum_class, :enum_field, 1
+ repeated enum_class, :enum_list, 2
+ end
+ end
+
+ let(:newer_message) do
+ Class.new(Protobuf::Message) do
+ enum_class = Class.new(::Protobuf::Enum) do
+ define :YAY, 1
+ define :HOORAY, 2
+ end
+
+ optional enum_class, :enum_field, 1
+ repeated enum_class, :enum_list, 2
+ end
+ end
+
+ context 'with a singular field' do
+ it 'treats the field as if it was unset when decoding' do
+ newer = newer_message.new(:enum_field => :HOORAY).serialize
+
+ expect(older_message.decode(newer).enum_field!).to be_nil
+ end
+
+ it 'rejects an unknown value when using the constructor' do
+ expect { older_message.new(:enum_field => :HOORAY) }.to raise_error
+ end
+
+ it 'rejects an unknown value when the setter' do
+ older = older_message.new
+ expect { older.enum_field = :HOORAY }.to raise_error
+ end
+ end
+
+ context 'with a repeated field' do
+ it 'treats the field as if it was unset when decoding' do
+ newer = newer_message.new(:enum_list => [ :HOORAY ]).serialize
+
+ expect(older_message.decode(newer).enum_list).to eq([])
+ end
+
+ it 'rejects an unknown value when using the constructor' do
+ expect { older_message.new(:enum_list => [ :HOORAY ]) }.to raise_error
+ end
+
+ it 'rejects an unknown value when the setter' do
+ older = older_message.new
+ expect { older.enum_field = [ :HOORAY ] }.to raise_error
+ end
+ end
+ end
end
describe 'defining a new field' do
context 'when defining a field with a tag that has already been used' do
it 'raises a TagCollisionError' do