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