macks-ruby_protobuf 0.3.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|