summaryrefslogtreecommitdiff
path: root/utils/ipc/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
blob: 62798631dbcedba3769ff1fef8849cb60f7ba118 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import imp
import os.path
import sys
import unittest

from mojom.parse import ast


class _TestNode(ast.NodeBase):
  """Node type for tests."""

  def __init__(self, value, **kwargs):
    super(_TestNode, self).__init__(**kwargs)
    self.value = value

  def __eq__(self, other):
    return super(_TestNode, self).__eq__(other) and self.value == other.value


class _TestNodeList(ast.NodeListBase):
  """Node list type for tests."""

  _list_item_type = _TestNode


class ASTTest(unittest.TestCase):
  """Tests various AST classes."""

  def testNodeBase(self):
    # Test |__eq__()|; this is only used for testing, where we want to do
    # comparison by value and ignore filenames/line numbers (for convenience).
    node1 = ast.NodeBase(filename="hello.mojom", lineno=123)
    node2 = ast.NodeBase()
    self.assertEquals(node1, node2)
    self.assertEquals(node2, node1)

    # Check that |__ne__()| just defers to |__eq__()| properly.
    self.assertFalse(node1 != node2)
    self.assertFalse(node2 != node1)

    # Check that |filename| and |lineno| are set properly (and are None by
    # default).
    self.assertEquals(node1.filename, "hello.mojom")
    self.assertEquals(node1.lineno, 123)
    self.assertIsNone(node2.filename)
    self.assertIsNone(node2.lineno)

    # |NodeBase|'s |__eq__()| should compare types (and a subclass's |__eq__()|
    # should first defer to its superclass's).
    node3 = _TestNode(123)
    self.assertNotEqual(node1, node3)
    self.assertNotEqual(node3, node1)
    # Also test |__eq__()| directly.
    self.assertFalse(node1 == node3)
    self.assertFalse(node3 == node1)

    node4 = _TestNode(123, filename="world.mojom", lineno=123)
    self.assertEquals(node4, node3)
    node5 = _TestNode(456)
    self.assertNotEquals(node5, node4)

  def testNodeListBase(self):
    node1 = _TestNode(1, filename="foo.mojom", lineno=1)
    # Equal to, but not the same as, |node1|:
    node1b = _TestNode(1, filename="foo.mojom", lineno=1)
    node2 = _TestNode(2, filename="foo.mojom", lineno=2)

    nodelist1 = _TestNodeList()  # Contains: (empty).
    self.assertEquals(nodelist1, nodelist1)
    self.assertEquals(nodelist1.items, [])
    self.assertIsNone(nodelist1.filename)
    self.assertIsNone(nodelist1.lineno)

    nodelist2 = _TestNodeList(node1)  # Contains: 1.
    self.assertEquals(nodelist2, nodelist2)
    self.assertEquals(nodelist2.items, [node1])
    self.assertNotEqual(nodelist2, nodelist1)
    self.assertEquals(nodelist2.filename, "foo.mojom")
    self.assertEquals(nodelist2.lineno, 1)

    nodelist3 = _TestNodeList([node2])  # Contains: 2.
    self.assertEquals(nodelist3.items, [node2])
    self.assertNotEqual(nodelist3, nodelist1)
    self.assertNotEqual(nodelist3, nodelist2)
    self.assertEquals(nodelist3.filename, "foo.mojom")
    self.assertEquals(nodelist3.lineno, 2)

    nodelist1.Append(node1b)  # Contains: 1.
    self.assertEquals(nodelist1.items, [node1])
    self.assertEquals(nodelist1, nodelist2)
    self.assertNotEqual(nodelist1, nodelist3)
    self.assertEquals(nodelist1.filename, "foo.mojom")
    self.assertEquals(nodelist1.lineno, 1)

    nodelist1.Append(node2)  # Contains: 1, 2.
    self.assertEquals(nodelist1.items, [node1, node2])
    self.assertNotEqual(nodelist1, nodelist2)
    self.assertNotEqual(nodelist1, nodelist3)
    self.assertEquals(nodelist1.lineno, 1)

    nodelist2.Append(node2)  # Contains: 1, 2.
    self.assertEquals(nodelist2.items, [node1, node2])
    self.assertEquals(nodelist2, nodelist1)
    self.assertNotEqual(nodelist2, nodelist3)
    self.assertEquals(nodelist2.lineno, 1)

    nodelist3.Insert(node1)  # Contains: 1, 2.
    self.assertEquals(nodelist3.items, [node1, node2])
    self.assertEquals(nodelist3, nodelist1)
    self.assertEquals(nodelist3, nodelist2)
    self.assertEquals(nodelist3.lineno, 1)

    # Test iteration:
    i = 1
    for item in nodelist1:
      self.assertEquals(item.value, i)
      i += 1