OLD | NEW |
1 #!/usr/bin/env dart | 1 #!/usr/bin/env dart |
2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
3 // for details. All rights reserved. Use of this source code is governed by a | 3 // for details. All rights reserved. Use of this source code is governed by a |
4 // BSD-style license that can be found in the LICENSE file. | 4 // BSD-style license that can be found in the LICENSE file. |
5 | 5 |
6 library file_generator_test; | 6 library file_generator_test; |
7 | 7 |
8 import 'package:protoc_plugin/indenting_writer.dart'; | 8 import 'package:protoc_plugin/indenting_writer.dart'; |
9 import 'package:protoc_plugin/src/descriptor.pb.dart'; | 9 import 'package:protoc_plugin/src/descriptor.pb.dart'; |
10 import 'package:protoc_plugin/src/plugin.pb.dart'; | 10 import 'package:protoc_plugin/src/plugin.pb.dart'; |
11 import 'package:protoc_plugin/protoc.dart'; | 11 import 'package:protoc_plugin/protoc.dart'; |
12 import 'package:test/test.dart'; | 12 import 'package:test/test.dart'; |
13 | 13 |
14 FileDescriptorProto buildFileDescriptor( | 14 FileDescriptorProto buildFileDescriptor( |
15 {phoneNumber: true, topLevelEnum: false}) { | 15 {phoneNumber: true, topLevelEnum: false}) { |
16 | 16 FileDescriptorProto fd = new FileDescriptorProto()..name = 'test'; |
17 FileDescriptorProto fd = new FileDescriptorProto() | |
18 ..name = 'test'; | |
19 | 17 |
20 if (topLevelEnum) { | 18 if (topLevelEnum) { |
21 fd.enumType.add(new EnumDescriptorProto() | 19 fd.enumType.add(new EnumDescriptorProto() |
22 ..name = 'PhoneType' | 20 ..name = 'PhoneType' |
23 ..value.addAll([ | 21 ..value.addAll([ |
24 new EnumValueDescriptorProto() | 22 new EnumValueDescriptorProto() |
25 ..name = 'MOBILE' | 23 ..name = 'MOBILE' |
26 ..number = 0, | 24 ..number = 0, |
27 new EnumValueDescriptorProto() | 25 new EnumValueDescriptorProto() |
28 ..name = 'HOME' | 26 ..name = 'HOME' |
29 ..number = 1, | 27 ..number = 1, |
30 new EnumValueDescriptorProto() | 28 new EnumValueDescriptorProto() |
31 ..name = 'WORK' | 29 ..name = 'WORK' |
32 ..number = 2, | 30 ..number = 2, |
33 new EnumValueDescriptorProto() | 31 new EnumValueDescriptorProto() |
34 ..name = 'BUSINESS' | 32 ..name = 'BUSINESS' |
35 ..number = 2])); | 33 ..number = 2 |
| 34 ])); |
36 } | 35 } |
37 | 36 |
38 if (phoneNumber) { | 37 if (phoneNumber) { |
39 fd.messageType.add(new DescriptorProto() | 38 fd.messageType.add(new DescriptorProto() |
40 ..name = 'PhoneNumber' | 39 ..name = 'PhoneNumber' |
41 ..field.addAll([ | 40 ..field.addAll([ |
42 // required string number = 1; | 41 // required string number = 1; |
43 new FieldDescriptorProto() | 42 new FieldDescriptorProto() |
44 ..name = 'number' | 43 ..name = 'number' |
45 ..number = 1 | 44 ..number = 1 |
46 ..label = FieldDescriptorProto_Label.LABEL_REQUIRED | 45 ..label = FieldDescriptorProto_Label.LABEL_REQUIRED |
47 ..type = FieldDescriptorProto_Type.TYPE_STRING, | 46 ..type = FieldDescriptorProto_Type.TYPE_STRING, |
48 // optional int32 type = 2; | 47 // optional int32 type = 2; |
49 // OR | 48 // OR |
50 // optional PhoneType type = 2; | 49 // optional PhoneType type = 2; |
51 new FieldDescriptorProto() | 50 new FieldDescriptorProto() |
52 ..name = 'type' | 51 ..name = 'type' |
53 ..number = 2 | 52 ..number = 2 |
54 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL | 53 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL |
55 ..type = topLevelEnum ? FieldDescriptorProto_Type.TYPE_ENUM | 54 ..type = topLevelEnum |
56 : FieldDescriptorProto_Type.TYPE_INT32 | 55 ? FieldDescriptorProto_Type.TYPE_ENUM |
57 ..typeName = topLevelEnum ? '.PhoneType' : '', | 56 : FieldDescriptorProto_Type.TYPE_INT32 |
58 // optional string name = 3 [default = "$"]; | 57 ..typeName = topLevelEnum ? '.PhoneType' : '', |
59 new FieldDescriptorProto() | 58 // optional string name = 3 [default = "$"]; |
60 ..name = 'name' | 59 new FieldDescriptorProto() |
61 ..number = 3 | 60 ..name = 'name' |
62 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL | 61 ..number = 3 |
63 ..type = FieldDescriptorProto_Type.TYPE_STRING | 62 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL |
64 ..defaultValue = r'$' | 63 ..type = FieldDescriptorProto_Type.TYPE_STRING |
65 ])); | 64 ..defaultValue = r'$' |
| 65 ])); |
66 } | 66 } |
67 | 67 |
68 return fd; | 68 return fd; |
69 } | 69 } |
70 | 70 |
71 void main() { | 71 void main() { |
72 test('FileGenerator output for a proto with one message', () { | 72 test('FileGenerator output for a proto with one message', () { |
73 // NOTE: Below > 80 cols because it is matching generated code > 80 cols. | 73 // NOTE: Below > 80 cols because it is matching generated code > 80 cols. |
74 String expected = r''' | 74 String expected = r''' |
75 /// | 75 /// |
(...skipping 19 matching lines...) Expand all Loading... |
95 static PbList<PhoneNumber> createRepeated() => new PbList<PhoneNumber>(); | 95 static PbList<PhoneNumber> createRepeated() => new PbList<PhoneNumber>(); |
96 static PhoneNumber getDefault() { | 96 static PhoneNumber getDefault() { |
97 if (_defaultInstance == null) _defaultInstance = new _ReadonlyPhoneNumber(); | 97 if (_defaultInstance == null) _defaultInstance = new _ReadonlyPhoneNumber(); |
98 return _defaultInstance; | 98 return _defaultInstance; |
99 } | 99 } |
100 static PhoneNumber _defaultInstance; | 100 static PhoneNumber _defaultInstance; |
101 static void $checkItem(PhoneNumber v) { | 101 static void $checkItem(PhoneNumber v) { |
102 if (v is !PhoneNumber) checkItemFailed(v, 'PhoneNumber'); | 102 if (v is !PhoneNumber) checkItemFailed(v, 'PhoneNumber'); |
103 } | 103 } |
104 | 104 |
105 String get number => $_get(0, 1, ''); | 105 String get number => $_get(0, 1, '') as String; |
106 void set number(String v) { $_setString(0, 1, v); } | 106 void set number(String v) { $_setString(0, 1, v); } |
107 bool hasNumber() => $_has(0, 1); | 107 bool hasNumber() => $_has(0, 1); |
108 void clearNumber() => clearField(1); | 108 void clearNumber() => clearField(1); |
109 | 109 |
110 int get type => $_get(1, 2, 0); | 110 int get type => $_get(1, 2, 0) as int; |
111 void set type(int v) { $_setUnsignedInt32(1, 2, v); } | 111 void set type(int v) { $_setUnsignedInt32(1, 2, v); } |
112 bool hasType() => $_has(1, 2); | 112 bool hasType() => $_has(1, 2); |
113 void clearType() => clearField(2); | 113 void clearType() => clearField(2); |
114 | 114 |
115 String get name => $_get(2, 3, '\$'); | 115 String get name => $_get(2, 3, '\$') as String; |
116 void set name(String v) { $_setString(2, 3, v); } | 116 void set name(String v) { $_setString(2, 3, v); } |
117 bool hasName() => $_has(2, 3); | 117 bool hasName() => $_has(2, 3); |
118 void clearName() => clearField(3); | 118 void clearName() => clearField(3); |
119 } | 119 } |
120 | 120 |
121 class _ReadonlyPhoneNumber extends PhoneNumber with ReadonlyMessageMixin {} | 121 class _ReadonlyPhoneNumber extends PhoneNumber with ReadonlyMessageMixin {} |
122 | 122 |
123 const PhoneNumber$json = const { | 123 const PhoneNumber$json = const { |
124 '1': 'PhoneNumber', | 124 '1': 'PhoneNumber', |
125 '2': const [ | 125 '2': const [ |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 static const PhoneType WORK = const PhoneType._(2, 'WORK'); | 157 static const PhoneType WORK = const PhoneType._(2, 'WORK'); |
158 | 158 |
159 static const PhoneType BUSINESS = WORK; | 159 static const PhoneType BUSINESS = WORK; |
160 | 160 |
161 static const List<PhoneType> values = const <PhoneType> [ | 161 static const List<PhoneType> values = const <PhoneType> [ |
162 MOBILE, | 162 MOBILE, |
163 HOME, | 163 HOME, |
164 WORK, | 164 WORK, |
165 ]; | 165 ]; |
166 | 166 |
167 static final Map<int, PhoneType> _byValue = ProtobufEnum.initByValue(values); | 167 static final Map<int, dynamic> _byValue = ProtobufEnum.initByValue(values); |
168 static PhoneType valueOf(int value) => _byValue[value]; | 168 static PhoneType valueOf(int value) => _byValue[value] as PhoneType; |
169 static void $checkItem(PhoneType v) { | 169 static void $checkItem(PhoneType v) { |
170 if (v is !PhoneType) checkItemFailed(v, 'PhoneType'); | 170 if (v is !PhoneType) checkItemFailed(v, 'PhoneType'); |
171 } | 171 } |
172 | 172 |
173 const PhoneType._(int v, String n) : super(v, n); | 173 const PhoneType._(int v, String n) : super(v, n); |
174 } | 174 } |
175 | 175 |
176 const PhoneType$json = const { | 176 const PhoneType$json = const { |
177 '1': 'PhoneType', | 177 '1': 'PhoneType', |
178 '2': const [ | 178 '2': const [ |
179 const {'1': 'MOBILE', '2': 0}, | 179 const {'1': 'MOBILE', '2': 0}, |
180 const {'1': 'HOME', '2': 1}, | 180 const {'1': 'HOME', '2': 1}, |
181 const {'1': 'WORK', '2': 2}, | 181 const {'1': 'WORK', '2': 2}, |
182 const {'1': 'BUSINESS', '2': 2}, | 182 const {'1': 'BUSINESS', '2': 2}, |
183 ], | 183 ], |
184 }; | 184 }; |
185 | 185 |
186 '''; | 186 '''; |
187 FileDescriptorProto fd = buildFileDescriptor( | 187 FileDescriptorProto fd = |
188 phoneNumber: false, | 188 buildFileDescriptor(phoneNumber: false, topLevelEnum: true); |
189 topLevelEnum: true); | |
190 var options = parseGenerationOptions( | 189 var options = parseGenerationOptions( |
191 new CodeGeneratorRequest(), new CodeGeneratorResponse()); | 190 new CodeGeneratorRequest(), new CodeGeneratorResponse()); |
192 | 191 |
193 FileGenerator fg = new FileGenerator(fd); | 192 FileGenerator fg = new FileGenerator(fd); |
194 link(options, [fg]); | 193 link(options, [fg]); |
195 | 194 |
196 var writer = new IndentingWriter(); | 195 var writer = new IndentingWriter(); |
197 fg.generate(writer); | 196 fg.generate(writer); |
198 expect(writer.toString(), expected); | 197 expect(writer.toString(), expected); |
199 }); | 198 }); |
(...skipping 28 matching lines...) Expand all Loading... |
228 /// | 227 /// |
229 library test; | 228 library test; |
230 | 229 |
231 import 'package:fixnum/fixnum.dart'; | 230 import 'package:fixnum/fixnum.dart'; |
232 import 'package:protobuf/protobuf.dart'; | 231 import 'package:protobuf/protobuf.dart'; |
233 | 232 |
234 '''; | 233 '''; |
235 FileDescriptorProto fd = new FileDescriptorProto() | 234 FileDescriptorProto fd = new FileDescriptorProto() |
236 ..name = 'test' | 235 ..name = 'test' |
237 ..messageType.add(new DescriptorProto() | 236 ..messageType.add(new DescriptorProto() |
238 ..name = 'Count' | 237 ..name = 'Count' |
239 ..field.addAll([ | 238 ..field.addAll([ |
240 new FieldDescriptorProto() | 239 new FieldDescriptorProto() |
241 ..name = 'count' | 240 ..name = 'count' |
242 ..number = 1 | 241 ..number = 1 |
243 ..type = FieldDescriptorProto_Type.TYPE_INT64 | 242 ..type = FieldDescriptorProto_Type.TYPE_INT64 |
244 ])); | 243 ])); |
245 | 244 |
246 var options = parseGenerationOptions( | 245 var options = parseGenerationOptions( |
247 new CodeGeneratorRequest(), new CodeGeneratorResponse()); | 246 new CodeGeneratorRequest(), new CodeGeneratorResponse()); |
248 | 247 |
249 FileGenerator fg = new FileGenerator(fd); | 248 FileGenerator fg = new FileGenerator(fd); |
250 link(options, [fg]); | 249 link(options, [fg]); |
251 | 250 |
252 var writer = new IndentingWriter(); | 251 var writer = new IndentingWriter(); |
253 fg.generateHeader(writer, Uri.parse("test.proto")); | 252 fg.generateHeader(writer, Uri.parse("test.proto")); |
254 expect(writer.toString(), expected); | 253 expect(writer.toString(), expected); |
255 }); | 254 }); |
256 | 255 |
257 | |
258 test('FileGenerator handles field_name options', () { | 256 test('FileGenerator handles field_name options', () { |
259 // NOTE: Below > 80 cols because it is matching generated code > 80 cols. | 257 // NOTE: Below > 80 cols because it is matching generated code > 80 cols. |
260 String expected = r''' | 258 String expected = r''' |
261 /// | 259 /// |
262 // Generated code. Do not modify. | 260 // Generated code. Do not modify. |
263 /// | 261 /// |
264 library test; | 262 library test; |
265 | 263 |
266 import 'package:protobuf/protobuf.dart'; | 264 import 'package:protobuf/protobuf.dart'; |
267 | 265 |
(...skipping 13 matching lines...) Expand all Loading... |
281 static PbList<PhoneNumber> createRepeated() => new PbList<PhoneNumber>(); | 279 static PbList<PhoneNumber> createRepeated() => new PbList<PhoneNumber>(); |
282 static PhoneNumber getDefault() { | 280 static PhoneNumber getDefault() { |
283 if (_defaultInstance == null) _defaultInstance = new _ReadonlyPhoneNumber(); | 281 if (_defaultInstance == null) _defaultInstance = new _ReadonlyPhoneNumber(); |
284 return _defaultInstance; | 282 return _defaultInstance; |
285 } | 283 } |
286 static PhoneNumber _defaultInstance; | 284 static PhoneNumber _defaultInstance; |
287 static void $checkItem(PhoneNumber v) { | 285 static void $checkItem(PhoneNumber v) { |
288 if (v is !PhoneNumber) checkItemFailed(v, 'PhoneNumber'); | 286 if (v is !PhoneNumber) checkItemFailed(v, 'PhoneNumber'); |
289 } | 287 } |
290 | 288 |
291 String get no => $_get(0, 1, ''); | 289 String get no => $_get(0, 1, '') as String; |
292 void set no(String v) { $_setString(0, 1, v); } | 290 void set no(String v) { $_setString(0, 1, v); } |
293 bool hasNo() => $_has(0, 1); | 291 bool hasNo() => $_has(0, 1); |
294 void clearNo() => clearField(1); | 292 void clearNo() => clearField(1); |
295 | 293 |
296 int get the_type => $_get(1, 2, 0); | 294 int get the_type => $_get(1, 2, 0) as int; |
297 void set the_type(int v) { $_setUnsignedInt32(1, 2, v); } | 295 void set the_type(int v) { $_setUnsignedInt32(1, 2, v); } |
298 bool hasThe_type() => $_has(1, 2); | 296 bool hasThe_type() => $_has(1, 2); |
299 void clearThe_type() => clearField(2); | 297 void clearThe_type() => clearField(2); |
300 | 298 |
301 String get name_ => $_get(2, 3, '\$'); | 299 String get name_ => $_get(2, 3, '\$') as String; |
302 void set name_(String v) { $_setString(2, 3, v); } | 300 void set name_(String v) { $_setString(2, 3, v); } |
303 bool hasName_() => $_has(2, 3); | 301 bool hasName_() => $_has(2, 3); |
304 void clearName_() => clearField(3); | 302 void clearName_() => clearField(3); |
305 } | 303 } |
306 | 304 |
307 class _ReadonlyPhoneNumber extends PhoneNumber with ReadonlyMessageMixin {} | 305 class _ReadonlyPhoneNumber extends PhoneNumber with ReadonlyMessageMixin {} |
308 | 306 |
309 const PhoneNumber$json = const { | 307 const PhoneNumber$json = const { |
310 '1': 'PhoneNumber', | 308 '1': 'PhoneNumber', |
311 '2': const [ | 309 '2': const [ |
312 const {'1': 'number', '3': 1, '4': 2, '5': 9}, | 310 const {'1': 'number', '3': 1, '4': 2, '5': 9}, |
313 const {'1': 'type', '3': 2, '4': 1, '5': 5, '6': ''}, | 311 const {'1': 'type', '3': 2, '4': 1, '5': 5, '6': ''}, |
314 const {'1': 'name', '3': 3, '4': 1, '5': 9, '7': r'$'}, | 312 const {'1': 'name', '3': 3, '4': 1, '5': 9, '7': r'$'}, |
315 ], | 313 ], |
316 }; | 314 }; |
317 | 315 |
318 '''; | 316 '''; |
319 FileDescriptorProto fd = buildFileDescriptor(); | 317 FileDescriptorProto fd = buildFileDescriptor(); |
320 var request = new CodeGeneratorRequest(); | 318 var request = new CodeGeneratorRequest(); |
321 request.parameter = 'field_name=PhoneNumber.number|No,' | 319 request.parameter = 'field_name=PhoneNumber.number|No,' |
322 'field_name=PhoneNumber.name|Name_,' | 320 'field_name=PhoneNumber.name|Name_,' |
323 'field_name=PhoneNumber.type|The_type'; | 321 'field_name=PhoneNumber.type|The_type'; |
324 var options = parseGenerationOptions( | 322 var options = parseGenerationOptions(request, new CodeGeneratorResponse()); |
325 request, new CodeGeneratorResponse()); | |
326 | 323 |
327 FileGenerator fg = new FileGenerator(fd); | 324 FileGenerator fg = new FileGenerator(fd); |
328 link(options, [fg]); | 325 link(options, [fg]); |
329 | 326 |
330 var writer = new IndentingWriter(); | 327 var writer = new IndentingWriter(); |
331 fg.generate(writer); | 328 fg.generate(writer); |
332 expect(writer.toString(), expected); | 329 expect(writer.toString(), expected); |
333 }); | 330 }); |
334 | 331 |
335 test('FileGenerator generates imports for .pb.dart files', () { | 332 test('FileGenerator generates imports for .pb.dart files', () { |
(...skipping 25 matching lines...) Expand all Loading... |
361 static PbList<M> createRepeated() => new PbList<M>(); | 358 static PbList<M> createRepeated() => new PbList<M>(); |
362 static M getDefault() { | 359 static M getDefault() { |
363 if (_defaultInstance == null) _defaultInstance = new _ReadonlyM(); | 360 if (_defaultInstance == null) _defaultInstance = new _ReadonlyM(); |
364 return _defaultInstance; | 361 return _defaultInstance; |
365 } | 362 } |
366 static M _defaultInstance; | 363 static M _defaultInstance; |
367 static void $checkItem(M v) { | 364 static void $checkItem(M v) { |
368 if (v is !M) checkItemFailed(v, 'M'); | 365 if (v is !M) checkItemFailed(v, 'M'); |
369 } | 366 } |
370 | 367 |
371 M get m => $_get(0, 1, null); | 368 M get m => $_get(0, 1, null) as M; |
372 void set m(M v) { setField(1, v); } | 369 void set m(M v) { setField(1, v); } |
373 bool hasM() => $_has(0, 1); | 370 bool hasM() => $_has(0, 1); |
374 void clearM() => clearField(1); | 371 void clearM() => clearField(1); |
375 | 372 |
376 p1.M get m1 => $_get(1, 2, null); | 373 p1.M get m1 => $_get(1, 2, null) as p1.M; |
377 void set m1(p1.M v) { setField(2, v); } | 374 void set m1(p1.M v) { setField(2, v); } |
378 bool hasM1() => $_has(1, 2); | 375 bool hasM1() => $_has(1, 2); |
379 void clearM1() => clearField(2); | 376 void clearM1() => clearField(2); |
380 | 377 |
381 p2.M get m2 => $_get(2, 3, null); | 378 p2.M get m2 => $_get(2, 3, null) as p2.M; |
382 void set m2(p2.M v) { setField(3, v); } | 379 void set m2(p2.M v) { setField(3, v); } |
383 bool hasM2() => $_has(2, 3); | 380 bool hasM2() => $_has(2, 3); |
384 void clearM2() => clearField(3); | 381 void clearM2() => clearField(3); |
385 } | 382 } |
386 | 383 |
387 class _ReadonlyM extends M with ReadonlyMessageMixin {} | 384 class _ReadonlyM extends M with ReadonlyMessageMixin {} |
388 | 385 |
389 const M$json = const { | 386 const M$json = const { |
390 '1': 'M', | 387 '1': 'M', |
391 '2': const [ | 388 '2': const [ |
(...skipping 28 matching lines...) Expand all Loading... |
420 // import "package1.proto"; | 417 // import "package1.proto"; |
421 // import "package2.proto"; | 418 // import "package2.proto"; |
422 // message M { | 419 // message M { |
423 // optional M m = 1; | 420 // optional M m = 1; |
424 // optional p1.M m1 = 2; | 421 // optional p1.M m1 = 2; |
425 // optional p2.M m2 = 3; | 422 // optional p2.M m2 = 3; |
426 // } | 423 // } |
427 | 424 |
428 // Description of package1.proto. | 425 // Description of package1.proto. |
429 DescriptorProto md1 = new DescriptorProto() | 426 DescriptorProto md1 = new DescriptorProto() |
430 ..name = 'M' | 427 ..name = 'M' |
431 ..field.addAll([ | 428 ..field.addAll([ |
432 // optional M m = 1; | 429 // optional M m = 1; |
433 new FieldDescriptorProto() | 430 new FieldDescriptorProto() |
434 ..name = 'm' | 431 ..name = 'm' |
435 ..number = 1 | 432 ..number = 1 |
436 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL | 433 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL |
437 ..type = FieldDescriptorProto_Type.TYPE_MESSAGE | 434 ..type = FieldDescriptorProto_Type.TYPE_MESSAGE |
438 ..typeName = ".p1.M", | 435 ..typeName = ".p1.M", |
439 ]); | 436 ]); |
440 FileDescriptorProto fd1 = new FileDescriptorProto() | 437 FileDescriptorProto fd1 = new FileDescriptorProto() |
441 ..package = 'p1' | 438 ..package = 'p1' |
442 ..name = 'package1.proto' | 439 ..name = 'package1.proto' |
443 ..messageType.add(md1); | 440 ..messageType.add(md1); |
444 | 441 |
445 // Description of package1.proto. | 442 // Description of package1.proto. |
446 DescriptorProto md2 = new DescriptorProto() | 443 DescriptorProto md2 = new DescriptorProto() |
447 ..name = 'M' | 444 ..name = 'M' |
448 ..field.addAll([ | 445 ..field.addAll([ |
449 // optional M m = 1; | 446 // optional M m = 1; |
450 new FieldDescriptorProto() | 447 new FieldDescriptorProto() |
451 ..name = 'x' | 448 ..name = 'x' |
452 ..number = 1 | 449 ..number = 1 |
453 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL | 450 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL |
454 ..type = FieldDescriptorProto_Type.TYPE_MESSAGE | 451 ..type = FieldDescriptorProto_Type.TYPE_MESSAGE |
455 ..typeName = ".p2.M", | 452 ..typeName = ".p2.M", |
456 ]); | 453 ]); |
457 FileDescriptorProto fd2 = new FileDescriptorProto() | 454 FileDescriptorProto fd2 = new FileDescriptorProto() |
458 ..package = 'p2' | 455 ..package = 'p2' |
459 ..name = 'package2.proto' | 456 ..name = 'package2.proto' |
460 ..messageType.add(md2); | 457 ..messageType.add(md2); |
461 | 458 |
462 // Description of test.proto. | 459 // Description of test.proto. |
463 DescriptorProto md = new DescriptorProto() | 460 DescriptorProto md = new DescriptorProto() |
464 ..name = 'M' | 461 ..name = 'M' |
465 ..field.addAll([ | 462 ..field.addAll([ |
466 // optional M m = 1; | 463 // optional M m = 1; |
467 new FieldDescriptorProto() | 464 new FieldDescriptorProto() |
468 ..name = 'm' | 465 ..name = 'm' |
469 ..number = 1 | 466 ..number = 1 |
470 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL | 467 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL |
471 ..type = FieldDescriptorProto_Type.TYPE_MESSAGE | 468 ..type = FieldDescriptorProto_Type.TYPE_MESSAGE |
472 ..typeName = ".M", | 469 ..typeName = ".M", |
473 // optional p1.M m1 = 2; | 470 // optional p1.M m1 = 2; |
474 new FieldDescriptorProto() | 471 new FieldDescriptorProto() |
475 ..name = 'm1' | 472 ..name = 'm1' |
476 ..number = 2 | 473 ..number = 2 |
477 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL | 474 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL |
478 ..type = FieldDescriptorProto_Type.TYPE_MESSAGE | 475 ..type = FieldDescriptorProto_Type.TYPE_MESSAGE |
479 ..typeName = ".p1.M", | 476 ..typeName = ".p1.M", |
480 // optional p2.M m2 = 3; | 477 // optional p2.M m2 = 3; |
481 new FieldDescriptorProto() | 478 new FieldDescriptorProto() |
482 ..name = 'm2' | 479 ..name = 'm2' |
483 ..number = 3 | 480 ..number = 3 |
484 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL | 481 ..label = FieldDescriptorProto_Label.LABEL_OPTIONAL |
485 ..type = FieldDescriptorProto_Type.TYPE_MESSAGE | 482 ..type = FieldDescriptorProto_Type.TYPE_MESSAGE |
486 ..typeName = ".p2.M", | 483 ..typeName = ".p2.M", |
487 ]); | 484 ]); |
488 FileDescriptorProto fd = new FileDescriptorProto() | 485 FileDescriptorProto fd = new FileDescriptorProto() |
489 ..name = 'test.proto' | 486 ..name = 'test.proto' |
490 ..messageType.add(md); | 487 ..messageType.add(md); |
491 fd.dependency.addAll(['package1.proto', 'package2.proto']); | 488 fd.dependency.addAll(['package1.proto', 'package2.proto']); |
492 var request = new CodeGeneratorRequest(); | 489 var request = new CodeGeneratorRequest(); |
493 var response = new CodeGeneratorResponse(); | 490 var response = new CodeGeneratorResponse(); |
494 var options = parseGenerationOptions(request, response); | 491 var options = parseGenerationOptions(request, response); |
495 | 492 |
496 FileGenerator fg = new FileGenerator(fd); | 493 FileGenerator fg = new FileGenerator(fd); |
497 link(options, [fg, new FileGenerator(fd1), new FileGenerator(fd2)]); | 494 link(options, [fg, new FileGenerator(fd1), new FileGenerator(fd2)]); |
498 | 495 |
499 var writer = new IndentingWriter(); | 496 var writer = new IndentingWriter(); |
500 fg.generate(writer); | 497 fg.generate(writer); |
501 expect(writer.toString(), expected); | 498 expect(writer.toString(), expected); |
502 }); | 499 }); |
503 } | 500 } |
OLD | NEW |