aboutsummaryrefslogtreecommitdiff
path: root/run_unittests.py
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2019-12-12 18:35:43 +0100
committerDaniel Mensinger <daniel@mensinger-ka.de>2020-05-23 18:13:25 +0200
commit210b57a136ebaa1b1cd8a4d08c536b601ba77efb (patch)
tree6de543f7ab8dc08ffde7d32f6484a09ead0612bf /run_unittests.py
parent54511b4a0f319514ecc16dc29d964187192f716d (diff)
downloadmeson-210b57a136ebaa1b1cd8a4d08c536b601ba77efb.zip
meson-210b57a136ebaa1b1cd8a4d08c536b601ba77efb.tar.gz
meson-210b57a136ebaa1b1cd8a4d08c536b601ba77efb.tar.bz2
ast: add unittest
Diffstat (limited to 'run_unittests.py')
-rwxr-xr-xrun_unittests.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/run_unittests.py b/run_unittests.py
index 651e366..7e0c403 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -4400,6 +4400,83 @@ recommended as it is not supported on some platforms''')
self.maxDiff = None
self.assertListEqual(res_nb, res_wb)
+ def test_introspect_ast_source(self):
+ testdir = os.path.join(self.unit_test_dir, '57 introspection')
+ testfile = os.path.join(testdir, 'meson.build')
+ res_nb = self.introspect_directory(testfile, ['--ast'] + self.meson_args)
+
+ node_counter = {}
+
+ def accept_node(json_node):
+ self.assertIsInstance(json_node, dict)
+ for i in ['lineno', 'colno', 'end_lineno', 'end_colno']:
+ self.assertIn(i, json_node)
+ self.assertIsInstance(json_node[i], int)
+ self.assertIn('node', json_node)
+ n = json_node['node']
+ self.assertIsInstance(n, str)
+ self.assertIn(n, nodes)
+ if n not in node_counter:
+ node_counter[n] = 0
+ node_counter[n] = node_counter[n] + 1
+ for nodeDesc in nodes[n]:
+ key = nodeDesc[0]
+ func = nodeDesc[1]
+ self.assertIn(key, json_node)
+ if func is None:
+ tp = nodeDesc[2]
+ self.assertIsInstance(json_node[key], tp)
+ continue
+ func(json_node[key])
+
+ def accept_node_list(node_list):
+ self.assertIsInstance(node_list, list)
+ for i in node_list:
+ accept_node(i)
+
+ def accept_kwargs(kwargs):
+ self.assertIsInstance(kwargs, list)
+ for i in kwargs:
+ self.assertIn('key', i)
+ self.assertIn('val', i)
+ accept_node(i['key'])
+ accept_node(i['val'])
+
+ nodes = {
+ 'BooleanNode': [('value', None, bool)],
+ 'IdNode': [('value', None, str)],
+ 'NumberNode': [('value', None, int)],
+ 'StringNode': [('value', None, str)],
+ 'ContinueNode': [],
+ 'BreakNode': [],
+ 'ArgumentNode': [('positional', accept_node_list), ('kwargs', accept_kwargs)],
+ 'ArrayNode': [('args', accept_node)],
+ 'DictNode': [('args', accept_node)],
+ 'EmptyNode': [],
+ 'OrNode': [('left', accept_node), ('right', accept_node)],
+ 'AndNode': [('left', accept_node), ('right', accept_node)],
+ 'ComparisonNode': [('left', accept_node), ('right', accept_node), ('ctype', None, str)],
+ 'ArithmeticNode': [('left', accept_node), ('right', accept_node), ('op', None, str)],
+ 'NotNode': [('right', accept_node)],
+ 'CodeBlockNode': [('lines', accept_node_list)],
+ 'IndexNode': [('object', accept_node), ('index', accept_node)],
+ 'MethodNode': [('object', accept_node), ('args', accept_node), ('name', None, str)],
+ 'FunctionNode': [('args', accept_node), ('name', None, str)],
+ 'AssignmentNode': [('value', accept_node), ('var_name', None, str)],
+ 'PlusAssignmentNode': [('value', accept_node), ('var_name', None, str)],
+ 'ForeachClauseNode': [('items', accept_node), ('block', accept_node), ('varnames', None, list)],
+ 'IfClauseNode': [('ifs', accept_node_list), ('else', accept_node)],
+ 'IfNode': [('condition', accept_node), ('block', accept_node)],
+ 'UMinusNode': [('right', accept_node)],
+ 'TernaryNode': [('condition', accept_node), ('true', accept_node), ('false', accept_node)],
+ }
+
+ accept_node(res_nb)
+
+ for n, c in [('ContinueNode', 2), ('BreakNode', 1), ('NotNode', 3)]:
+ self.assertIn(n, node_counter)
+ self.assertEqual(node_counter[n], c)
+
def test_introspect_dependencies_from_source(self):
testdir = os.path.join(self.unit_test_dir, '57 introspection')
testfile = os.path.join(testdir, 'meson.build')