| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import imp | 5 import imp |
| 6 import os.path | 6 import os.path |
| 7 import sys | 7 import sys |
| 8 import unittest | 8 import unittest |
| 9 | 9 |
| 10 # Disable lint check for finding modules: | 10 # Disable lint check for finding modules: |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 }; | 144 }; |
| 145 | 145 |
| 146 } // module my_module | 146 } // module my_module |
| 147 """ | 147 """ |
| 148 expected = ast.Mojom( | 148 expected = ast.Mojom( |
| 149 ast.Module(('IDENTIFIER', 'my_module'), None), | 149 ast.Module(('IDENTIFIER', 'my_module'), None), |
| 150 ast.ImportList(), | 150 ast.ImportList(), |
| 151 [('STRUCT', | 151 [('STRUCT', |
| 152 'MyStruct', | 152 'MyStruct', |
| 153 None, | 153 None, |
| 154 [('FIELD', 'int32', 'a', None, None), | 154 [ast.StructField('a', None, 'int32', None), |
| 155 ('FIELD', 'double', 'b', None, None)])]) | 155 ast.StructField('b', None, 'double', None)])]) |
| 156 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 156 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 157 | 157 |
| 158 def testSimpleStructWithoutModule(self): | 158 def testSimpleStructWithoutModule(self): |
| 159 """Tests a simple struct without an enclosing module.""" | 159 """Tests a simple struct without an enclosing module.""" |
| 160 | 160 |
| 161 source = """\ | 161 source = """\ |
| 162 struct MyStruct { | 162 struct MyStruct { |
| 163 int32 a; | 163 int32 a; |
| 164 double b; | 164 double b; |
| 165 }; | 165 }; |
| 166 """ | 166 """ |
| 167 expected = ast.Mojom( | 167 expected = ast.Mojom( |
| 168 None, | 168 None, |
| 169 ast.ImportList(), | 169 ast.ImportList(), |
| 170 [('STRUCT', | 170 [('STRUCT', |
| 171 'MyStruct', | 171 'MyStruct', |
| 172 None, | 172 None, |
| 173 [('FIELD', 'int32', 'a', None, None), | 173 [ast.StructField('a', None, 'int32', None), |
| 174 ('FIELD', 'double', 'b', None, None)])]) | 174 ast.StructField('b', None, 'double', None)])]) |
| 175 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 175 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 176 | 176 |
| 177 def testMissingModuleName(self): | 177 def testMissingModuleName(self): |
| 178 """Tests an (invalid) .mojom with a missing module name.""" | 178 """Tests an (invalid) .mojom with a missing module name.""" |
| 179 | 179 |
| 180 source1 = """\ | 180 source1 = """\ |
| 181 // Missing module name. | 181 // Missing module name. |
| 182 module { | 182 module { |
| 183 struct MyStruct { | 183 struct MyStruct { |
| 184 int32 a; | 184 int32 a; |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 }; | 282 }; |
| 283 | 283 |
| 284 } // my_module | 284 } // my_module |
| 285 """ | 285 """ |
| 286 expected = ast.Mojom( | 286 expected = ast.Mojom( |
| 287 ast.Module(('IDENTIFIER', 'my_module'), None), | 287 ast.Module(('IDENTIFIER', 'my_module'), None), |
| 288 ast.ImportList(), | 288 ast.ImportList(), |
| 289 [('STRUCT', | 289 [('STRUCT', |
| 290 'MyStruct', None, | 290 'MyStruct', None, |
| 291 [ast.Const('kNumber', 'int8', '-1'), | 291 [ast.Const('kNumber', 'int8', '-1'), |
| 292 ('FIELD', 'int8', 'number', | 292 ast.StructField('number', ast.Ordinal(0), 'int8', |
| 293 ast.Ordinal(0), ('IDENTIFIER', 'kNumber'))])]) | 293 ('IDENTIFIER', 'kNumber'))])]) |
| 294 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 294 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 295 | 295 |
| 296 def testNoConditionals(self): | 296 def testNoConditionals(self): |
| 297 """Tests that ?: is not allowed.""" | 297 """Tests that ?: is not allowed.""" |
| 298 | 298 |
| 299 source = """\ | 299 source = """\ |
| 300 module my_module { | 300 module my_module { |
| 301 | 301 |
| 302 enum MyEnum { | 302 enum MyEnum { |
| 303 MY_ENUM_1 = 1 ? 2 : 3 | 303 MY_ENUM_1 = 1 ? 2 : 3 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 330 }; | 330 }; |
| 331 | 331 |
| 332 } // module my_module | 332 } // module my_module |
| 333 """ | 333 """ |
| 334 expected = ast.Mojom( | 334 expected = ast.Mojom( |
| 335 ast.Module(('IDENTIFIER', 'my_module'), None), | 335 ast.Module(('IDENTIFIER', 'my_module'), None), |
| 336 ast.ImportList(), | 336 ast.ImportList(), |
| 337 [('STRUCT', | 337 [('STRUCT', |
| 338 'MyStruct', | 338 'MyStruct', |
| 339 None, | 339 None, |
| 340 [('FIELD', 'int32', 'a0', ast.Ordinal(0), None), | 340 [ast.StructField('a0', ast.Ordinal(0), 'int32', None), |
| 341 ('FIELD', 'int32', 'a1', ast.Ordinal(1), None), | 341 ast.StructField('a1', ast.Ordinal(1), 'int32', None), |
| 342 ('FIELD', 'int32', 'a2', ast.Ordinal(2), None), | 342 ast.StructField('a2', ast.Ordinal(2), 'int32', None), |
| 343 ('FIELD', 'int32', 'a9', ast.Ordinal(9), None), | 343 ast.StructField('a9', ast.Ordinal(9), 'int32', None), |
| 344 ('FIELD', 'int32', 'a10', ast.Ordinal(10), None), | 344 ast.StructField('a10', ast.Ordinal(10), 'int32', None), |
| 345 ('FIELD', 'int32', 'a11', ast.Ordinal(11), None), | 345 ast.StructField('a11', ast.Ordinal(11), 'int32', None), |
| 346 ('FIELD', 'int32', 'a29', ast.Ordinal(29), None), | 346 ast.StructField('a29', ast.Ordinal(29), 'int32', None), |
| 347 ('FIELD', 'int32', 'a1234567890', ast.Ordinal(1234567890), None)])]) | 347 ast.StructField('a1234567890', ast.Ordinal(1234567890), 'int32', |
| 348 None)])]) |
| 348 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 349 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 349 | 350 |
| 350 def testInvalidOrdinals(self): | 351 def testInvalidOrdinals(self): |
| 351 """Tests that (lexically) invalid ordinals are correctly detected.""" | 352 """Tests that (lexically) invalid ordinals are correctly detected.""" |
| 352 | 353 |
| 353 source1 = """\ | 354 source1 = """\ |
| 354 module my_module { | 355 module my_module { |
| 355 | 356 |
| 356 struct MyStruct { | 357 struct MyStruct { |
| 357 int32 a_missing@; | 358 int32 a_missing@; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 }; | 426 }; |
| 426 | 427 |
| 427 } // module my.mod | 428 } // module my.mod |
| 428 """ | 429 """ |
| 429 expected = ast.Mojom( | 430 expected = ast.Mojom( |
| 430 ast.Module(('IDENTIFIER', 'my.mod'), None), | 431 ast.Module(('IDENTIFIER', 'my.mod'), None), |
| 431 ast.ImportList(), | 432 ast.ImportList(), |
| 432 [('STRUCT', | 433 [('STRUCT', |
| 433 'MyStruct', | 434 'MyStruct', |
| 434 None, | 435 None, |
| 435 [('FIELD', 'int32', 'a', None, None)])]) | 436 [ast.StructField('a', None, 'int32', None)])]) |
| 436 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 437 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 437 | 438 |
| 438 def testValidHandleTypes(self): | 439 def testValidHandleTypes(self): |
| 439 """Tests (valid) handle types.""" | 440 """Tests (valid) handle types.""" |
| 440 | 441 |
| 441 source = """\ | 442 source = """\ |
| 442 struct MyStruct { | 443 struct MyStruct { |
| 443 handle a; | 444 handle a; |
| 444 handle<data_pipe_consumer> b; | 445 handle<data_pipe_consumer> b; |
| 445 handle <data_pipe_producer> c; | 446 handle <data_pipe_producer> c; |
| 446 handle < message_pipe > d; | 447 handle < message_pipe > d; |
| 447 handle | 448 handle |
| 448 < shared_buffer | 449 < shared_buffer |
| 449 > e; | 450 > e; |
| 450 }; | 451 }; |
| 451 """ | 452 """ |
| 452 expected = ast.Mojom( | 453 expected = ast.Mojom( |
| 453 None, | 454 None, |
| 454 ast.ImportList(), | 455 ast.ImportList(), |
| 455 [('STRUCT', | 456 [('STRUCT', |
| 456 'MyStruct', | 457 'MyStruct', |
| 457 None, | 458 None, |
| 458 [('FIELD', 'handle', 'a', None, None), | 459 [ast.StructField('a', None, 'handle', None), |
| 459 ('FIELD', 'handle<data_pipe_consumer>', 'b', None, None), | 460 ast.StructField('b', None, 'handle<data_pipe_consumer>', None), |
| 460 ('FIELD', 'handle<data_pipe_producer>', 'c', None, None), | 461 ast.StructField('c', None, 'handle<data_pipe_producer>', None), |
| 461 ('FIELD', 'handle<message_pipe>', 'd', None, None), | 462 ast.StructField('d', None, 'handle<message_pipe>', None), |
| 462 ('FIELD', 'handle<shared_buffer>', 'e', None, None)])]) | 463 ast.StructField('e', None, 'handle<shared_buffer>', None)])]) |
| 463 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 464 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 464 | 465 |
| 465 def testInvalidHandleType(self): | 466 def testInvalidHandleType(self): |
| 466 """Tests an invalid (unknown) handle type.""" | 467 """Tests an invalid (unknown) handle type.""" |
| 467 | 468 |
| 468 source = """\ | 469 source = """\ |
| 469 struct MyStruct { | 470 struct MyStruct { |
| 470 handle<wtf_is_this> foo; | 471 handle<wtf_is_this> foo; |
| 471 }; | 472 }; |
| 472 """ | 473 """ |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 double a21 = -1.23E10; | 507 double a21 = -1.23E10; |
| 507 double a22 = +.123E10; | 508 double a22 = +.123E10; |
| 508 }; | 509 }; |
| 509 """ | 510 """ |
| 510 expected = ast.Mojom( | 511 expected = ast.Mojom( |
| 511 None, | 512 None, |
| 512 ast.ImportList(), | 513 ast.ImportList(), |
| 513 [('STRUCT', | 514 [('STRUCT', |
| 514 'MyStruct', | 515 'MyStruct', |
| 515 None, | 516 None, |
| 516 [('FIELD', 'int16', 'a0', None, '0'), | 517 [ast.StructField('a0', None, 'int16', '0'), |
| 517 ('FIELD', 'uint16', 'a1', None, '0x0'), | 518 ast.StructField('a1', None, 'uint16', '0x0'), |
| 518 ('FIELD', 'uint16', 'a2', None, '0x00'), | 519 ast.StructField('a2', None, 'uint16', '0x00'), |
| 519 ('FIELD', 'uint16', 'a3', None, '0x01'), | 520 ast.StructField('a3', None, 'uint16', '0x01'), |
| 520 ('FIELD', 'uint16', 'a4', None, '0xcd'), | 521 ast.StructField('a4', None, 'uint16', '0xcd'), |
| 521 ('FIELD', 'int32', 'a5' , None, '12345'), | 522 ast.StructField('a5' , None, 'int32', '12345'), |
| 522 ('FIELD', 'int64', 'a6', None, '-12345'), | 523 ast.StructField('a6', None, 'int64', '-12345'), |
| 523 ('FIELD', 'int64', 'a7', None, '+12345'), | 524 ast.StructField('a7', None, 'int64', '+12345'), |
| 524 ('FIELD', 'uint32', 'a8', None, '0x12cd3'), | 525 ast.StructField('a8', None, 'uint32', '0x12cd3'), |
| 525 ('FIELD', 'uint32', 'a9', None, '-0x12cD3'), | 526 ast.StructField('a9', None, 'uint32', '-0x12cD3'), |
| 526 ('FIELD', 'uint32', 'a10', None, '+0x12CD3'), | 527 ast.StructField('a10', None, 'uint32', '+0x12CD3'), |
| 527 ('FIELD', 'bool', 'a11', None, 'true'), | 528 ast.StructField('a11', None, 'bool', 'true'), |
| 528 ('FIELD', 'bool', 'a12', None, 'false'), | 529 ast.StructField('a12', None, 'bool', 'false'), |
| 529 ('FIELD', 'float', 'a13', None, '1.2345'), | 530 ast.StructField('a13', None, 'float', '1.2345'), |
| 530 ('FIELD', 'float', 'a14', None, '-1.2345'), | 531 ast.StructField('a14', None, 'float', '-1.2345'), |
| 531 ('FIELD', 'float', 'a15', None, '+1.2345'), | 532 ast.StructField('a15', None, 'float', '+1.2345'), |
| 532 ('FIELD', 'float', 'a16', None, '123.'), | 533 ast.StructField('a16', None, 'float', '123.'), |
| 533 ('FIELD', 'float', 'a17', None, '.123'), | 534 ast.StructField('a17', None, 'float', '.123'), |
| 534 ('FIELD', 'double', 'a18', None, '1.23E10'), | 535 ast.StructField('a18', None, 'double', '1.23E10'), |
| 535 ('FIELD', 'double', 'a19', None, '1.E-10'), | 536 ast.StructField('a19', None, 'double', '1.E-10'), |
| 536 ('FIELD', 'double', 'a20', None, '.5E+10'), | 537 ast.StructField('a20', None, 'double', '.5E+10'), |
| 537 ('FIELD', 'double', 'a21', None, '-1.23E10'), | 538 ast.StructField('a21', None, 'double', '-1.23E10'), |
| 538 ('FIELD', 'double', 'a22', None, '+.123E10')])]) | 539 ast.StructField('a22', None, 'double', '+.123E10')])]) |
| 539 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 540 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 540 | 541 |
| 541 def testValidFixedSizeArray(self): | 542 def testValidFixedSizeArray(self): |
| 542 """Tests parsing a fixed size array.""" | 543 """Tests parsing a fixed size array.""" |
| 543 | 544 |
| 544 source = """\ | 545 source = """\ |
| 545 struct MyStruct { | 546 struct MyStruct { |
| 546 int32[] normal_array; | 547 int32[] normal_array; |
| 547 int32[1] fixed_size_array_one_entry; | 548 int32[1] fixed_size_array_one_entry; |
| 548 int32[10] fixed_size_array_ten_entries; | 549 int32[10] fixed_size_array_ten_entries; |
| 549 }; | 550 }; |
| 550 """ | 551 """ |
| 551 expected = ast.Mojom( | 552 expected = ast.Mojom( |
| 552 None, | 553 None, |
| 553 ast.ImportList(), | 554 ast.ImportList(), |
| 554 [('STRUCT', | 555 [('STRUCT', |
| 555 'MyStruct', | 556 'MyStruct', |
| 556 None, | 557 None, |
| 557 [('FIELD', 'int32[]', 'normal_array', None, None), | 558 [ast.StructField('normal_array', None, 'int32[]', None), |
| 558 ('FIELD', 'int32[1]', 'fixed_size_array_one_entry', None, None), | 559 ast.StructField('fixed_size_array_one_entry', None, 'int32[1]', |
| 559 ('FIELD', 'int32[10]', 'fixed_size_array_ten_entries', None, | 560 None), |
| 560 None)])]) | 561 ast.StructField('fixed_size_array_ten_entries', None, 'int32[10]', |
| 562 None)])]) |
| 561 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 563 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 562 | 564 |
| 563 def testValidNestedArray(self): | 565 def testValidNestedArray(self): |
| 564 """Tests parsing a nested array.""" | 566 """Tests parsing a nested array.""" |
| 565 | 567 |
| 566 source = "struct MyStruct { int32[][] nested_array; };" | 568 source = "struct MyStruct { int32[][] nested_array; };" |
| 567 expected = ast.Mojom( | 569 expected = ast.Mojom( |
| 568 None, | 570 None, |
| 569 ast.ImportList(), | 571 ast.ImportList(), |
| 570 [('STRUCT', | 572 [('STRUCT', |
| 571 'MyStruct', | 573 'MyStruct', |
| 572 None, | 574 None, |
| 573 [('FIELD', 'int32[][]', 'nested_array', None, None)])]) | 575 [ast.StructField('nested_array', None, 'int32[][]', None)])]) |
| 574 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 576 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 575 | 577 |
| 576 def testInvalidFixedArraySize(self): | 578 def testInvalidFixedArraySize(self): |
| 577 """Tests that invalid fixed array bounds are correctly detected.""" | 579 """Tests that invalid fixed array bounds are correctly detected.""" |
| 578 | 580 |
| 579 source1 = """\ | 581 source1 = """\ |
| 580 struct MyStruct { | 582 struct MyStruct { |
| 581 int32[0] zero_size_array; | 583 int32[0] zero_size_array; |
| 582 }; | 584 }; |
| 583 """ | 585 """ |
| (...skipping 30 matching lines...) Expand all Loading... |
| 614 | 616 |
| 615 source1 = "interface MyInterface { MyMethod(int32 a); };" | 617 source1 = "interface MyInterface { MyMethod(int32 a); };" |
| 616 expected1 = ast.Mojom( | 618 expected1 = ast.Mojom( |
| 617 None, | 619 None, |
| 618 ast.ImportList(), | 620 ast.ImportList(), |
| 619 [('INTERFACE', | 621 [('INTERFACE', |
| 620 'MyInterface', | 622 'MyInterface', |
| 621 None, | 623 None, |
| 622 [('METHOD', | 624 [('METHOD', |
| 623 'MyMethod', | 625 'MyMethod', |
| 624 ast.ParameterList(ast.Parameter('int32', 'a', None)), | 626 ast.ParameterList(ast.Parameter('a', None, 'int32')), |
| 625 None, | 627 None, |
| 626 None)])]) | 628 None)])]) |
| 627 self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1) | 629 self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1) |
| 628 | 630 |
| 629 source2 = """\ | 631 source2 = """\ |
| 630 interface MyInterface { | 632 interface MyInterface { |
| 631 MyMethod1@0(int32 a@0, int64 b@1); | 633 MyMethod1@0(int32 a@0, int64 b@1); |
| 632 MyMethod2@1() => (); | 634 MyMethod2@1() => (); |
| 633 }; | 635 }; |
| 634 """ | 636 """ |
| 635 expected2 = ast.Mojom( | 637 expected2 = ast.Mojom( |
| 636 None, | 638 None, |
| 637 ast.ImportList(), | 639 ast.ImportList(), |
| 638 [('INTERFACE', | 640 [('INTERFACE', |
| 639 'MyInterface', | 641 'MyInterface', |
| 640 None, | 642 None, |
| 641 [('METHOD', | 643 [('METHOD', |
| 642 'MyMethod1', | 644 'MyMethod1', |
| 643 ast.ParameterList([ast.Parameter('int32', 'a', ast.Ordinal(0)), | 645 ast.ParameterList([ast.Parameter('a', ast.Ordinal(0), 'int32'), |
| 644 ast.Parameter('int64', 'b', ast.Ordinal(1))]), | 646 ast.Parameter('b', ast.Ordinal(1), 'int64')]), |
| 645 ast.Ordinal(0), | 647 ast.Ordinal(0), |
| 646 None), | 648 None), |
| 647 ('METHOD', | 649 ('METHOD', |
| 648 'MyMethod2', | 650 'MyMethod2', |
| 649 ast.ParameterList(), | 651 ast.ParameterList(), |
| 650 ast.Ordinal(1), | 652 ast.Ordinal(1), |
| 651 ast.ParameterList())])]) | 653 ast.ParameterList())])]) |
| 652 self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2) | 654 self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2) |
| 653 | 655 |
| 654 source3 = """\ | 656 source3 = """\ |
| 655 interface MyInterface { | 657 interface MyInterface { |
| 656 MyMethod(string a) => (int32 a, bool b); | 658 MyMethod(string a) => (int32 a, bool b); |
| 657 }; | 659 }; |
| 658 """ | 660 """ |
| 659 expected3 = ast.Mojom( | 661 expected3 = ast.Mojom( |
| 660 None, | 662 None, |
| 661 ast.ImportList(), | 663 ast.ImportList(), |
| 662 [('INTERFACE', | 664 [('INTERFACE', |
| 663 'MyInterface', | 665 'MyInterface', |
| 664 None, | 666 None, |
| 665 [('METHOD', | 667 [('METHOD', |
| 666 'MyMethod', | 668 'MyMethod', |
| 667 ast.ParameterList(ast.Parameter('string', 'a', None)), | 669 ast.ParameterList(ast.Parameter('a', None, 'string')), |
| 668 None, | 670 None, |
| 669 ast.ParameterList([ast.Parameter('int32', 'a', None), | 671 ast.ParameterList([ast.Parameter('a', None, 'int32'), |
| 670 ast.Parameter('bool', 'b', None)]))])]) | 672 ast.Parameter('b', None, 'bool')]))])]) |
| 671 self.assertEquals(parser.Parse(source3, "my_file.mojom"), expected3) | 673 self.assertEquals(parser.Parse(source3, "my_file.mojom"), expected3) |
| 672 | 674 |
| 673 def testInvalidMethods(self): | 675 def testInvalidMethods(self): |
| 674 """Tests that invalid method declarations are correctly detected.""" | 676 """Tests that invalid method declarations are correctly detected.""" |
| 675 | 677 |
| 676 # No trailing commas. | 678 # No trailing commas. |
| 677 source1 = """\ | 679 source1 = """\ |
| 678 interface MyInterface { | 680 interface MyInterface { |
| 679 MyMethod(string a,); | 681 MyMethod(string a,); |
| 680 }; | 682 }; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 821 """ | 823 """ |
| 822 with self.assertRaisesRegexp( | 824 with self.assertRaisesRegexp( |
| 823 parser.ParseError, | 825 parser.ParseError, |
| 824 r"^my_file\.mojom:2: Error: Unexpected 'module':\n" | 826 r"^my_file\.mojom:2: Error: Unexpected 'module':\n" |
| 825 r" *module {}$"): | 827 r" *module {}$"): |
| 826 parser.Parse(source2, "my_file.mojom") | 828 parser.Parse(source2, "my_file.mojom") |
| 827 | 829 |
| 828 | 830 |
| 829 if __name__ == "__main__": | 831 if __name__ == "__main__": |
| 830 unittest.main() | 832 unittest.main() |
| OLD | NEW |