macks-ruby_protobuf 0.3.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/History.txt +14 -0
  2. data/Manifest.txt +74 -0
  3. data/README.txt +58 -0
  4. data/Rakefile +18 -0
  5. data/bin/mk_parser +2 -0
  6. data/bin/rprotoc +36 -0
  7. data/examples/addressbook.pb.rb +56 -0
  8. data/examples/addressbook.proto +24 -0
  9. data/examples/reading_a_message.rb +32 -0
  10. data/examples/writing_a_message.rb +46 -0
  11. data/lib/protobuf/common/wire_type.rb +10 -0
  12. data/lib/protobuf/compiler/compiler.rb +54 -0
  13. data/lib/protobuf/compiler/nodes.rb +319 -0
  14. data/lib/protobuf/compiler/proto.y +203 -0
  15. data/lib/protobuf/compiler/proto2.ebnf +79 -0
  16. data/lib/protobuf/compiler/proto_parser.rb +1394 -0
  17. data/lib/protobuf/compiler/template/rpc_bin.erb +4 -0
  18. data/lib/protobuf/compiler/template/rpc_client.erb +18 -0
  19. data/lib/protobuf/compiler/template/rpc_service.erb +25 -0
  20. data/lib/protobuf/compiler/visitors.rb +288 -0
  21. data/lib/protobuf/descriptor/descriptor.proto +286 -0
  22. data/lib/protobuf/descriptor/descriptor.rb +54 -0
  23. data/lib/protobuf/descriptor/descriptor_builder.rb +144 -0
  24. data/lib/protobuf/descriptor/descriptor_proto.rb +119 -0
  25. data/lib/protobuf/descriptor/enum_descriptor.rb +33 -0
  26. data/lib/protobuf/descriptor/field_descriptor.rb +50 -0
  27. data/lib/protobuf/descriptor/file_descriptor.rb +38 -0
  28. data/lib/protobuf/message/decoder.rb +93 -0
  29. data/lib/protobuf/message/encoder.rb +37 -0
  30. data/lib/protobuf/message/enum.rb +28 -0
  31. data/lib/protobuf/message/extend.rb +8 -0
  32. data/lib/protobuf/message/field.rb +654 -0
  33. data/lib/protobuf/message/message.rb +308 -0
  34. data/lib/protobuf/message/protoable.rb +37 -0
  35. data/lib/protobuf/message/service.rb +9 -0
  36. data/lib/protobuf/rpc/client.rb +19 -0
  37. data/lib/protobuf/rpc/handler.rb +17 -0
  38. data/lib/protobuf/rpc/server.rb +39 -0
  39. data/lib/ruby_protobuf.rb +3 -0
  40. data/test/addressbook.rb +98 -0
  41. data/test/addressbook_base.rb +62 -0
  42. data/test/addressbook_ext.rb +12 -0
  43. data/test/check_unbuild.rb +30 -0
  44. data/test/collision.rb +18 -0
  45. data/test/data/data.bin +3 -0
  46. data/test/data/data_source.py +14 -0
  47. data/test/data/types.bin +0 -0
  48. data/test/data/types_source.py +22 -0
  49. data/test/data/unk.png +0 -0
  50. data/test/ext_collision.rb +25 -0
  51. data/test/ext_range.rb +23 -0
  52. data/test/merge.rb +40 -0
  53. data/test/nested.rb +25 -0
  54. data/test/proto/addressbook.proto +31 -0
  55. data/test/proto/addressbook_base.proto +26 -0
  56. data/test/proto/addressbook_ext.proto +6 -0
  57. data/test/proto/collision.proto +5 -0
  58. data/test/proto/ext_collision.proto +8 -0
  59. data/test/proto/ext_range.proto +7 -0
  60. data/test/proto/merge.proto +15 -0
  61. data/test/proto/nested.proto +7 -0
  62. data/test/proto/rpc.proto +6 -0
  63. data/test/proto/types.proto +17 -0
  64. data/test/test_addressbook.rb +43 -0
  65. data/test/test_compiler.rb +313 -0
  66. data/test/test_descriptor.rb +122 -0
  67. data/test/test_extension.rb +40 -0
  68. data/test/test_message.rb +106 -0
  69. data/test/test_optional_field.rb +68 -0
  70. data/test/test_parse.rb +15 -0
  71. data/test/test_ruby_protobuf.rb +1 -0
  72. data/test/test_serialize.rb +42 -0
  73. data/test/test_standard_message.rb +96 -0
  74. data/test/test_types.rb +181 -0
  75. data/test/types.rb +22 -0
  76. metadata +150 -0
