macks-ruby_protobuf 0.3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +14 -0
- data/Manifest.txt +74 -0
- data/README.txt +58 -0
- data/Rakefile +18 -0
- data/bin/mk_parser +2 -0
- data/bin/rprotoc +36 -0
- data/examples/addressbook.pb.rb +56 -0
- data/examples/addressbook.proto +24 -0
- data/examples/reading_a_message.rb +32 -0
- data/examples/writing_a_message.rb +46 -0
- data/lib/protobuf/common/wire_type.rb +10 -0
- data/lib/protobuf/compiler/compiler.rb +54 -0
- data/lib/protobuf/compiler/nodes.rb +319 -0
- data/lib/protobuf/compiler/proto.y +203 -0
- data/lib/protobuf/compiler/proto2.ebnf +79 -0
- data/lib/protobuf/compiler/proto_parser.rb +1394 -0
- data/lib/protobuf/compiler/template/rpc_bin.erb +4 -0
- data/lib/protobuf/compiler/template/rpc_client.erb +18 -0
- data/lib/protobuf/compiler/template/rpc_service.erb +25 -0
- data/lib/protobuf/compiler/visitors.rb +288 -0
- data/lib/protobuf/descriptor/descriptor.proto +286 -0
- data/lib/protobuf/descriptor/descriptor.rb +54 -0
- data/lib/protobuf/descriptor/descriptor_builder.rb +144 -0
- data/lib/protobuf/descriptor/descriptor_proto.rb +119 -0
- data/lib/protobuf/descriptor/enum_descriptor.rb +33 -0
- data/lib/protobuf/descriptor/field_descriptor.rb +50 -0
- data/lib/protobuf/descriptor/file_descriptor.rb +38 -0
- data/lib/protobuf/message/decoder.rb +93 -0
- data/lib/protobuf/message/encoder.rb +37 -0
- data/lib/protobuf/message/enum.rb +28 -0
- data/lib/protobuf/message/extend.rb +8 -0
- data/lib/protobuf/message/field.rb +654 -0
- data/lib/protobuf/message/message.rb +308 -0
- data/lib/protobuf/message/protoable.rb +37 -0
- data/lib/protobuf/message/service.rb +9 -0
- data/lib/protobuf/rpc/client.rb +19 -0
- data/lib/protobuf/rpc/handler.rb +17 -0
- data/lib/protobuf/rpc/server.rb +39 -0
- data/lib/ruby_protobuf.rb +3 -0
- data/test/addressbook.rb +98 -0
- data/test/addressbook_base.rb +62 -0
- data/test/addressbook_ext.rb +12 -0
- data/test/check_unbuild.rb +30 -0
- data/test/collision.rb +18 -0
- data/test/data/data.bin +3 -0
- data/test/data/data_source.py +14 -0
- data/test/data/types.bin +0 -0
- data/test/data/types_source.py +22 -0
- data/test/data/unk.png +0 -0
- data/test/ext_collision.rb +25 -0
- data/test/ext_range.rb +23 -0
- data/test/merge.rb +40 -0
- data/test/nested.rb +25 -0
- data/test/proto/addressbook.proto +31 -0
- data/test/proto/addressbook_base.proto +26 -0
- data/test/proto/addressbook_ext.proto +6 -0
- data/test/proto/collision.proto +5 -0
- data/test/proto/ext_collision.proto +8 -0
- data/test/proto/ext_range.proto +7 -0
- data/test/proto/merge.proto +15 -0
- data/test/proto/nested.proto +7 -0
- data/test/proto/rpc.proto +6 -0
- data/test/proto/types.proto +17 -0
- data/test/test_addressbook.rb +43 -0
- data/test/test_compiler.rb +313 -0
- data/test/test_descriptor.rb +122 -0
- data/test/test_extension.rb +40 -0
- data/test/test_message.rb +106 -0
- data/test/test_optional_field.rb +68 -0
- data/test/test_parse.rb +15 -0
- data/test/test_ruby_protobuf.rb +1 -0
- data/test/test_serialize.rb +42 -0
- data/test/test_standard_message.rb +96 -0
- data/test/test_types.rb +181 -0
- data/test/types.rb +22 -0
- metadata +150 -0
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/addressbook'
|
3
|
+
require 'protobuf/descriptor/descriptor_builder'
|
4
|
+
require 'protobuf/descriptor/descriptor_proto'
|
5
|
+
|
6
|
+
class DescriptorTest < Test::Unit::TestCase
|
7
|
+
include Google::Protobuf
|
8
|
+
def test_build
|
9
|
+
tutorial_proto = FileDescriptorProto.new
|
10
|
+
tutorial_proto.package = 'Build::Tutorial'
|
11
|
+
|
12
|
+
person_proto = DescriptorProto.new
|
13
|
+
tutorial_proto.message_type << person_proto
|
14
|
+
person_proto.name = 'Person'
|
15
|
+
|
16
|
+
person_name_proto = FieldDescriptorProto.new
|
17
|
+
person_proto.field << person_name_proto
|
18
|
+
person_name_proto.label = FieldDescriptorProto::Label::LABEL_REQUIRED
|
19
|
+
person_name_proto.type = FieldDescriptorProto::Type::TYPE_STRING
|
20
|
+
person_name_proto.name = 'name'
|
21
|
+
person_name_proto.number = 1
|
22
|
+
|
23
|
+
person_id_proto = FieldDescriptorProto.new
|
24
|
+
person_proto.field << person_id_proto
|
25
|
+
person_id_proto.label = FieldDescriptorProto::Label::LABEL_REQUIRED
|
26
|
+
person_id_proto.type = FieldDescriptorProto::Type::TYPE_INT32
|
27
|
+
person_id_proto.name = 'id'
|
28
|
+
person_id_proto.number = 2
|
29
|
+
|
30
|
+
person_email_proto = FieldDescriptorProto.new
|
31
|
+
person_proto.field << person_email_proto
|
32
|
+
person_email_proto.label = FieldDescriptorProto::Label::LABEL_OPTIONAL
|
33
|
+
person_email_proto.type = FieldDescriptorProto::Type::TYPE_STRING
|
34
|
+
person_email_proto.name = 'email'
|
35
|
+
person_email_proto.number = 3
|
36
|
+
|
37
|
+
person_phone_type_proto = EnumDescriptorProto.new
|
38
|
+
person_proto.enum_type << person_phone_type_proto
|
39
|
+
person_phone_type_proto.name = 'PhoneType'
|
40
|
+
|
41
|
+
person_phone_type_mobile_proto = EnumValueDescriptorProto.new
|
42
|
+
person_phone_type_proto.value << person_phone_type_mobile_proto
|
43
|
+
person_phone_type_mobile_proto.name = 'MOBILE'
|
44
|
+
person_phone_type_mobile_proto.number = 0
|
45
|
+
|
46
|
+
person_phone_type_home_proto = EnumValueDescriptorProto.new
|
47
|
+
person_phone_type_proto.value << person_phone_type_home_proto
|
48
|
+
person_phone_type_home_proto.name = 'HOME'
|
49
|
+
person_phone_type_home_proto.number = 1
|
50
|
+
|
51
|
+
person_phone_type_work_proto = EnumValueDescriptorProto.new
|
52
|
+
person_phone_type_proto.value << person_phone_type_work_proto
|
53
|
+
person_phone_type_work_proto.name = 'WORK'
|
54
|
+
person_phone_type_work_proto.number = 2
|
55
|
+
|
56
|
+
person_phone_number_proto = DescriptorProto.new
|
57
|
+
person_proto.nested_type << person_phone_number_proto
|
58
|
+
person_phone_number_proto.name = 'PhoneNumber'
|
59
|
+
|
60
|
+
person_phone_number_number_proto = FieldDescriptorProto.new
|
61
|
+
person_phone_number_proto.field << person_phone_number_number_proto
|
62
|
+
person_phone_number_number_proto.label = FieldDescriptorProto::Label::LABEL_REQUIRED
|
63
|
+
person_phone_number_number_proto.type = FieldDescriptorProto::Type::TYPE_STRING
|
64
|
+
person_phone_number_number_proto.name = 'number'
|
65
|
+
person_phone_number_number_proto.number = 1
|
66
|
+
|
67
|
+
person_phone_number_type_proto = FieldDescriptorProto.new
|
68
|
+
person_phone_number_proto.field << person_phone_number_type_proto
|
69
|
+
person_phone_number_type_proto.label = FieldDescriptorProto::Label::LABEL_OPTIONAL
|
70
|
+
person_phone_number_type_proto.type = FieldDescriptorProto::Type::TYPE_ENUM
|
71
|
+
person_phone_number_type_proto.type_name = 'PhoneType'
|
72
|
+
person_phone_number_type_proto.name = 'type'
|
73
|
+
person_phone_number_type_proto.number = 2
|
74
|
+
person_phone_number_type_proto.default_value = 'HOME'
|
75
|
+
|
76
|
+
person_phone_phone_number_proto = FieldDescriptorProto.new
|
77
|
+
person_proto.field << person_phone_phone_number_proto
|
78
|
+
person_phone_phone_number_proto.label = FieldDescriptorProto::Label::LABEL_REPEATED
|
79
|
+
person_phone_phone_number_proto.type = FieldDescriptorProto::Type::TYPE_MESSAGE
|
80
|
+
person_phone_phone_number_proto.type_name = 'PhoneNumber'
|
81
|
+
person_phone_phone_number_proto.name = 'phone'
|
82
|
+
person_phone_phone_number_proto.number = 4
|
83
|
+
|
84
|
+
address_book_proto = DescriptorProto.new
|
85
|
+
tutorial_proto.message_type << address_book_proto
|
86
|
+
address_book_proto.name = 'AddressBook'
|
87
|
+
|
88
|
+
address_book_person_proto = FieldDescriptorProto.new
|
89
|
+
address_book_proto.field << address_book_person_proto
|
90
|
+
address_book_person_proto.label = FieldDescriptorProto::Label::LABEL_REPEATED
|
91
|
+
address_book_person_proto.type = FieldDescriptorProto::Type::TYPE_MESSAGE
|
92
|
+
address_book_person_proto.type_name = 'Person'
|
93
|
+
address_book_person_proto.name = 'person'
|
94
|
+
address_book_person_proto.number = 1
|
95
|
+
|
96
|
+
Protobuf::Descriptor::DescriptorBuilder.build tutorial_proto
|
97
|
+
|
98
|
+
assert_nothing_raised {Build::Tutorial::Person}
|
99
|
+
assert_nothing_raised {Build::Tutorial::Person.new}
|
100
|
+
assert_equal ['email', 'id', 'name', 'phone'],
|
101
|
+
Build::Tutorial::Person.fields.map{|tag, field| field.name}.sort
|
102
|
+
|
103
|
+
assert_nothing_raised {Build::Tutorial::Person::PhoneNumber}
|
104
|
+
assert_nothing_raised {Build::Tutorial::Person::PhoneNumber.new}
|
105
|
+
assert_equal ['number', 'type'],
|
106
|
+
Build::Tutorial::Person::PhoneNumber.fields.map{|tag, field| field.name}.sort
|
107
|
+
|
108
|
+
assert_nothing_raised {Build::Tutorial::Person::PhoneType}
|
109
|
+
assert_equal 0, Build::Tutorial::Person::PhoneType::MOBILE
|
110
|
+
assert_equal 1, Build::Tutorial::Person::PhoneType::HOME
|
111
|
+
assert_equal 2, Build::Tutorial::Person::PhoneType::WORK
|
112
|
+
|
113
|
+
assert_nothing_raised {Build::Tutorial::AddressBook}
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_unbuild
|
117
|
+
proto = Protobuf::Descriptor::FileDescriptor.unbuild Tutorial::Person
|
118
|
+
proto.serialize_to_file 'person.bin'
|
119
|
+
puts
|
120
|
+
puts "run `test/check_unbuild.rb'"
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/addressbook_ext.rb'
|
3
|
+
|
4
|
+
class ExtensionTest < Test::Unit::TestCase
|
5
|
+
def test_accessor
|
6
|
+
assert TutorialExt::Person.extension_fields.to_a.map{|t, f| f.name}.include?(:age)
|
7
|
+
person = TutorialExt::Person.new
|
8
|
+
assert_nothing_raised {person.age = 100}
|
9
|
+
assert 100, person.age
|
10
|
+
#assert 100, person.extension.age
|
11
|
+
#assert_nothing_raised {person.extension.age = 200}
|
12
|
+
#assert 200, person.age
|
13
|
+
#assert 200, person.extension.age
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_serialize
|
17
|
+
# serialize to string
|
18
|
+
person = TutorialExt::Person.new
|
19
|
+
person.id = 1234
|
20
|
+
person.age = 70
|
21
|
+
person.name = 'John Doe'
|
22
|
+
person.email = 'jdoe@example.com'
|
23
|
+
phone = TutorialExt::Person::PhoneNumber.new
|
24
|
+
phone.number = '555-4321'
|
25
|
+
phone.type = TutorialExt::Person::PhoneType::HOME
|
26
|
+
person.phone << phone
|
27
|
+
serialized_string = person.serialize_to_string
|
28
|
+
|
29
|
+
# parse the serialized string
|
30
|
+
person2 = TutorialExt::Person.new
|
31
|
+
person2.parse_from_string serialized_string
|
32
|
+
assert_equal 1234, person2.id
|
33
|
+
assert_equal 70, person2.age
|
34
|
+
assert_equal 'John Doe', person2.name
|
35
|
+
assert_equal 'jdoe@example.com', person2.email
|
36
|
+
assert_equal 1, person2.phone.size
|
37
|
+
assert_equal '555-4321', person2.phone[0].number
|
38
|
+
assert_equal TutorialExt::Person::PhoneType::HOME, person2.phone[0].type
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'protobuf/message/message'
|
2
|
+
require 'test/addressbook'
|
3
|
+
require 'test/merge'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
class MessageTest < Test::Unit::TestCase
|
7
|
+
def test_equality
|
8
|
+
person1 = Tutorial::Person.new :name => 'ando'
|
9
|
+
person2 = Tutorial::Person.new :name => 'ando'
|
10
|
+
person3 = Tutorial::Person.new :name => 'Ando'
|
11
|
+
assert person1 == person2
|
12
|
+
assert person1 != person3
|
13
|
+
assert person1 != 'ando'
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_bracketed_access
|
17
|
+
person = Tutorial::Person.new
|
18
|
+
name_tag = 1
|
19
|
+
person[name_tag] = 'Ichiro'
|
20
|
+
assert_equal 'Ichiro', person.name
|
21
|
+
assert_equal 'Ichiro', person[name_tag]
|
22
|
+
|
23
|
+
person[:id] = 100
|
24
|
+
assert_equal 100, person.id
|
25
|
+
person['id'] = 200
|
26
|
+
assert_equal 200, person.id
|
27
|
+
assert_equal 200, person[:id]
|
28
|
+
assert_equal 200, person['id']
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_initialize_with_hash
|
32
|
+
person = Tutorial::Person.new :name => 'Jiro', :id => 300, :email => 'jiro@ema.il'
|
33
|
+
assert_equal 'Jiro', person.name
|
34
|
+
assert_equal 300, person.id
|
35
|
+
assert_equal 'jiro@ema.il', person.email
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_defined_filenames
|
39
|
+
assert Tutorial::Person.defined_filenames
|
40
|
+
assert_equal 1, Tutorial::Person.defined_filenames.size
|
41
|
+
assert Tutorial::Person.defined_filenames.first =~ %r{/.*/test/addressbook\.rb}
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_proto_filenames
|
45
|
+
assert Tutorial::Person.proto_filenames
|
46
|
+
assert_equal 1, Tutorial::Person.proto_filenames.size
|
47
|
+
assert_equal 'test/addressbook.proto', Tutorial::Person.proto_filenames.first
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_proto_contents
|
51
|
+
assert_equal <<-eos.strip, Tutorial::Person.proto_contents.values.first.strip
|
52
|
+
package tutorial;
|
53
|
+
|
54
|
+
message Person {
|
55
|
+
required string name = 1;
|
56
|
+
required int32 id = 2;
|
57
|
+
optional string email = 3;
|
58
|
+
|
59
|
+
enum PhoneType {
|
60
|
+
MOBILE = 0;
|
61
|
+
HOME = 1;
|
62
|
+
WORK = 2;
|
63
|
+
}
|
64
|
+
|
65
|
+
message PhoneNumber {
|
66
|
+
required string number = 1;
|
67
|
+
optional PhoneType type = 2 [default = HOME];
|
68
|
+
}
|
69
|
+
|
70
|
+
repeated PhoneNumber phone = 4;
|
71
|
+
|
72
|
+
extensions 100 to 200;
|
73
|
+
}
|
74
|
+
|
75
|
+
extend Person {
|
76
|
+
optional int32 age = 100;
|
77
|
+
}
|
78
|
+
|
79
|
+
message AddressBook {
|
80
|
+
repeated Person person = 1;
|
81
|
+
}
|
82
|
+
eos
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_merge_field
|
86
|
+
inner_message1_2 = Test::MergeMessage::InnerMessage2.new(:name => 'name12')
|
87
|
+
inner_message1_2.repeate_message << Test::MergeMessage::InnerMessage1.new(:name => 'name121')
|
88
|
+
message1 = Test::MergeMessage.new :name => 'name1', :require_message => inner_message1_2
|
89
|
+
message1.repeate_message << Test::MergeMessage::InnerMessage1.new(:name => 'name11')
|
90
|
+
|
91
|
+
inner_message2_2 = Test::MergeMessage::InnerMessage2.new(:name => 'name22')
|
92
|
+
inner_message2_2.repeate_message << Test::MergeMessage::InnerMessage1.new(:name => 'name221')
|
93
|
+
message2 = Test::MergeMessage.new :name => 'name2', :require_message => inner_message2_2
|
94
|
+
message2.repeate_message << Test::MergeMessage::InnerMessage1.new(:name => 'name21')
|
95
|
+
|
96
|
+
message1.merge_from message2
|
97
|
+
assert_equal 'name2', message1.name
|
98
|
+
assert_equal 2, message1.repeate_message.size
|
99
|
+
assert_equal 'name11', message1.repeate_message[0].name
|
100
|
+
assert_equal 'name21', message1.repeate_message[1].name
|
101
|
+
assert_equal 'name22', message1.require_message.name
|
102
|
+
assert_equal 2, message1.require_message.repeate_message.size
|
103
|
+
assert_equal 'name121', message1.require_message.repeate_message[0].name
|
104
|
+
assert_equal 'name221', message1.require_message.repeate_message[1].name
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/optional_field'
|
3
|
+
|
4
|
+
class OptionalFieldTest < Test::Unit::TestCase
|
5
|
+
def test_accessor
|
6
|
+
message = Test::Optional_field::Message.new
|
7
|
+
|
8
|
+
# default values
|
9
|
+
assert !message.has_field?(:number)
|
10
|
+
assert_equal 20, message.number
|
11
|
+
|
12
|
+
assert !message.has_field?(:text)
|
13
|
+
assert_equal 'default string', message.text
|
14
|
+
|
15
|
+
assert !message.has_field?(:enum)
|
16
|
+
assert_equal 2, message.enum
|
17
|
+
|
18
|
+
# assign values
|
19
|
+
assert_nothing_raised { message.number = 100 }
|
20
|
+
assert message.has_field?(:number)
|
21
|
+
assert_equal 100, message.number
|
22
|
+
|
23
|
+
assert_nothing_raised { message.text = 'abc' }
|
24
|
+
assert message.has_field?(:text)
|
25
|
+
assert_equal 'abc', message.text
|
26
|
+
|
27
|
+
assert_nothing_raised { message.enum = Test::Optional_field::Message::Enum::A }
|
28
|
+
assert message.has_field?(:enum)
|
29
|
+
assert_equal 1, message.enum
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_serialize
|
33
|
+
message1 = Test::Optional_field::Message.new
|
34
|
+
message2 = Test::Optional_field::Message.new
|
35
|
+
|
36
|
+
# all fields are empty
|
37
|
+
serialized_string = message1.to_s
|
38
|
+
assert serialized_string.empty?
|
39
|
+
message2.parse_from_string(serialized_string)
|
40
|
+
assert_equal message1.number, message2.number
|
41
|
+
assert_equal message1.text, message2.text
|
42
|
+
assert_equal message1.enum, message2.enum
|
43
|
+
assert !message2.has_field?(:number)
|
44
|
+
assert !message2.has_field?(:text)
|
45
|
+
assert !message2.has_field?(:enum)
|
46
|
+
|
47
|
+
# assign the value whith is equal to default value
|
48
|
+
message1 = Test::Optional_field::Message.new
|
49
|
+
message1.number = message1.number
|
50
|
+
message1.text = message1.text
|
51
|
+
message1.enum = message1.enum
|
52
|
+
serialized_string = message1.to_s
|
53
|
+
assert !serialized_string.empty?
|
54
|
+
|
55
|
+
# set some fields
|
56
|
+
message1 = Test::Optional_field::Message.new
|
57
|
+
message1.number = 100
|
58
|
+
message1.text = 'new text'
|
59
|
+
serialized_string = message1.to_s
|
60
|
+
message2.parse_from_string(serialized_string)
|
61
|
+
assert_equal message1.number, message2.number
|
62
|
+
assert_equal message1.text, message2.text
|
63
|
+
assert_equal message1.enum, message2.enum
|
64
|
+
assert message2.has_field?(:number)
|
65
|
+
assert message2.has_field?(:text)
|
66
|
+
assert !message2.has_field?(:enum)
|
67
|
+
end
|
68
|
+
end
|
data/test/test_parse.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/addressbook'
|
3
|
+
|
4
|
+
class ParseTest < Test::Unit::TestCase
|
5
|
+
def test_parse
|
6
|
+
person = Tutorial::Person.new
|
7
|
+
person.parse_from_file 'test/data/data.bin'
|
8
|
+
assert_equal 1234, person.id
|
9
|
+
assert_equal 'John Doe', person.name
|
10
|
+
assert_equal 'jdoe@example.com', person.email
|
11
|
+
assert_equal 1, person.phone.size
|
12
|
+
assert_equal '555-4321', person.phone[0].number
|
13
|
+
assert_equal Tutorial::Person::PhoneType::HOME, person.phone[0].type
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'test/unit'
|
3
|
+
require 'test/addressbook'
|
4
|
+
|
5
|
+
class SerializeTest < Test::Unit::TestCase
|
6
|
+
def test_serialize
|
7
|
+
# serialize to string
|
8
|
+
person = Tutorial::Person.new
|
9
|
+
person.id = 1234
|
10
|
+
person.name = 'John Doe'
|
11
|
+
person.email = 'jdoe@example.com'
|
12
|
+
phone = Tutorial::Person::PhoneNumber.new
|
13
|
+
phone.number = '555-4321'
|
14
|
+
phone.type = Tutorial::Person::PhoneType::HOME
|
15
|
+
person.phone << phone
|
16
|
+
serialized_string = person.serialize_to_string
|
17
|
+
|
18
|
+
# parse the serialized string
|
19
|
+
person2 = Tutorial::Person.new
|
20
|
+
person2.parse_from_string serialized_string
|
21
|
+
assert_equal 1234, person2.id
|
22
|
+
assert_equal 'John Doe', person2.name
|
23
|
+
assert_equal 'jdoe@example.com', person2.email
|
24
|
+
assert_equal 1, person2.phone.size
|
25
|
+
assert_equal '555-4321', person2.phone[0].number
|
26
|
+
assert_equal Tutorial::Person::PhoneType::HOME, person2.phone[0].type
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_serialize_utf8string
|
30
|
+
# serialize to string
|
31
|
+
person = Tutorial::Person.new
|
32
|
+
person.id = 1234
|
33
|
+
person.name = '山田 太郎' # kanji characters
|
34
|
+
serialized_string = person.serialize_to_string
|
35
|
+
|
36
|
+
# parse the serialized string
|
37
|
+
person2 = Tutorial::Person.new
|
38
|
+
person2.parse_from_string serialized_string
|
39
|
+
assert_equal 1234, person2.id
|
40
|
+
assert_equal '山田 太郎', person2.name
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'protobuf/message/message'
|
3
|
+
require 'protobuf/message/enum'
|
4
|
+
require 'test/addressbook'
|
5
|
+
|
6
|
+
class StandardMessageTest < Test::Unit::TestCase
|
7
|
+
def test_initialized
|
8
|
+
person = Tutorial::Person.new
|
9
|
+
assert !person.initialized?
|
10
|
+
person.name = 'name'
|
11
|
+
assert !person.initialized?
|
12
|
+
person.id = 12
|
13
|
+
assert person.initialized?
|
14
|
+
|
15
|
+
# repeated field
|
16
|
+
person.phone << Tutorial::Person::PhoneNumber.new
|
17
|
+
assert !person.initialized?
|
18
|
+
person.phone.last.number = '123-456'
|
19
|
+
assert person.initialized?
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_clear
|
23
|
+
person = Tutorial::Person.new
|
24
|
+
person.name = 'name'
|
25
|
+
person.id = 1234
|
26
|
+
person.email = 'abc@cde.fgh'
|
27
|
+
person.phone << Tutorial::Person::PhoneNumber.new
|
28
|
+
person.clear!
|
29
|
+
|
30
|
+
assert_nil person.name
|
31
|
+
assert_nil person.id
|
32
|
+
assert_equal '', person.email
|
33
|
+
assert_equal 0, person.phone.size
|
34
|
+
|
35
|
+
assert !person.has_field?(:name)
|
36
|
+
assert !person.has_field?(:id)
|
37
|
+
assert !person.has_field?(:email)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_dup
|
41
|
+
person = Tutorial::Person.new
|
42
|
+
person.name = 'name'
|
43
|
+
person.id = 1234
|
44
|
+
person.email = 'abc@cde.fgh'
|
45
|
+
person.phone << Tutorial::Person::PhoneNumber.new
|
46
|
+
person.phone.last.number = '123-456'
|
47
|
+
person.phone.last.type = Tutorial::Person::PhoneType::MOBILE
|
48
|
+
person.phone << Tutorial::Person::PhoneNumber.new
|
49
|
+
person.phone.last.number = '456-123'
|
50
|
+
person.phone.last.type = Tutorial::Person::PhoneType::WORK
|
51
|
+
|
52
|
+
person2 = person.dup
|
53
|
+
assert person == person2
|
54
|
+
assert !person.eql?(person2)
|
55
|
+
assert_equal person.name, person2.name
|
56
|
+
assert_equal person.id, person2.id
|
57
|
+
assert_equal person.email, person2.email
|
58
|
+
assert_equal person.phone.size, person2.phone.size
|
59
|
+
assert person.phone.first == person2.phone.first
|
60
|
+
assert !person.phone.first.eql?(person2.phone.first)
|
61
|
+
assert_equal person.phone.first.number, person2.phone.first.number
|
62
|
+
assert_equal person.phone.first.type, person2.phone.first.type
|
63
|
+
assert person.phone.last == person2.phone.last
|
64
|
+
assert !person.phone.last.eql?(person2.phone.last)
|
65
|
+
assert_equal person.phone.last.number, person2.phone.last.number
|
66
|
+
assert_equal person.phone.last.type, person2.phone.last.type
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_inspect
|
70
|
+
person = Tutorial::Person.new
|
71
|
+
person.name = 'name'
|
72
|
+
person.id = 1234
|
73
|
+
person.email = 'abc@cde.fgh'
|
74
|
+
person.phone << Tutorial::Person::PhoneNumber.new
|
75
|
+
person.phone.last.number = '123-456'
|
76
|
+
person.phone.last.type = Tutorial::Person::PhoneType::MOBILE
|
77
|
+
person.phone << Tutorial::Person::PhoneNumber.new
|
78
|
+
person.phone.last.number = '456-123'
|
79
|
+
person.phone.last.type = Tutorial::Person::PhoneType::WORK
|
80
|
+
|
81
|
+
assert_equal <<-eos, person.inspect
|
82
|
+
name: "name"
|
83
|
+
id: 1234
|
84
|
+
email: "abc@cde.fgh"
|
85
|
+
phone {
|
86
|
+
number: "123-456"
|
87
|
+
type: MOBILE
|
88
|
+
}
|
89
|
+
phone {
|
90
|
+
number: "456-123"
|
91
|
+
type: WORK
|
92
|
+
}
|
93
|
+
eos
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
data/test/test_types.rb
ADDED
@@ -0,0 +1,181 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/types'
|
3
|
+
|
4
|
+
class TypesTest < Test::Unit::TestCase
|
5
|
+
def test_serialize
|
6
|
+
types = Test::Types::TestTypes.new
|
7
|
+
types.type1 = 0.01
|
8
|
+
types.type2 = 0.1
|
9
|
+
types.type3 = 1
|
10
|
+
types.type4 = 10
|
11
|
+
types.type5 = 100
|
12
|
+
types.type6 = 1000
|
13
|
+
types.type7 = -1
|
14
|
+
types.type8 = -10
|
15
|
+
types.type9 = 10000
|
16
|
+
types.type10 = 100000
|
17
|
+
types.type11 = false
|
18
|
+
types.type12 = 'hello all types'
|
19
|
+
image_bin = File.open('test/data/unk.png', 'r+b'){|f| f.read}
|
20
|
+
types.type13 = image_bin
|
21
|
+
|
22
|
+
serialized_string = types.serialize_to_string
|
23
|
+
|
24
|
+
types2 = Test::Types::TestTypes.new
|
25
|
+
types2.parse_from_string serialized_string
|
26
|
+
assert_in_delta 0.01, types2.type1, 0.00001
|
27
|
+
assert_in_delta 0.1, types2.type2, 0.00001
|
28
|
+
assert_equal 1, types2.type3
|
29
|
+
assert_equal 10, types2.type4
|
30
|
+
assert_equal 100, types2.type5
|
31
|
+
assert_equal 1000, types2.type6
|
32
|
+
assert_equal(-1, types2.type7)
|
33
|
+
assert_equal(-10, types2.type8)
|
34
|
+
assert_equal 10000, types2.type9
|
35
|
+
assert_equal 100000, types2.type10
|
36
|
+
assert !types2.type11
|
37
|
+
assert_equal 'hello all types', types2.type12
|
38
|
+
assert_equal 10938, types2.type13.size
|
39
|
+
assert_equal image_bin, types2.type13
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_parse
|
43
|
+
types = Test::Types::TestTypes.new
|
44
|
+
types.parse_from_file 'test/data/types.bin'
|
45
|
+
assert_in_delta 0.01, types.type1, 0.00001
|
46
|
+
assert_in_delta 0.1, types.type2, 0.00001
|
47
|
+
assert_equal 1, types.type3
|
48
|
+
assert_equal 10, types.type4
|
49
|
+
assert_equal 100, types.type5
|
50
|
+
assert_equal 1000, types.type6
|
51
|
+
assert_equal(-1, types.type7)
|
52
|
+
assert_equal(-10, types.type8)
|
53
|
+
assert_equal 10000, types.type9
|
54
|
+
assert_equal 100000, types.type10
|
55
|
+
assert_equal false, !!types.type11
|
56
|
+
assert_equal 'hello all types', types.type12
|
57
|
+
assert_equal File.open('test/data/unk.png', 'r+b'){|f| f.read}, types.type13
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_double
|
61
|
+
# double fixed 64-bit
|
62
|
+
types = Test::Types::TestTypes.new
|
63
|
+
assert_nothing_raised do types.type1 = 1 end
|
64
|
+
assert_nothing_raised do types.type1 = 1.0 end
|
65
|
+
assert_raise TypeError do types.type1 = '' end
|
66
|
+
assert_nothing_raised do types.type1 = Protobuf::Field::DoubleField.max end
|
67
|
+
assert_raise RangeError do types.type1 = Protobuf::Field::DoubleField.max * 2 end
|
68
|
+
assert_nothing_raised do types.type1 = Protobuf::Field::DoubleField.min end
|
69
|
+
assert_raise RangeError do types.type1 = Protobuf::Field::DoubleField.min * 2 end
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_float
|
73
|
+
# float fixed 32-bit
|
74
|
+
types = Test::Types::TestTypes.new
|
75
|
+
assert_nothing_raised do types.type2 = 1 end
|
76
|
+
assert_nothing_raised do types.type2 = 1.0 end
|
77
|
+
assert_raise TypeError do types.type2 = '' end
|
78
|
+
assert_nothing_raised do types.type2 = Protobuf::Field::FloatField.max end
|
79
|
+
assert_raise RangeError do types.type2 = Protobuf::Field::FloatField.max * 2 end
|
80
|
+
assert_nothing_raised do types.type2 = Protobuf::Field::FloatField.min end
|
81
|
+
assert_raise RangeError do types.type2 = Protobuf::Field::FloatField.min * 2 end
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_int32
|
85
|
+
types = Test::Types::TestTypes.new
|
86
|
+
assert_nothing_raised do types.type3 = 1 end
|
87
|
+
assert_nothing_raised do types.type3 = -1 end
|
88
|
+
assert_raise TypeError do types.type3 = 1.0 end
|
89
|
+
assert_raise TypeError do types.type3 = '' end
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_int64
|
93
|
+
types = Test::Types::TestTypes.new
|
94
|
+
assert_nothing_raised do types.type4 = 1 end
|
95
|
+
assert_nothing_raised do types.type4 = -1 end
|
96
|
+
assert_raise TypeError do types.type4 = 1.0 end
|
97
|
+
assert_raise TypeError do types.type4 = '' end
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_uint32
|
101
|
+
types = Test::Types::TestTypes.new
|
102
|
+
assert_nothing_raised do types.type5 = 1 end
|
103
|
+
assert_raise RangeError do types.type5 = -1 end
|
104
|
+
assert_raise TypeError do types.type5 = 1.0 end
|
105
|
+
assert_raise TypeError do types.type5 = '' end
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_uint64
|
109
|
+
types = Test::Types::TestTypes.new
|
110
|
+
assert_nothing_raised do types.type6 = 1 end
|
111
|
+
assert_raise RangeError do types.type6 = -1 end
|
112
|
+
assert_raise TypeError do types.type6 = 1.0 end
|
113
|
+
assert_raise TypeError do types.type6 = '' end
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_sint32
|
117
|
+
types = Test::Types::TestTypes.new
|
118
|
+
assert_nothing_raised do types.type7 = 1 end
|
119
|
+
assert_nothing_raised do types.type7 = -1 end
|
120
|
+
assert_raise TypeError do types.type7 = 1.0 end
|
121
|
+
assert_raise TypeError do types.type7 = '' end
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_sint64
|
125
|
+
types = Test::Types::TestTypes.new
|
126
|
+
assert_nothing_raised do types.type8 = 1 end
|
127
|
+
assert_nothing_raised do types.type8 = -1 end
|
128
|
+
assert_raise TypeError do types.type8 = 1.0 end
|
129
|
+
assert_raise TypeError do types.type8 = '' end
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_fixed32
|
133
|
+
types = Test::Types::TestTypes.new
|
134
|
+
assert_nothing_raised do types.type9 = 1 end
|
135
|
+
assert_raise TypeError do types.type9 = 1.0 end
|
136
|
+
assert_raise TypeError do types.type9 = '' end
|
137
|
+
assert_nothing_raised do types.type9 = Protobuf::Field::Fixed32Field.max end
|
138
|
+
assert_raise RangeError do types.type9 = Protobuf::Field::Fixed32Field.max + 1 end
|
139
|
+
assert_nothing_raised do types.type9 = Protobuf::Field::Fixed32Field.min end
|
140
|
+
assert_raise RangeError do types.type9 = Protobuf::Field::Fixed32Field.min - 1 end
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_fixed64
|
144
|
+
types = Test::Types::TestTypes.new
|
145
|
+
assert_nothing_raised do types.type10 = 1 end
|
146
|
+
assert_raise TypeError do types.type10 = 1.0 end
|
147
|
+
assert_raise TypeError do types.type10 = '' end
|
148
|
+
assert_nothing_raised do types.type10 = Protobuf::Field::Fixed64Field.max end
|
149
|
+
assert_raise RangeError do types.type10 = Protobuf::Field::Fixed64Field.max + 1 end
|
150
|
+
assert_nothing_raised do types.type10 = Protobuf::Field::Fixed64Field.min end
|
151
|
+
assert_raise RangeError do types.type10 = Protobuf::Field::Fixed64Field.min - 1 end
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_bool
|
155
|
+
types = Test::Types::TestTypes.new
|
156
|
+
assert_nothing_raised do types.type11 = true end
|
157
|
+
assert_nothing_raised do types.type11 = false end
|
158
|
+
assert_nothing_raised do types.type11 = nil end
|
159
|
+
assert_raise TypeError do types.type11 = 0 end
|
160
|
+
assert_raise TypeError do types.type11 = '' end
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_string
|
164
|
+
types = Test::Types::TestTypes.new
|
165
|
+
assert_nothing_raised do types.type12 = '' end
|
166
|
+
assert_nothing_raised do types.type12 = 'hello' end
|
167
|
+
assert_nothing_raised do types.type12 = nil end
|
168
|
+
assert_raise TypeError do types.type12 = 0 end
|
169
|
+
assert_raise TypeError do types.type12 = true end
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_bytes
|
173
|
+
types = Test::Types::TestTypes.new
|
174
|
+
assert_nothing_raised do types.type13 = '' end
|
175
|
+
assert_nothing_raised do types.type13 = 'hello' end
|
176
|
+
assert_nothing_raised do types.type13 = nil end
|
177
|
+
assert_raise TypeError do types.type13 = 0 end
|
178
|
+
assert_raise TypeError do types.type13 = true end
|
179
|
+
assert_raise TypeError do types.type13 = [] end
|
180
|
+
end
|
181
|
+
end
|