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 /// |
76 // Generated code. Do not modify. | 76 // Generated code. Do not modify. |
77 /// | 77 /// |
78 library test; | 78 library test; |
79 | 79 |
80 import 'package:protobuf/protobuf.dart'; | 80 import 'package:protobuf/protobuf.dart'; |
81 | 81 |
82 class PhoneNumber extends GeneratedMessage { | 82 class PhoneNumber extends GeneratedMessage { |
83 static final BuilderInfo _i = new BuilderInfo('PhoneNumber') | 83 static final BuilderInfo _i = new BuilderInfo('PhoneNumber') |
84 ..a(1, 'number', PbFieldType.QS) | 84 ..a/*<String>*/(1, 'number', PbFieldType.QS) |
85 ..a(2, 'type', PbFieldType.O3) | 85 ..a/*<int>*/(2, 'type', PbFieldType.O3) |
86 ..a(3, 'name', PbFieldType.OS, '\$') | 86 ..a/*<String>*/(3, 'name', PbFieldType.OS, '\$') |
87 ; | 87 ; |
88 | 88 |
89 PhoneNumber() : super(); | 89 PhoneNumber() : super(); |
90 PhoneNumber.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.E
MPTY]) : super.fromBuffer(i, r); | 90 PhoneNumber.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.E
MPTY]) : super.fromBuffer(i, r); |
91 PhoneNumber.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]
) : super.fromJson(i, r); | 91 PhoneNumber.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]
) : super.fromJson(i, r); |
92 PhoneNumber clone() => new PhoneNumber()..mergeFromMessage(this); | 92 PhoneNumber clone() => new PhoneNumber()..mergeFromMessage(this); |
93 BuilderInfo get info_ => _i; | 93 BuilderInfo get info_ => _i; |
94 static PhoneNumber create() => new PhoneNumber(); | 94 static PhoneNumber create() => new PhoneNumber(); |
95 static PbList<PhoneNumber> createRepeated() => new PbList<PhoneNumber>(); | 95 static PbList<PhoneNumber> createRepeated() => new PbList<PhoneNumber>(); |
96 static PhoneNumber getDefault() { | 96 static PhoneNumber getDefault() { |
(...skipping 60 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 |
268 class PhoneNumber extends GeneratedMessage { | 266 class PhoneNumber extends GeneratedMessage { |
269 static final BuilderInfo _i = new BuilderInfo('PhoneNumber') | 267 static final BuilderInfo _i = new BuilderInfo('PhoneNumber') |
270 ..a(1, 'no', PbFieldType.QS) | 268 ..a/*<String>*/(1, 'no', PbFieldType.QS) |
271 ..a(2, 'the_type', PbFieldType.O3) | 269 ..a/*<int>*/(2, 'the_type', PbFieldType.O3) |
272 ..a(3, 'name_', PbFieldType.OS, '\$') | 270 ..a/*<String>*/(3, 'name_', PbFieldType.OS, '\$') |
273 ; | 271 ; |
274 | 272 |
275 PhoneNumber() : super(); | 273 PhoneNumber() : super(); |
276 PhoneNumber.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.E
MPTY]) : super.fromBuffer(i, r); | 274 PhoneNumber.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.E
MPTY]) : super.fromBuffer(i, r); |
277 PhoneNumber.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]
) : super.fromJson(i, r); | 275 PhoneNumber.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]
) : super.fromJson(i, r); |
278 PhoneNumber clone() => new PhoneNumber()..mergeFromMessage(this); | 276 PhoneNumber clone() => new PhoneNumber()..mergeFromMessage(this); |
279 BuilderInfo get info_ => _i; | 277 BuilderInfo get info_ => _i; |
280 static PhoneNumber create() => new PhoneNumber(); | 278 static PhoneNumber create() => new PhoneNumber(); |
281 static PbList<PhoneNumber> createRepeated() => new PbList<PhoneNumber>(); | 279 static PbList<PhoneNumber> createRepeated() => new PbList<PhoneNumber>(); |
282 static PhoneNumber getDefault() { | 280 static PhoneNumber getDefault() { |
(...skipping 29 matching lines...) Expand all Loading... |
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', () { |
336 // NOTE: Below > 80 cols because it is matching generated code > 80 cols. | 333 // NOTE: Below > 80 cols because it is matching generated code > 80 cols. |
337 String expected = r''' | 334 String expected = r''' |
338 /// | 335 /// |
339 // Generated code. Do not modify. | 336 // Generated code. Do not modify. |
340 /// | 337 /// |
341 library test; | 338 library test; |
342 | 339 |
343 import 'package:protobuf/protobuf.dart'; | 340 import 'package:protobuf/protobuf.dart'; |
344 import 'package1.pb.dart' as p1; | 341 import 'package1.pb.dart' as p1; |
345 import 'package2.pb.dart' as p2; | 342 import 'package2.pb.dart' as p2; |
346 | 343 |
347 class M extends GeneratedMessage { | 344 class M extends GeneratedMessage { |
348 static final BuilderInfo _i = new BuilderInfo('M') | 345 static final BuilderInfo _i = new BuilderInfo('M') |
349 ..a(1, 'm', PbFieldType.OM, M.getDefault, M.create) | 346 ..a/*<M>*/(1, 'm', PbFieldType.OM, M.getDefault, M.create) |
350 ..a(2, 'm1', PbFieldType.OM, p1.M.getDefault, p1.M.create) | 347 ..a/*<p1.M>*/(2, 'm1', PbFieldType.OM, p1.M.getDefault, p1.M.create) |
351 ..a(3, 'm2', PbFieldType.OM, p2.M.getDefault, p2.M.create) | 348 ..a/*<p2.M>*/(3, 'm2', PbFieldType.OM, p2.M.getDefault, p2.M.create) |
352 ..hasRequiredFields = false | 349 ..hasRequiredFields = false |
353 ; | 350 ; |
354 | 351 |
355 M() : super(); | 352 M() : super(); |
356 M.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : s
uper.fromBuffer(i, r); | 353 M.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : s
uper.fromBuffer(i, r); |
357 M.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.
fromJson(i, r); | 354 M.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.
fromJson(i, r); |
358 M clone() => new M()..mergeFromMessage(this); | 355 M clone() => new M()..mergeFromMessage(this); |
359 BuilderInfo get info_ => _i; | 356 BuilderInfo get info_ => _i; |
360 static M create() => new M(); | 357 static M create() => new M(); |
361 static PbList<M> createRepeated() => new PbList<M>(); | 358 static PbList<M> createRepeated() => new PbList<M>(); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after 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 |