import unittest from crowbar_reference_compiler import build_ast, parse_header, scan from crowbar_reference_compiler.ast import ArrayType, BasicType, ConstantExpression, EnumDeclaration, HeaderFile, \ PointerType, StructDeclaration, UnionDeclaration, VariableDeclaration, VariableExpression class TestAST(unittest.TestCase): def test_kitchen_sink(self): code = r""" struct normal { bool fake; (uint8[3])* data; } opaque struct ope; enum sample { Testing, } union robust { enum sample tag; switch (tag) { case Testing: bool testPassed; } } fragile union not_robust { int8 sample; bool nope; } """ tokens = scan(code) parse_tree = parse_header(tokens) decls = build_ast(parse_tree, []) normal = StructDeclaration('normal', [ VariableDeclaration('fake', BasicType('bool')), VariableDeclaration('data', PointerType(ArrayType(BasicType('uint8'), ConstantExpression('3')))), ]) ope = StructDeclaration('ope', None) sample = EnumDeclaration('sample', [('Testing', None)]) robust = UnionDeclaration('robust', VariableDeclaration('tag', BasicType('enum sample')), [(VariableExpression('Testing'), VariableDeclaration('testPassed', BasicType('bool')))]) not_robust = UnionDeclaration('not_robust', None, [ VariableDeclaration('sample', BasicType('int8')), VariableDeclaration('nope', BasicType('bool')), ]) self.assertEqual(decls, HeaderFile([], [normal, ope, sample, robust, not_robust])) if __name__ == '__main__': unittest.main()