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