aboutsummaryrefslogtreecommitdiff
path: root/tests/test_ast.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_ast.py')
-rw-r--r--tests/test_ast.py54
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()