spec/lib/protobuf/message_spec.rb in protobuf-2.8.13 vs spec/lib/protobuf/message_spec.rb in protobuf-3.0.0.rc1

- old
+ new

@@ -8,52 +8,52 @@ it 'creates a new message object decoded from the given bytes' do ::Test::Resource.decode(message.encode).should eq message end end - describe '.define_field' do + 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 expect { Class.new(Protobuf::Message) do - define_field :optional, ::Protobuf::Field::Int32Field, :foo, 1, {} - define_field :optional, ::Protobuf::Field::Int32Field, :bar, 1, {} + optional ::Protobuf::Field::Int32Field, :foo, 1 + optional ::Protobuf::Field::Int32Field, :bar, 1 end }.to raise_error(Protobuf::TagCollisionError, /Field number 1 has already been used/) end end context 'when defining an extension field with a tag that has already been used' do it 'raises a TagCollisionError' do expect { Class.new(Protobuf::Message) do extensions 100...110 - define_field :optional, ::Protobuf::Field::Int32Field, :foo, 100, {} - define_field :optional, ::Protobuf::Field::Int32Field, :bar, 100, :extension => true + optional ::Protobuf::Field::Int32Field, :foo, 100 + optional ::Protobuf::Field::Int32Field, :bar, 100, :extension => true end }.to raise_error(Protobuf::TagCollisionError, /Field number 100 has already been used/) end end context 'when defining a field with a name that has already been used' do it 'raises a DuplicateFieldNameError' do expect { Class.new(Protobuf::Message) do - define_field :optional, ::Protobuf::Field::Int32Field, :foo, 1, {} - define_field :optional, ::Protobuf::Field::Int32Field, :foo, 2, {} + optional ::Protobuf::Field::Int32Field, :foo, 1 + optional ::Protobuf::Field::Int32Field, :foo, 2 end }.to raise_error(Protobuf::DuplicateFieldNameError, /Field name foo has already been used/) end end context 'when defining an extension field with a name that has already been used' do it 'raises a DuplicateFieldNameError' do expect { Class.new(Protobuf::Message) do extensions 100...110 - define_field :optional, ::Protobuf::Field::Int32Field, :foo, 1, {} - define_field :optional, ::Protobuf::Field::Int32Field, :foo, 100, :extension => true + optional ::Protobuf::Field::Int32Field, :foo, 1 + optional ::Protobuf::Field::Int32Field, :foo, 100, :extension => true end }.to raise_error(Protobuf::DuplicateFieldNameError, /Field name foo has already been used/) end end end @@ -287,90 +287,72 @@ end its(:to_json) { should eq '{"name":"Test Name","active":false}' } end - describe '.to_json' do - it 'returns the class name of the message for use in json encoding' do - expect { - ::Timeout.timeout(0.1) do - expect(::Test::Resource.to_json).to eq("Test::Resource") - end - }.not_to raise_error + describe "#define_setter" do + subject { ::Test::Resource.new } + + it "allows string fields to be set to nil" do + expect { subject.name = nil }.to_not raise_error end - end - describe '#get_field_by_name' do - subject do - ::Test::Resource.new({ :name => 'Test Name', :date_created => Time.now.to_i }) + it "does not allow string fields to be set to Numeric" do + expect { subject.name = 1}.to raise_error(/name/) end + end - context 'when name is a valid field' do - let(:valid_field) { subject.get_field_by_name(:name) } - specify { valid_field.should be_a ::Protobuf::Field::StringField } - specify { valid_field.name.should eq :name } + describe '.get_extension_field' do + it 'fetches an extension field by its tag' do + field = ::Test::Resource.get_extension_field(100) + expect(field).to be_a(::Protobuf::Field::BoolField) + expect(field.tag).to eq(100) + expect(field.name).to eq(:ext_is_searchable) + expect(field).to be_extension end - context 'when name is not a valid field' do - specify do - subject.get_field_by_name(1).should be_nil - end - - specify do - subject.get_field_by_name(:nothere).should be_nil - end - - specify do - subject.get_field_by_name(nil).should be_nil - end + it 'fetches an extension field by its symbolized name' do + expect(::Test::Resource.get_extension_field(:ext_is_searchable)).to be_a(::Protobuf::Field::BoolField) + expect(::Test::Resource.get_extension_field('ext_is_searchable')).to be_a(::Protobuf::Field::BoolField) end - end - describe "#define_setter" do - subject { ::Test::Resource.new } - it "allows string fields to be set to nil" do - expect { subject.name = nil }.to_not raise_error + it 'returns nil when attempting to get a non-extension field' do + expect(::Test::Resource.get_extension_field(1)).to be_nil end - it "does not allow string fields to be set to Numeric" do - expect { subject.name = 1}.to raise_error(/name/) + it 'returns nil when field is not found' do + ::Test::Resource.get_extension_field(-1).should be_nil + ::Test::Resource.get_extension_field(nil).should be_nil end end - describe '#get_ext_field_by_name' do - pending 'Need to get a proto compiled with extensions first' - end + describe '.get_field' do + it 'fetches a non-extension field by its tag' do + field = ::Test::Resource.get_field(1) + expect(field).to be_a(::Protobuf::Field::StringField) + expect(field.tag).to eq(1) + expect(field.name).to eq(:name) + expect(field).not_to be_extension + end - describe '#get_field_by_tag' do - subject do - ::Test::Resource.new({ :name => 'Test Name', :date_created => Time.now.to_i }) + it 'fetches a non-extension field by its symbolized name' do + expect(::Test::Resource.get_field(:name)).to be_a(::Protobuf::Field::StringField) + expect(::Test::Resource.get_field('name')).to be_a(::Protobuf::Field::StringField) end - context 'when tag references a valid field' do - let(:valid_field) { subject.get_field_by_tag(1) } - specify { valid_field.should be_a ::Protobuf::Field::StringField } - specify { valid_field.name.should eq :name } + it 'fetches an extension field when forced' do + expect(::Test::Resource.get_field(100, true)).to be_a(::Protobuf::Field::BoolField) + expect(::Test::Resource.get_field(:ext_is_searchable, true)).to be_a(::Protobuf::Field::BoolField) + expect(::Test::Resource.get_field('ext_is_searchable', true)).to be_a(::Protobuf::Field::BoolField) end - context 'when tag does not reference a field' do - it 'returns nil' do - pending 'need to implement a range-limiting array sub-class for field access' - subject.get_field_by_tag(-1).should be_nil - end + it 'returns nil when attempting to get an extension field' do + expect(::Test::Resource.get_field(100)).to be_nil end - context 'when tag is not numeric' do - specify do - expect { - subject.get_field_by_tag("not a number") - }.to raise_error(::Protobuf::FieldNotDefinedError, /.*not a number.*#{subject.class.name}/) - end - - specify do - expect { - subject.get_field_by_tag(nil) - }.to raise_error(::Protobuf::FieldNotDefinedError, /.*nil.*#{subject.class.name}/) - end + it 'returns nil when field is not defined' do + ::Test::Resource.get_field(-1).should be_nil + ::Test::Resource.get_field(nil).should be_nil end end end