@@ -0,0 +1,22 @@
1
+ import types_pb2
2
+ import sys
3
+
4
+ types = types_pb2.TestTypes()
5
+ types.type1 = 0.01
6
+ types.type2 = 0.1
7
+ types.type3 = 1
8
+ types.type4 = 10
9
+ types.type5 = 100
10
+ types.type6 = 1000
11
+ types.type7 = -1
12
+ types.type8 = -10
13
+ types.type9 = 10000
14
+ types.type10 = 100000
15
+ types.type11 = False
16
+ types.type12 = 'hello all types'
17
+ # TODO test type13
18
+ #types.type13 =
19
+
20
+ f = open('types.bin', 'wb')
21
+ f.write(types.SerializeToString())
22
+ f.close()
data/test/data/unk.png ADDED
Binary file
@@ -0,0 +1,25 @@
1
+ ### Generated by rprotoc. DO NOT EDIT!
2
+ ### <proto file: test/proto/ext_collision.proto>
3
+ # message ExtCollisionTest {
4
+ # extensions 1 to 10;
5
+ # }
6
+ #
7
+ # message ExtCollisionTest {
8
+ # optional string a = 1;
9
+ # optional string b = 1;
10
+ # }
11
+
12
+ require 'protobuf/message/message'
13
+ require 'protobuf/message/enum'
14
+ require 'protobuf/message/service'
15
+ require 'protobuf/message/extend'
16
+
17
+ class ExtCollisionTest < ::Protobuf::Message
18
+ defined_in __FILE__
19
+ extensions 1..10
20
+ end
21
+ class ExtCollisionTest < ::Protobuf::Message
22
+ defined_in __FILE__
23
+ optional :string, :a, 1
24
+ optional :string, :b, 1
25
+ end
data/test/ext_range.rb ADDED
@@ -0,0 +1,23 @@
1
+ ### Generated by rprotoc. DO NOT EDIT!
2
+ ### <proto file: test/proto/ext_range.proto>
3
+ # message ExtCollisionTest {
4
+ # extensions 1 to 10;
5
+ # }
6
+ #
7
+ # message ExtCollisionTest {
8
+ # optional string a = 11;
9
+ # }
10
+
11
+ require 'protobuf/message/message'
12
+ require 'protobuf/message/enum'
13
+ require 'protobuf/message/service'
14
+ require 'protobuf/message/extend'
15
+
16
+ class ExtCollisionTest < ::Protobuf::Message
17
+ defined_in __FILE__
18
+ extensions 1..10
19
+ end
20
+ class ExtCollisionTest < ::Protobuf::Message
21
+ defined_in __FILE__
22
+ optional :string, :a, 11, :extension => true
23
+ end
data/test/merge.rb ADDED
@@ -0,0 +1,40 @@
1
+ ### Generated by rprotoc. DO NOT EDIT!
2
+ ### <proto file: test/merge.proto>
3
+ # package test;
4
+ #
5
+ # message MergeMessage {
6
+ # message InnerMessage1 {
7
+ # required string name = 1;
8
+ # }
9
+ # message InnerMessage2 {
10
+ # required string name = 1;
11
+ # repeated InnerMessage1 repeate_message = 2;
12
+ # }
13
+ #
14
+ # required string name = 1;
15
+ # repeated InnerMessage1 repeate_message = 2;
16
+ # required InnerMessage2 require_message = 3;
17
+ # }
18
+
19
+ require 'protobuf/message/message'
20
+ require 'protobuf/message/enum'
21
+ require 'protobuf/message/service'
22
+ require 'protobuf/message/extend'
23
+
24
+ module Test
25
+ class MergeMessage < ::Protobuf::Message
26
+ defined_in __FILE__
27
+ class InnerMessage1 < ::Protobuf::Message
28
+ defined_in __FILE__
29
+ required :string, :name, 1
30
+ end
31
+ class InnerMessage2 < ::Protobuf::Message
32
+ defined_in __FILE__
33
+ required :string, :name, 1
34
+ repeated :InnerMessage1, :repeate_message, 2
35
+ end
36
+ required :string, :name, 1
37
+ repeated :InnerMessage1, :repeate_message, 2
38
+ required :InnerMessage2, :require_message, 3
39
+ end
40
+ end
data/test/nested.rb ADDED
@@ -0,0 +1,25 @@
1
+ ### Generated by rprotoc. DO NOT EDIT!
2
+ ### <proto file: test/nested.proto>
3
+ # message Foo {
4
+ # message Bar {
5
+ # }
6
+ # }
7
+ # message Baaz {
8
+ # optional Foo.Bar x = 1;
9
+ # }
10
+
11
+ require 'protobuf/message/message'
12
+ require 'protobuf/message/enum'
13
+ require 'protobuf/message/service'
14
+ require 'protobuf/message/extend'
15
+
16
+ class Foo < ::Protobuf::Message
17
+ defined_in __FILE__
18
+ class Bar < ::Protobuf::Message
19
+ defined_in __FILE__
20
+ end
21
+ end
22
+ class Baaz < ::Protobuf::Message
23
+ defined_in __FILE__
24
+ optional :'Foo::Bar', :x, 1
25
+ end
@@ -0,0 +1,31 @@
1
+ package tutorial;
2
+
3
+ message Person {
4
+ required string name = 1;
5
+ required int32 id = 2;
6
+ optional string email = 3;
7
+
8
+ enum PhoneType {
9
+ MOBILE = 0;
10
+ HOME = 1;
11
+ WORK = 2;
12
+ }
13
+
14
+ message PhoneNumber {
15
+ required string number = 1;
16
+ optional PhoneType type = 2 [default = HOME];
17
+ }
18
+
19
+ repeated PhoneNumber phone = 4;
20
+ optional uint32 age = 5 [default = 20];
21
+
22
+ extensions 100 to 200;
23
+ }
24
+
25
+ extend Person {
26
+ optional int32 age = 100;
27
+ }
28
+
29
+ message AddressBook {
30
+ repeated Person person = 1;
31
+ }
@@ -0,0 +1,26 @@
1
+ package tutorial;
2
+
3
+ message Person {
4
+ required string name = 1;
5
+ required int32 id = 2;
6
+ optional string email = 3;
7
+
8
+ enum PhoneType {
9
+ MOBILE = 0;
10
+ HOME = 1;
11
+ WORK = 2;
12
+ }
13
+
14
+ message PhoneNumber {
15
+ required string number = 1;
16
+ optional PhoneType type = 2 [default = HOME];
17
+ }
18
+
19
+ repeated PhoneNumber phone = 4;
20
+
21
+ extensions 100 to 200;
22
+ }
23
+
24
+ message AddressBook {
25
+ repeated Person person = 1;
26
+ }
@@ -0,0 +1,6 @@
1
+ import "test/addressbook_base.proto";
2
+ package tutorial;
3
+
4
+ extend Person {
5
+ optional int32 age = 100;
6
+ }
@@ -0,0 +1,5 @@
1
+ message CollisionTest {
2
+ optional string a = 1;
3
+ optional string b = 1;
4
+ }
5
+
@@ -0,0 +1,8 @@
1
+ message ExtCollisionTest {
2
+ extensions 1 to 10;
3
+ }
4
+
5
+ message ExtCollisionTest {
6
+ optional string a = 1;
7
+ optional string b = 1;
8
+ }
@@ -0,0 +1,7 @@
1
+ message ExtCollisionTest {
2
+ extensions 1 to 10;
3
+ }
4
+
5
+ extend ExtCollisionTest {
6
+ optional string a = 11;
7
+ }
@@ -0,0 +1,15 @@
1
+ package test;
2
+
3
+ message MergeMessage {
4
+ message InnerMessage1 {
5
+ required string name = 1;
6
+ }
7
+ message InnerMessage2 {
8
+ required string name = 1;
9
+ repeated InnerMessage1 repeate_message = 2;
10
+ }
11
+
12
+ required string name = 1;
13
+ repeated InnerMessage1 repeate_message = 2;
14
+ required InnerMessage2 require_message = 3;
15
+ }
@@ -0,0 +1,7 @@
1
+ message Foo {
2
+ message Bar {
3
+ }
4
+ }
5
+ message Baaz {
6
+ optional Foo.Bar x = 1;
7
+ }
@@ -0,0 +1,6 @@
1
+ package tutorial;
2
+
3
+ service AddressBookService {
4
+ rpc Search (Person) returns (AddressBook);
5
+ rpc Add (Person) returns (Person);
6
+ }
@@ -0,0 +1,17 @@
1
+ package test.types;
2
+
3
+ message TestTypes {
4
+ required double type1 = 1;
5
+ required float type2 = 2;
6
+ required int32 type3 = 3;
7
+ required int64 type4 = 4;
8
+ required uint32 type5 = 5;
9
+ required uint64 type6 = 6;
10
+ required sint32 type7 = 7;
11
+ required sint64 type8 = 8;
12
+ required fixed32 type9 = 9;
13
+ required fixed64 type10 = 10;
14
+ required bool type11 = 11;
15
+ required string type12 = 12;
16
+ required bytes type13 = 13;
17
+ }
@@ -0,0 +1,43 @@
1
+ require 'test/unit'
2
+ require 'protobuf/message/message'
3
+ require 'protobuf/message/enum'
4
+ require 'test/addressbook'
5
+
6
+ class AddressbookTest < Test::Unit::TestCase
7
+ def test_enum
8
+ phone_number = Tutorial::Person::PhoneNumber.new
9
+ assert_equal Tutorial::Person::PhoneType::HOME, phone_number.type
10
+ phone_number.type = Tutorial::Person::PhoneType::MOBILE
11
+ assert_equal 0, phone_number.type
12
+ phone_number.type = Tutorial::Person::PhoneType::HOME
13
+ assert_equal 1, phone_number.type
14
+ phone_number.type = Tutorial::Person::PhoneType::WORK
15
+ assert_equal 2, phone_number.type
16
+ assert_raise TypeError do
17
+ phone_number.type = 3
18
+ end
19
+ end
20
+
21
+ def test_initial_value
22
+ person = Tutorial::Person.new
23
+ assert_nil person.name
24
+ assert_nil person.id
25
+ assert_equal [], person.phone
26
+ assert_equal '', person.email
27
+ end
28
+
29
+ def test_repeatable
30
+ address_book = Tutorial::AddressBook.new
31
+ assert_equal [], address_book.person
32
+ assert_instance_of Protobuf::Field::FieldArray, address_book.person
33
+ address_book.person << Tutorial::Person.new
34
+ assert_equal 1, address_book.person.size
35
+ assert_raise TypeError do
36
+ address_book.person << 1
37
+ end
38
+ assert_equal 1, address_book.person.size
39
+ address_book.person << Tutorial::Person.new
40
+ assert_equal 2, address_book.person.size
41
+ end
42
+ end
43
+
@@ -0,0 +1,313 @@
1
+ require 'test/unit'
2
+ #require 'protobuf/compiler/compiler_old'
3
+ require 'protobuf/compiler/compiler'
4
+
5
+ class CompilerTest < Test::Unit::TestCase
6
+ # Issue 12: Parse error on float default value
7
+ def test_compile_float_default
8
+ assert_compile_proto <<-eos, 'test/proto/float_default.proto'
9
+ ### Generated by rprotoc. DO NOT EDIT!
10
+ ### <proto file: test/proto/float_default.proto>
11
+ # message M { optional float f = 1 [default = 4.2]; }
12
+ #
13
+
14
+ require 'protobuf/message/message'
15
+ require 'protobuf/message/enum'
16
+ require 'protobuf/message/service'
17
+ require 'protobuf/message/extend'
18
+
19
+ class M < ::Protobuf::Message
20
+ defined_in __FILE__
21
+ optional :float, :f, 1, :default => 4.2
22
+ end
23
+ eos
24
+ end
25
+
26
+ def test_create_message
27
+ assert_compile_proto <<-eos, 'test/proto/addressbook.proto'
28
+ ### Generated by rprotoc. DO NOT EDIT!
29
+ ### <proto file: test/proto/addressbook.proto>
30
+ # package tutorial;
31
+ #
32
+ # message Person {
33
+ # required string name = 1;
34
+ # required int32 id = 2;
35
+ # optional string email = 3;
36
+ #
37
+ # enum PhoneType {
38
+ # MOBILE = 0;
39
+ # HOME = 1;
40
+ # WORK = 2;
41
+ # }
42
+ #
43
+ # message PhoneNumber {
44
+ # required string number = 1;
45
+ # optional PhoneType type = 2 [default = HOME];
46
+ # }
47
+ #
48
+ # repeated PhoneNumber phone = 4;
49
+ # optional uint32 age = 5 [default = 20];
50
+ #
51
+ # extensions 100 to 200;
52
+ # }
53
+ #
54
+ # extend Person {
55
+ # optional int32 age = 100;
56
+ # }
57
+ #
58
+ # message AddressBook {
59
+ # repeated Person person = 1;
60
+ # }
61
+ require 'protobuf/message/message'
62
+ require 'protobuf/message/enum'
63
+ require 'protobuf/message/service'
64
+ require 'protobuf/message/extend'
65
+
66
+ module Tutorial
67
+
68
+ class Person < ::Protobuf::Message
69
+ defined_in __FILE__
70
+ required :string, :name, 1
71
+ required :int32, :id, 2
72
+ optional :string, :email, 3
73
+
74
+ class PhoneType < ::Protobuf::Enum
75
+ defined_in __FILE__
76
+ MOBILE = 0
77
+ HOME = 1
78
+ WORK = 2
79
+ end
80
+
81
+ class PhoneNumber < ::Protobuf::Message
82
+ defined_in __FILE__
83
+ required :string, :number, 1
84
+ optional :PhoneType, :type, 2, :default => :HOME
85
+ end
86
+
87
+ repeated :PhoneNumber, :phone, 4
88
+ optional :uint32, :age, 5, :default => 20
89
+
90
+ extensions 100..200
91
+ end
92
+
93
+ class Person < ::Protobuf::Message
94
+ defined_in __FILE__
95
+ optional :int32, :age, 100, :extension => true
96
+ end
97
+
98
+ class AddressBook < ::Protobuf::Message
99
+ defined_in __FILE__
100
+ repeated :Person, :person, 1
101
+ end
102
+ end
103
+ eos
104
+ end
105
+
106
+ def test_create_nested_message
107
+ assert_compile_proto <<-eos, 'test/proto/nested.proto'
108
+ ### Generated by rprotoc. DO NOT EDIT!
109
+ ### <proto file: test/proto/nested.proto>
110
+ # message Foo {
111
+ # message Bar {
112
+ # }
113
+ # }
114
+ # message Baaz {
115
+ # optional Foo.Bar x = 1;
116
+ # }
117
+ require 'protobuf/message/message'
118
+ require 'protobuf/message/enum'
119
+ require 'protobuf/message/service'
120
+ require 'protobuf/message/extend'
121
+
122
+ class Foo < ::Protobuf::Message
123
+ defined_in __FILE__
124
+ class Bar < ::Protobuf::Message
125
+ defined_in __FILE__
126
+ end
127
+ end
128
+
129
+ class Baaz < ::Protobuf::Message
130
+ defined_in __FILE__
131
+ optional :'Foo::Bar', :x, 1
132
+ end
133
+ eos
134
+ end
135
+
136
+ def test_nested_message
137
+ Protobuf::Visitor::CreateMessageVisitor.instance_eval {remove_const :Baaz}
138
+ file_contents = Protobuf::Compiler.new.create_message('test/proto/nested.proto', '.', '.', false)
139
+ assert_nothing_raised {eval file_contents}
140
+ assert_raise(TypeError) {Baaz.new.x = 1}
141
+ assert_nothing_raised {Baaz.new.x = Foo::Bar.new}
142
+ end
143
+
144
+ def test_create_rpc
145
+ file_contents = Protobuf::Compiler.new.create_rpc('test/proto/rpc.proto', '.', '.', false)
146
+
147
+ assert_source <<-eos, file_contents['./test/proto/address_book_service.rb']
148
+ require 'protobuf/rpc/server'
149
+ require 'protobuf/rpc/handler'
150
+ require 'test/proto/rpc.pb'
151
+
152
+ class Tutorial::SearchHandler < Protobuf::Rpc::Handler
153
+ request Tutorial::Person
154
+ response Tutorial::AddressBook
155
+
156
+ def self.process_request(request, response)
157
+ # TODO: edit this method
158
+ end
159
+ end
160
+
161
+ class Tutorial::AddHandler < Protobuf::Rpc::Handler
162
+ request Tutorial::Person
163
+ response Tutorial::Person
164
+
165
+ def self.process_request(request, response)
166
+ # TODO: edit this method
167
+ end
168
+ end
169
+
170
+ class Tutorial::AddressBookService < Protobuf::Rpc::Server
171
+ def setup_handlers
172
+ @handlers = {
173
+ :search => Tutorial::SearchHandler,
174
+ :add => Tutorial::AddHandler,
175
+ }
176
+ end
177
+ end
178
+ eos
179
+
180
+ assert_source <<-eos, file_contents['./test/proto/start_address_book_service']
181
+ #!/usr/bin/env ruby
182
+ require 'address_book_service'
183
+
184
+ Tutorial::AddressBookService.new(:port => 9999).start
185
+ eos
186
+
187
+ assert_source <<-eos, file_contents['./test/proto/client_search.rb']
188
+ #!/usr/bin/env ruby
189
+ require 'protobuf/rpc/client'
190
+ require 'test/proto/rpc.pb'
191
+
192
+ # build request
193
+ request = Tutorial::Person.new
194
+ # TODO: setup a request
195
+ raise StandardError.new('setup a request')
196
+
197
+ # create blunk response
198
+ response = Tutorial::AddressBook.new
199
+
200
+ # execute rpc
201
+ Protobuf::Rpc::Client.new('localhost', 9999).call :search, request, response
202
+
203
+ # show response
204
+ puts response
205
+ eos
206
+
207
+ assert_source <<-eos, file_contents['./test/proto/client_add.rb']
208
+ #!/usr/bin/env ruby
209
+ require 'protobuf/rpc/client'
210
+ require 'test/proto/rpc.pb'
211
+
212
+ # build request
213
+ request = Tutorial::Person.new
214
+ # TODO: setup a request
215
+ raise StandardError.new('setup a request')
216
+
217
+ # create blunk response
218
+ response = Tutorial::Person.new
219
+
220
+ # execute rpc
221
+ Protobuf::Rpc::Client.new('localhost', 9999).call :add, request, response
222
+
223
+ # show response
224
+ puts response
225
+ eos
226
+ end
227
+
228
+ def test_create_descriptor
229
+ proto_path = 'test/proto/addressbook.proto'
230
+ visitor = Protobuf::Visitor::CreateDescriptorVisitor.new proto_path
231
+ File.open proto_path, 'r' do |file|
232
+ visitor.visit Protobuf::ProtoParser.new.parse(file)
233
+ end
234
+ file_descriptor = visitor.file_descriptor
235
+ assert_equal proto_path, file_descriptor.name
236
+ assert_equal 'tutorial', file_descriptor.package
237
+
238
+ person_descriptor = file_descriptor.message_type[0]
239
+ assert_equal 'Person', person_descriptor.name
240
+ assert_equal [:name, :id, :email, :phone, :age].size, person_descriptor.field.size
241
+
242
+ name_field_descriptor = person_descriptor.field.find {|d| d.name == 'name'}
243
+ assert_equal 1, name_field_descriptor.number
244
+ assert_equal Google::Protobuf::FieldDescriptorProto::Type::TYPE_STRING, name_field_descriptor.type
245
+ assert_equal Google::Protobuf::FieldDescriptorProto::Label::LABEL_REQUIRED, name_field_descriptor.label
246
+ assert_equal 'string', name_field_descriptor.type_name
247
+
248
+ phone_field_descriptor = person_descriptor.field.find {|d| d.name == 'phone'}
249
+ assert_equal 4, phone_field_descriptor.number
250
+ assert_equal 0, phone_field_descriptor.type #TODO: is this right?
251
+ assert_equal Google::Protobuf::FieldDescriptorProto::Label::LABEL_REPEATED, phone_field_descriptor.label
252
+ assert_equal 'PhoneNumber', phone_field_descriptor.type_name
253
+
254
+ age_field_descriptor = person_descriptor.field.find {|d| d.name == 'age'}
255
+ assert_equal 5, age_field_descriptor.number
256
+ assert_equal Google::Protobuf::FieldDescriptorProto::Type::TYPE_UINT32, age_field_descriptor.type
257
+ assert_equal Google::Protobuf::FieldDescriptorProto::Label::LABEL_OPTIONAL, age_field_descriptor.label
258
+ assert_equal 'uint32', age_field_descriptor.type_name
259
+ assert_equal '20', age_field_descriptor.default_value
260
+
261
+ phone_type_descriptor = person_descriptor.enum_type.first
262
+ assert_equal 'PhoneType', phone_type_descriptor.name
263
+ assert_equal 3, phone_type_descriptor.value.size
264
+
265
+ phone_type_home_descriptor = phone_type_descriptor.value.find {|d| d.name == 'HOME'}
266
+ assert_equal 'HOME', phone_type_home_descriptor.name
267
+ assert_equal 1, phone_type_home_descriptor.number
268
+
269
+ extensions_descriptor = person_descriptor.extension_range.first
270
+ assert_equal 100, extensions_descriptor.start
271
+ assert_equal 200, extensions_descriptor.end
272
+
273
+ phone_number_descriptor = person_descriptor.nested_type.first
274
+ assert_equal 'PhoneNumber', phone_number_descriptor.name
275
+ assert_equal [:number, :type].size, phone_number_descriptor.field.size
276
+
277
+ #TODO: test extend
278
+ #extend_person_descriptor = ??
279
+ #assert_equal extend_person_descriptor
280
+
281
+ addressbook_descriptor = file_descriptor.message_type[1]
282
+ assert_equal 'AddressBook', addressbook_descriptor.name
283
+ end
284
+
285
+ def test_collision
286
+ assert_raise Protobuf::Message::TagCollisionError do require 'test/collision' end
287
+ assert_raise Protobuf::Message::TagCollisionError do
288
+ Protobuf::Compiler.new.create_message('test/proto/collision.proto', '.', '.', false)
289
+ end
290
+ end
291
+
292
+ def test_ext_collision
293
+ assert_raise Protobuf::Message::TagCollisionError do require 'test/ext_collision' end
294
+ assert_raise Protobuf::Message::TagCollisionError do
295
+ Protobuf::Compiler.new.create_message('test/proto/ext_collision.proto', '.', '.', false)
296
+ end
297
+ end
298
+
299
+ def test_ext_range
300
+ assert_raise RangeError do require 'test/ext_range' end
301
+ assert_raise RangeError do
302
+ Protobuf::Compiler.new.create_message('test/proto/ext_range.proto', '.', '.', false)
303
+ end
304
+ end
305
+
306
+ def assert_compile_proto(ideal, filename)
307
+ assert_equal ideal.gsub(/^\s*\n/, '').strip, Protobuf::Compiler.new.create_message(filename, '.', '.', false).gsub(/^\s*\n/, '').strip
308
+ end
309
+
310
+ def assert_source(ideal, real)
311
+ assert_equal ideal.strip.gsub(/^\s*\n/, '').gsub(/\s+\n/, "\n"), real.strip.gsub(/^\s*\n/, '').gsub(/\s+\n/, "\n")
312
+ end
313
+ end