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.
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