| 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 23 matching lines...) Expand all Loading... |
| 34 | 34 |
| 35 def testTrivialValidSource(self): | 35 def testTrivialValidSource(self): |
| 36 """Tests a trivial, but valid, .mojom source.""" | 36 """Tests a trivial, but valid, .mojom source.""" |
| 37 | 37 |
| 38 source = """\ | 38 source = """\ |
| 39 // This is a comment. | 39 // This is a comment. |
| 40 | 40 |
| 41 module my_module { | 41 module my_module { |
| 42 } | 42 } |
| 43 """ | 43 """ |
| 44 self.assertEquals(parser.Parse(source, "my_file.mojom"), | 44 expected = [('MODULE', ('IDENTIFIER', 'my_module'), None, None)] |
| 45 [("MODULE", "my_module", None, None)]) | 45 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 46 | 46 |
| 47 def testSourceWithCrLfs(self): | 47 def testSourceWithCrLfs(self): |
| 48 """Tests a .mojom source with CR-LFs instead of LFs.""" | 48 """Tests a .mojom source with CR-LFs instead of LFs.""" |
| 49 | 49 |
| 50 source = "// This is a comment.\r\n\r\nmodule my_module {\r\n}\r\n" | 50 source = "// This is a comment.\r\n\r\nmodule my_module {\r\n}\r\n" |
| 51 self.assertEquals(parser.Parse(source, "my_file.mojom"), | 51 expected = [('MODULE', ('IDENTIFIER', 'my_module'), None, None)] |
| 52 [("MODULE", "my_module", None, None)]) | 52 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 53 | 53 |
| 54 def testUnexpectedEOF(self): | 54 def testUnexpectedEOF(self): |
| 55 """Tests a "truncated" .mojom source.""" | 55 """Tests a "truncated" .mojom source.""" |
| 56 | 56 |
| 57 source = """\ | 57 source = """\ |
| 58 // This is a comment. | 58 // This is a comment. |
| 59 | 59 |
| 60 module my_module { | 60 module my_module { |
| 61 """ | 61 """ |
| 62 with self.assertRaisesRegexp( | 62 with self.assertRaisesRegexp( |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 | 134 |
| 135 struct MyStruct { | 135 struct MyStruct { |
| 136 int32 a; | 136 int32 a; |
| 137 double b; | 137 double b; |
| 138 }; | 138 }; |
| 139 | 139 |
| 140 } // module my_module | 140 } // module my_module |
| 141 """ | 141 """ |
| 142 expected = \ | 142 expected = \ |
| 143 [('MODULE', | 143 [('MODULE', |
| 144 'my_module', | 144 ('IDENTIFIER', 'my_module'), |
| 145 None, | 145 None, |
| 146 [('STRUCT', | 146 [('STRUCT', |
| 147 'MyStruct', | 147 'MyStruct', |
| 148 None, | 148 None, |
| 149 [('FIELD', 'int32', 'a', ast.Ordinal(None), None), | 149 [('FIELD', 'int32', 'a', ast.Ordinal(None), None), |
| 150 ('FIELD', 'double', 'b', ast.Ordinal(None), None)])])] | 150 ('FIELD', 'double', 'b', ast.Ordinal(None), None)])])] |
| 151 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 151 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 152 | 152 |
| 153 def testSimpleStructWithoutModule(self): | 153 def testSimpleStructWithoutModule(self): |
| 154 """Tests a simple struct without an enclosing module.""" | 154 """Tests a simple struct without an enclosing module.""" |
| 155 | 155 |
| 156 source = """\ | 156 source = """\ |
| 157 struct MyStruct { | 157 struct MyStruct { |
| 158 int32 a; | 158 int32 a; |
| 159 double b; | 159 double b; |
| 160 }; | 160 }; |
| 161 """ | 161 """ |
| 162 expected = \ | 162 expected = \ |
| 163 [('MODULE', | 163 [('MODULE', |
| 164 '', | 164 None, |
| 165 None, | 165 None, |
| 166 [('STRUCT', | 166 [('STRUCT', |
| 167 'MyStruct', | 167 'MyStruct', |
| 168 None, | 168 None, |
| 169 [('FIELD', 'int32', 'a', ast.Ordinal(None), None), | 169 [('FIELD', 'int32', 'a', ast.Ordinal(None), None), |
| 170 ('FIELD', 'double', 'b', ast.Ordinal(None), None)])])] | 170 ('FIELD', 'double', 'b', ast.Ordinal(None), None)])])] |
| 171 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 171 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 172 | 172 |
| 173 def testMissingModuleName(self): | 173 def testMissingModuleName(self): |
| 174 """Tests an (invalid) .mojom with a missing module name.""" | 174 """Tests an (invalid) .mojom with a missing module name.""" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 VALUE3 = + 987, // Check that space is allowed. | 212 VALUE3 = + 987, // Check that space is allowed. |
| 213 VALUE4 = 0xAF12, | 213 VALUE4 = 0xAF12, |
| 214 VALUE5 = -0x09bcd, | 214 VALUE5 = -0x09bcd, |
| 215 VALUE6 = VALUE5, | 215 VALUE6 = VALUE5, |
| 216 VALUE7, // Leave trailing comma. | 216 VALUE7, // Leave trailing comma. |
| 217 }; | 217 }; |
| 218 } // my_module | 218 } // my_module |
| 219 """ | 219 """ |
| 220 expected = \ | 220 expected = \ |
| 221 [('MODULE', | 221 [('MODULE', |
| 222 'my_module', | 222 ('IDENTIFIER', 'my_module'), |
| 223 None, | 223 None, |
| 224 [('ENUM', | 224 [('ENUM', |
| 225 'MyEnum1', | 225 'MyEnum1', |
| 226 [('ENUM_VALUE', 'VALUE1', None), | 226 [('ENUM_VALUE', 'VALUE1', None), |
| 227 ('ENUM_VALUE', 'VALUE2', None)]), | 227 ('ENUM_VALUE', 'VALUE2', None)]), |
| 228 ('ENUM', | 228 ('ENUM', |
| 229 'MyEnum2', | 229 'MyEnum2', |
| 230 [('ENUM_VALUE', 'VALUE1', '-1'), | 230 [('ENUM_VALUE', 'VALUE1', '-1'), |
| 231 ('ENUM_VALUE', 'VALUE2', '0'), | 231 ('ENUM_VALUE', 'VALUE2', '0'), |
| 232 ('ENUM_VALUE', 'VALUE3', '+987'), | 232 ('ENUM_VALUE', 'VALUE3', '+987'), |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 | 274 |
| 275 struct MyStruct { | 275 struct MyStruct { |
| 276 const int8 kNumber = -1; | 276 const int8 kNumber = -1; |
| 277 int8 number@0 = kNumber; | 277 int8 number@0 = kNumber; |
| 278 }; | 278 }; |
| 279 | 279 |
| 280 } // my_module | 280 } // my_module |
| 281 """ | 281 """ |
| 282 expected = \ | 282 expected = \ |
| 283 [('MODULE', | 283 [('MODULE', |
| 284 'my_module', | 284 ('IDENTIFIER', 'my_module'), |
| 285 None, | 285 None, |
| 286 [('STRUCT', | 286 [('STRUCT', |
| 287 'MyStruct', None, | 287 'MyStruct', None, |
| 288 [('CONST', 'int8', 'kNumber', '-1'), | 288 [('CONST', 'int8', 'kNumber', '-1'), |
| 289 ('FIELD', 'int8', 'number', | 289 ('FIELD', 'int8', 'number', |
| 290 ast.Ordinal(0), ('IDENTIFIER', 'kNumber'))])])] | 290 ast.Ordinal(0), ('IDENTIFIER', 'kNumber'))])])] |
| 291 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 291 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 292 | 292 |
| 293 def testNoConditionals(self): | 293 def testNoConditionals(self): |
| 294 """Tests that ?: is not allowed.""" | 294 """Tests that ?: is not allowed.""" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 323 int32 a10 @10; | 323 int32 a10 @10; |
| 324 int32 a11 @11; | 324 int32 a11 @11; |
| 325 int32 a29 @29; | 325 int32 a29 @29; |
| 326 int32 a1234567890 @1234567890; | 326 int32 a1234567890 @1234567890; |
| 327 }; | 327 }; |
| 328 | 328 |
| 329 } // module my_module | 329 } // module my_module |
| 330 """ | 330 """ |
| 331 expected = \ | 331 expected = \ |
| 332 [('MODULE', | 332 [('MODULE', |
| 333 'my_module', | 333 ('IDENTIFIER', 'my_module'), |
| 334 None, | 334 None, |
| 335 [('STRUCT', | 335 [('STRUCT', |
| 336 'MyStruct', | 336 'MyStruct', |
| 337 None, | 337 None, |
| 338 [('FIELD', 'int32', 'a0', ast.Ordinal(0), None), | 338 [('FIELD', 'int32', 'a0', ast.Ordinal(0), None), |
| 339 ('FIELD', 'int32', 'a1', ast.Ordinal(1), None), | 339 ('FIELD', 'int32', 'a1', ast.Ordinal(1), None), |
| 340 ('FIELD', 'int32', 'a2', ast.Ordinal(2), None), | 340 ('FIELD', 'int32', 'a2', ast.Ordinal(2), None), |
| 341 ('FIELD', 'int32', 'a9', ast.Ordinal(9), None), | 341 ('FIELD', 'int32', 'a9', ast.Ordinal(9), None), |
| 342 ('FIELD', 'int32', 'a10', ast.Ordinal(10), None), | 342 ('FIELD', 'int32', 'a10', ast.Ordinal(10), None), |
| 343 ('FIELD', 'int32', 'a11', ast.Ordinal(11), None), | 343 ('FIELD', 'int32', 'a11', ast.Ordinal(11), None), |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 module my.mod { | 420 module my.mod { |
| 421 | 421 |
| 422 struct MyStruct { | 422 struct MyStruct { |
| 423 int32 a; | 423 int32 a; |
| 424 }; | 424 }; |
| 425 | 425 |
| 426 } // module my.mod | 426 } // module my.mod |
| 427 """ | 427 """ |
| 428 expected = \ | 428 expected = \ |
| 429 [('MODULE', | 429 [('MODULE', |
| 430 'my.mod', | 430 ('IDENTIFIER', 'my.mod'), |
| 431 None, | 431 None, |
| 432 [('STRUCT', | 432 [('STRUCT', |
| 433 'MyStruct', | 433 'MyStruct', |
| 434 None, | 434 None, |
| 435 [('FIELD', 'int32', 'a', ast.Ordinal(None), None)])])] | 435 [('FIELD', 'int32', 'a', ast.Ordinal(None), None)])])] |
| 436 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 436 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 437 | 437 |
| 438 def testValidHandleTypes(self): | 438 def testValidHandleTypes(self): |
| 439 """Tests (valid) handle types.""" | 439 """Tests (valid) handle types.""" |
| 440 | 440 |
| 441 source = """\ | 441 source = """\ |
| 442 struct MyStruct { | 442 struct MyStruct { |
| 443 handle a; | 443 handle a; |
| 444 handle<data_pipe_consumer> b; | 444 handle<data_pipe_consumer> b; |
| 445 handle <data_pipe_producer> c; | 445 handle <data_pipe_producer> c; |
| 446 handle < message_pipe > d; | 446 handle < message_pipe > d; |
| 447 handle | 447 handle |
| 448 < shared_buffer | 448 < shared_buffer |
| 449 > e; | 449 > e; |
| 450 }; | 450 }; |
| 451 """ | 451 """ |
| 452 expected = \ | 452 expected = \ |
| 453 [('MODULE', | 453 [('MODULE', |
| 454 '', | 454 None, |
| 455 None, | 455 None, |
| 456 [('STRUCT', | 456 [('STRUCT', |
| 457 'MyStruct', | 457 'MyStruct', |
| 458 None, | 458 None, |
| 459 [('FIELD', 'handle', 'a', ast.Ordinal(None), None), | 459 [('FIELD', 'handle', 'a', ast.Ordinal(None), None), |
| 460 ('FIELD', 'handle<data_pipe_consumer>', 'b', ast.Ordinal(None), | 460 ('FIELD', 'handle<data_pipe_consumer>', 'b', ast.Ordinal(None), |
| 461 None), | 461 None), |
| 462 ('FIELD', 'handle<data_pipe_producer>', 'c', ast.Ordinal(None), | 462 ('FIELD', 'handle<data_pipe_producer>', 'c', ast.Ordinal(None), |
| 463 None), | 463 None), |
| 464 ('FIELD', 'handle<message_pipe>', 'd', ast.Ordinal(None), None), | 464 ('FIELD', 'handle<message_pipe>', 'd', ast.Ordinal(None), None), |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 float a17 = .123; | 506 float a17 = .123; |
| 507 double a18 = 1.23E10; | 507 double a18 = 1.23E10; |
| 508 double a19 = 1.E-10; | 508 double a19 = 1.E-10; |
| 509 double a20 = .5E+10; | 509 double a20 = .5E+10; |
| 510 double a21 = -1.23E10; | 510 double a21 = -1.23E10; |
| 511 double a22 = +.123E10; | 511 double a22 = +.123E10; |
| 512 }; | 512 }; |
| 513 """ | 513 """ |
| 514 expected = \ | 514 expected = \ |
| 515 [('MODULE', | 515 [('MODULE', |
| 516 '', | 516 None, |
| 517 None, | 517 None, |
| 518 [('STRUCT', | 518 [('STRUCT', |
| 519 'MyStruct', | 519 'MyStruct', |
| 520 None, | 520 None, |
| 521 [('FIELD', 'int16', 'a0', ast.Ordinal(None), '0'), | 521 [('FIELD', 'int16', 'a0', ast.Ordinal(None), '0'), |
| 522 ('FIELD', 'uint16', 'a1', ast.Ordinal(None), '0x0'), | 522 ('FIELD', 'uint16', 'a1', ast.Ordinal(None), '0x0'), |
| 523 ('FIELD', 'uint16', 'a2', ast.Ordinal(None), '0x00'), | 523 ('FIELD', 'uint16', 'a2', ast.Ordinal(None), '0x00'), |
| 524 ('FIELD', 'uint16', 'a3', ast.Ordinal(None), '0x01'), | 524 ('FIELD', 'uint16', 'a3', ast.Ordinal(None), '0x01'), |
| 525 ('FIELD', 'uint16', 'a4', ast.Ordinal(None), '0xcd'), | 525 ('FIELD', 'uint16', 'a4', ast.Ordinal(None), '0xcd'), |
| 526 ('FIELD', 'int32', 'a5' , ast.Ordinal(None), '12345'), | 526 ('FIELD', 'int32', 'a5' , ast.Ordinal(None), '12345'), |
| (...skipping 21 matching lines...) Expand all Loading... |
| 548 | 548 |
| 549 source = """\ | 549 source = """\ |
| 550 struct MyStruct { | 550 struct MyStruct { |
| 551 int32[] normal_array; | 551 int32[] normal_array; |
| 552 int32[1] fixed_size_array_one_entry; | 552 int32[1] fixed_size_array_one_entry; |
| 553 int32[10] fixed_size_array_ten_entries; | 553 int32[10] fixed_size_array_ten_entries; |
| 554 }; | 554 }; |
| 555 """ | 555 """ |
| 556 expected = \ | 556 expected = \ |
| 557 [('MODULE', | 557 [('MODULE', |
| 558 '', | 558 None, |
| 559 None, | 559 None, |
| 560 [('STRUCT', | 560 [('STRUCT', |
| 561 'MyStruct', | 561 'MyStruct', |
| 562 None, | 562 None, |
| 563 [('FIELD', 'int32[]', 'normal_array', ast.Ordinal(None), None), | 563 [('FIELD', 'int32[]', 'normal_array', ast.Ordinal(None), None), |
| 564 ('FIELD', 'int32[1]', 'fixed_size_array_one_entry', | 564 ('FIELD', 'int32[1]', 'fixed_size_array_one_entry', |
| 565 ast.Ordinal(None), None), | 565 ast.Ordinal(None), None), |
| 566 ('FIELD', 'int32[10]', 'fixed_size_array_ten_entries', | 566 ('FIELD', 'int32[10]', 'fixed_size_array_ten_entries', |
| 567 ast.Ordinal(None), None)])])] | 567 ast.Ordinal(None), None)])])] |
| 568 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 568 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 569 | 569 |
| 570 def testValidNestedArray(self): | 570 def testValidNestedArray(self): |
| 571 """Tests parsing a nested array.""" | 571 """Tests parsing a nested array.""" |
| 572 | 572 |
| 573 source = "struct MyStruct { int32[][] nested_array; };" | 573 source = "struct MyStruct { int32[][] nested_array; };" |
| 574 expected = \ | 574 expected = \ |
| 575 [('MODULE', | 575 [('MODULE', |
| 576 '', | 576 None, |
| 577 None, | 577 None, |
| 578 [('STRUCT', | 578 [('STRUCT', |
| 579 'MyStruct', | 579 'MyStruct', |
| 580 None, | 580 None, |
| 581 [('FIELD', 'int32[][]', 'nested_array', ast.Ordinal(None), | 581 [('FIELD', 'int32[][]', 'nested_array', ast.Ordinal(None), |
| 582 None)])])] | 582 None)])])] |
| 583 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) | 583 self.assertEquals(parser.Parse(source, "my_file.mojom"), expected) |
| 584 | 584 |
| 585 def testInvalidFixedArraySize(self): | 585 def testInvalidFixedArraySize(self): |
| 586 """Tests that invalid fixed array bounds are correctly detected.""" | 586 """Tests that invalid fixed array bounds are correctly detected.""" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 617 r"^my_file\.mojom:2: Error: Unexpected 'abcdefg':\n" | 617 r"^my_file\.mojom:2: Error: Unexpected 'abcdefg':\n" |
| 618 r" *int32\[abcdefg\] not_a_number;"): | 618 r" *int32\[abcdefg\] not_a_number;"): |
| 619 parser.Parse(source3, "my_file.mojom") | 619 parser.Parse(source3, "my_file.mojom") |
| 620 | 620 |
| 621 def testValidMethod(self): | 621 def testValidMethod(self): |
| 622 """Tests parsing method declarations.""" | 622 """Tests parsing method declarations.""" |
| 623 | 623 |
| 624 source1 = "interface MyInterface { MyMethod(int32 a); };" | 624 source1 = "interface MyInterface { MyMethod(int32 a); };" |
| 625 expected1 = \ | 625 expected1 = \ |
| 626 [('MODULE', | 626 [('MODULE', |
| 627 '', | 627 None, |
| 628 None, | 628 None, |
| 629 [('INTERFACE', | 629 [('INTERFACE', |
| 630 'MyInterface', | 630 'MyInterface', |
| 631 None, | 631 None, |
| 632 [('METHOD', | 632 [('METHOD', |
| 633 'MyMethod', | 633 'MyMethod', |
| 634 ast.ParameterList(ast.Parameter('int32', 'a', ast.Ordinal(None))), | 634 ast.ParameterList(ast.Parameter('int32', 'a', ast.Ordinal(None))), |
| 635 ast.Ordinal(None), | 635 ast.Ordinal(None), |
| 636 None)])])] | 636 None)])])] |
| 637 self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1) | 637 self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1) |
| 638 | 638 |
| 639 source2 = """\ | 639 source2 = """\ |
| 640 interface MyInterface { | 640 interface MyInterface { |
| 641 MyMethod1@0(int32 a@0, int64 b@1); | 641 MyMethod1@0(int32 a@0, int64 b@1); |
| 642 MyMethod2@1() => (); | 642 MyMethod2@1() => (); |
| 643 }; | 643 }; |
| 644 """ | 644 """ |
| 645 expected2 = \ | 645 expected2 = \ |
| 646 [('MODULE', | 646 [('MODULE', |
| 647 '', | 647 None, |
| 648 None, | 648 None, |
| 649 [('INTERFACE', | 649 [('INTERFACE', |
| 650 'MyInterface', | 650 'MyInterface', |
| 651 None, | 651 None, |
| 652 [('METHOD', | 652 [('METHOD', |
| 653 'MyMethod1', | 653 'MyMethod1', |
| 654 ast.ParameterList([ast.Parameter('int32', 'a', ast.Ordinal(0)), | 654 ast.ParameterList([ast.Parameter('int32', 'a', ast.Ordinal(0)), |
| 655 ast.Parameter('int64', 'b', ast.Ordinal(1))]), | 655 ast.Parameter('int64', 'b', ast.Ordinal(1))]), |
| 656 ast.Ordinal(0), | 656 ast.Ordinal(0), |
| 657 None), | 657 None), |
| 658 ('METHOD', | 658 ('METHOD', |
| 659 'MyMethod2', | 659 'MyMethod2', |
| 660 ast.ParameterList(), | 660 ast.ParameterList(), |
| 661 ast.Ordinal(1), | 661 ast.Ordinal(1), |
| 662 ast.ParameterList())])])] | 662 ast.ParameterList())])])] |
| 663 self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2) | 663 self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2) |
| 664 | 664 |
| 665 source3 = """\ | 665 source3 = """\ |
| 666 interface MyInterface { | 666 interface MyInterface { |
| 667 MyMethod(string a) => (int32 a, bool b); | 667 MyMethod(string a) => (int32 a, bool b); |
| 668 }; | 668 }; |
| 669 """ | 669 """ |
| 670 expected3 = \ | 670 expected3 = \ |
| 671 [('MODULE', | 671 [('MODULE', |
| 672 '', | 672 None, |
| 673 None, | 673 None, |
| 674 [('INTERFACE', | 674 [('INTERFACE', |
| 675 'MyInterface', | 675 'MyInterface', |
| 676 None, | 676 None, |
| 677 [('METHOD', | 677 [('METHOD', |
| 678 'MyMethod', | 678 'MyMethod', |
| 679 ast.ParameterList(ast.Parameter('string', 'a', | 679 ast.ParameterList(ast.Parameter('string', 'a', |
| 680 ast.Ordinal(None))), | 680 ast.Ordinal(None))), |
| 681 ast.Ordinal(None), | 681 ast.Ordinal(None), |
| 682 ast.ParameterList([ast.Parameter('int32', 'a', ast.Ordinal(None)), | 682 ast.ParameterList([ast.Parameter('int32', 'a', ast.Ordinal(None)), |
| (...skipping 30 matching lines...) Expand all Loading... |
| 713 | 713 |
| 714 def testValidAttributes(self): | 714 def testValidAttributes(self): |
| 715 """Tests parsing attributes (and attribute lists).""" | 715 """Tests parsing attributes (and attribute lists).""" |
| 716 | 716 |
| 717 # Note: We use structs because they have (optional) attribute lists. | 717 # Note: We use structs because they have (optional) attribute lists. |
| 718 | 718 |
| 719 # Empty attribute list. | 719 # Empty attribute list. |
| 720 source1 = "[] struct MyStruct {};" | 720 source1 = "[] struct MyStruct {};" |
| 721 expected1 = \ | 721 expected1 = \ |
| 722 [('MODULE', | 722 [('MODULE', |
| 723 '', | 723 None, |
| 724 None, | 724 None, |
| 725 [('STRUCT', | 725 [('STRUCT', |
| 726 'MyStruct', | 726 'MyStruct', |
| 727 ast.AttributeList(), | 727 ast.AttributeList(), |
| 728 None)])] | 728 None)])] |
| 729 self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1) | 729 self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1) |
| 730 | 730 |
| 731 # One-element attribute list, with name value. | 731 # One-element attribute list, with name value. |
| 732 source2 = "[MyAttribute=MyName] struct MyStruct {};" | 732 source2 = "[MyAttribute=MyName] struct MyStruct {};" |
| 733 expected2 = \ | 733 expected2 = \ |
| 734 [('MODULE', | 734 [('MODULE', |
| 735 '', | 735 None, |
| 736 None, | 736 None, |
| 737 [('STRUCT', | 737 [('STRUCT', |
| 738 'MyStruct', | 738 'MyStruct', |
| 739 ast.AttributeList(ast.Attribute("MyAttribute", "MyName")), | 739 ast.AttributeList(ast.Attribute("MyAttribute", "MyName")), |
| 740 None)])] | 740 None)])] |
| 741 self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2) | 741 self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2) |
| 742 | 742 |
| 743 # Two-element attribute list, with one string value and one integer value. | 743 # Two-element attribute list, with one string value and one integer value. |
| 744 source3 = "[MyAttribute1 = \"hello\", MyAttribute2 = 5] struct MyStruct {};" | 744 source3 = "[MyAttribute1 = \"hello\", MyAttribute2 = 5] struct MyStruct {};" |
| 745 expected3 = \ | 745 expected3 = \ |
| 746 [('MODULE', | 746 [('MODULE', |
| 747 '', | 747 None, |
| 748 None, | 748 None, |
| 749 [('STRUCT', | 749 [('STRUCT', |
| 750 'MyStruct', | 750 'MyStruct', |
| 751 ast.AttributeList([ast.Attribute("MyAttribute1", "hello"), | 751 ast.AttributeList([ast.Attribute("MyAttribute1", "hello"), |
| 752 ast.Attribute("MyAttribute2", 5)]), | 752 ast.Attribute("MyAttribute2", 5)]), |
| 753 None)])] | 753 None)])] |
| 754 self.assertEquals(parser.Parse(source3, "my_file.mojom"), expected3) | 754 self.assertEquals(parser.Parse(source3, "my_file.mojom"), expected3) |
| 755 | 755 |
| 756 # TODO(vtl): Boolean attributes don't work yet. (In fact, we just |eval()| | 756 # TODO(vtl): Boolean attributes don't work yet. (In fact, we just |eval()| |
| 757 # literal (non-name) values, which is extremely dubious.) | 757 # literal (non-name) values, which is extremely dubious.) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 779 # Missing key. | 779 # Missing key. |
| 780 source3 = "[=MyName] struct MyStruct {};" | 780 source3 = "[=MyName] struct MyStruct {};" |
| 781 with self.assertRaisesRegexp( | 781 with self.assertRaisesRegexp( |
| 782 parser.ParseError, | 782 parser.ParseError, |
| 783 r"^my_file\.mojom:1: Error: Unexpected '=':\n" | 783 r"^my_file\.mojom:1: Error: Unexpected '=':\n" |
| 784 r"\[=MyName\] struct MyStruct {};$"): | 784 r"\[=MyName\] struct MyStruct {};$"): |
| 785 parser.Parse(source3, "my_file.mojom") | 785 parser.Parse(source3, "my_file.mojom") |
| 786 | 786 |
| 787 if __name__ == "__main__": | 787 if __name__ == "__main__": |
| 788 unittest.main() | 788 unittest.main() |
| OLD | NEW |