ast: add unittest
This commit is contained in:
parent
54511b4a0f
commit
210b57a136
|
@ -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')
|
||||
|
|
|
@ -13,7 +13,7 @@ test_bool = not test_bool
|
|||
set_variable('list_test_plusassign', [])
|
||||
list_test_plusassign += ['bugs everywhere']
|
||||
|
||||
if false
|
||||
if not true
|
||||
vers_str = '<=99.9.9'
|
||||
dependency('somethingthatdoesnotexist', required: true, version: '>=1.2.3')
|
||||
dependency('look_i_have_a_fallback', version: ['>=1.0.0', vers_str], fallback: ['oh_no', 'the_subproject_does_not_exist'])
|
||||
|
@ -26,7 +26,7 @@ var1 = '1'
|
|||
var2 = 2.to_string()
|
||||
var3 = 'test3'
|
||||
|
||||
t1 = executable('test' + var1, ['t1.cpp'], link_with: [sharedlib], install: true, build_by_default: get_option('test_opt2'))
|
||||
t1 = executable('test' + var1, ['t1.cpp'], link_with: [sharedlib], install: not false, build_by_default: get_option('test_opt2'))
|
||||
t2 = executable('test@0@'.format('@0@'.format(var2)), sources: ['t2.cpp'], link_with: [staticlib])
|
||||
t3 = executable(var3, 't3.cpp', link_with: [sharedlib, staticlib], dependencies: [dep1])
|
||||
|
||||
|
@ -46,3 +46,16 @@ message(osmesa_lib_name) # Infinite recursion gets triggered here when the param
|
|||
test('test case 1', t1)
|
||||
test('test case 2', t2)
|
||||
benchmark('benchmark 1', t3)
|
||||
|
||||
### Stuff to test the AST JSON printer
|
||||
foreach x : ['a', 'b', 'c']
|
||||
if x == 'a'
|
||||
message('a')
|
||||
elif x == 'b'
|
||||
message('a')
|
||||
else
|
||||
continue
|
||||
endif
|
||||
break
|
||||
continue
|
||||
endforeach
|
||||
|
|
Loading…
Reference in New Issue