OLD | NEW |
(Empty) | |
| 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 |
| 3 # found in the LICENSE file. |
| 4 |
| 5 import imp |
| 6 import os.path |
| 7 import sys |
| 8 import unittest |
| 9 |
| 10 # Disable lint check for finding modules: |
| 11 # pylint: disable=F0401 |
| 12 |
| 13 def _GetDirAbove(dirname): |
| 14 """Returns the directory "above" this file containing |dirname| (which must |
| 15 also be "above" this file).""" |
| 16 path = os.path.abspath(__file__) |
| 17 while True: |
| 18 path, tail = os.path.split(path) |
| 19 assert tail |
| 20 if tail == dirname: |
| 21 return path |
| 22 |
| 23 try: |
| 24 imp.find_module("mojom") |
| 25 except ImportError: |
| 26 sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib")) |
| 27 import mojom.parse.ast as ast |
| 28 |
| 29 |
| 30 class _TestNode(ast.NodeBase): |
| 31 """Node type for tests.""" |
| 32 |
| 33 def __init__(self, value, **kwargs): |
| 34 super(_TestNode, self).__init__(**kwargs) |
| 35 self.value = value |
| 36 |
| 37 def __eq__(self, other): |
| 38 return super(_TestNode, self).__eq__(other) and self.value == other.value |
| 39 |
| 40 |
| 41 class _TestNodeList(ast.NodeListBase): |
| 42 """Node list type for tests.""" |
| 43 |
| 44 _list_item_type = _TestNode |
| 45 |
| 46 |
| 47 class ASTTest(unittest.TestCase): |
| 48 """Tests various AST classes.""" |
| 49 |
| 50 def testNodeBase(self): |
| 51 # Test |__eq__()|; this is only used for testing, where we want to do |
| 52 # comparison by value and ignore filenames/line numbers (for convenience). |
| 53 node1 = ast.NodeBase(filename="hello.mojom", lineno=123) |
| 54 node2 = ast.NodeBase() |
| 55 self.assertEquals(node1, node2) |
| 56 self.assertEquals(node2, node1) |
| 57 |
| 58 # Check that |__ne__()| just defers to |__eq__()| properly. |
| 59 self.assertFalse(node1 != node2) |
| 60 self.assertFalse(node2 != node1) |
| 61 |
| 62 # Check that |filename| and |lineno| are set properly (and are None by |
| 63 # default). |
| 64 self.assertEquals(node1.filename, "hello.mojom") |
| 65 self.assertEquals(node1.lineno, 123) |
| 66 self.assertIsNone(node2.filename) |
| 67 self.assertIsNone(node2.lineno) |
| 68 |
| 69 # |NodeBase|'s |__eq__()| should compare types (and a subclass's |__eq__()| |
| 70 # should first defer to its superclass's). |
| 71 node3 = _TestNode(123) |
| 72 self.assertNotEqual(node1, node3) |
| 73 self.assertNotEqual(node3, node1) |
| 74 # Also test |__eq__()| directly. |
| 75 self.assertFalse(node1 == node3) |
| 76 self.assertFalse(node3 == node1) |
| 77 |
| 78 node4 = _TestNode(123, filename="world.mojom", lineno=123) |
| 79 self.assertEquals(node4, node3) |
| 80 node5 = _TestNode(456) |
| 81 self.assertNotEquals(node5, node4) |
| 82 |
| 83 def testNodeListBase(self): |
| 84 node1 = _TestNode(1, filename="foo.mojom", lineno=1) |
| 85 # Equal to, but not the same as, |node1|: |
| 86 node1b = _TestNode(1, filename="foo.mojom", lineno=1) |
| 87 node2 = _TestNode(2, filename="foo.mojom", lineno=2) |
| 88 |
| 89 nodelist1 = _TestNodeList() # Contains: (empty). |
| 90 self.assertEquals(nodelist1, nodelist1) |
| 91 self.assertEquals(nodelist1.items, []) |
| 92 self.assertIsNone(nodelist1.filename) |
| 93 self.assertIsNone(nodelist1.lineno) |
| 94 |
| 95 nodelist2 = _TestNodeList(node1) # Contains: 1. |
| 96 self.assertEquals(nodelist2, nodelist2) |
| 97 self.assertEquals(nodelist2.items, [node1]) |
| 98 self.assertNotEqual(nodelist2, nodelist1) |
| 99 self.assertEquals(nodelist2.filename, "foo.mojom") |
| 100 self.assertEquals(nodelist2.lineno, 1) |
| 101 |
| 102 nodelist3 = _TestNodeList([node2]) # Contains: 2. |
| 103 self.assertEquals(nodelist3.items, [node2]) |
| 104 self.assertNotEqual(nodelist3, nodelist1) |
| 105 self.assertNotEqual(nodelist3, nodelist2) |
| 106 self.assertEquals(nodelist3.filename, "foo.mojom") |
| 107 self.assertEquals(nodelist3.lineno, 2) |
| 108 |
| 109 nodelist1.Append(node1b) # Contains: 1. |
| 110 self.assertEquals(nodelist1.items, [node1]) |
| 111 self.assertEquals(nodelist1, nodelist2) |
| 112 self.assertNotEqual(nodelist1, nodelist3) |
| 113 self.assertEquals(nodelist1.filename, "foo.mojom") |
| 114 self.assertEquals(nodelist1.lineno, 1) |
| 115 |
| 116 nodelist1.Append(node2) # Contains: 1, 2. |
| 117 self.assertEquals(nodelist1.items, [node1, node2]) |
| 118 self.assertNotEqual(nodelist1, nodelist2) |
| 119 self.assertNotEqual(nodelist1, nodelist3) |
| 120 self.assertEquals(nodelist1.lineno, 1) |
| 121 |
| 122 nodelist2.Append(node2) # Contains: 1, 2. |
| 123 self.assertEquals(nodelist2.items, [node1, node2]) |
| 124 self.assertEquals(nodelist2, nodelist1) |
| 125 self.assertNotEqual(nodelist2, nodelist3) |
| 126 self.assertEquals(nodelist2.lineno, 1) |
| 127 |
| 128 nodelist3.Insert(node1) # Contains: 1, 2. |
| 129 self.assertEquals(nodelist3.items, [node1, node2]) |
| 130 self.assertEquals(nodelist3, nodelist1) |
| 131 self.assertEquals(nodelist3, nodelist2) |
| 132 self.assertEquals(nodelist3.lineno, 1) |
| 133 |
| 134 # Test iteration: |
| 135 i = 1 |
| 136 for item in nodelist1: |
| 137 self.assertEquals(item.value, i) |
| 138 i += 1 |
OLD | NEW |