diff options
author | Melody Horn <melody@boringcactus.com> | 2020-11-04 19:24:09 -0700 |
---|---|---|
committer | Melody Horn <melody@boringcactus.com> | 2020-11-04 19:24:09 -0700 |
commit | 35979953a534bcdb2185de0a934e7937f319d687 (patch) | |
tree | be860937aae0aa46c486222e77d1e6db61d58206 /tests/test_ast.py | |
parent | eaf789901101b8958c2555a0af300d7471707fea (diff) | |
download | reference-compiler-35979953a534bcdb2185de0a934e7937f319d687.tar.gz reference-compiler-35979953a534bcdb2185de0a934e7937f319d687.zip |
switch from specific declarations to generic AST
Diffstat (limited to 'tests/test_ast.py')
-rw-r--r-- | tests/test_ast.py | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/tests/test_ast.py b/tests/test_ast.py new file mode 100644 index 0000000..b2c592d --- /dev/null +++ b/tests/test_ast.py @@ -0,0 +1,54 @@ +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() |