1 | #!/usr/bin/env python2
|
2 | """gen_python_test.py."""
|
3 | from __future__ import print_function
|
4 |
|
5 | import unittest
|
6 |
|
7 | from asdl import pybase
|
8 |
|
9 | from _devbuild.gen import typed_demo_asdl
|
10 | from _devbuild.gen.typed_arith_asdl import arith_expr, arith_expr_e
|
11 | from _devbuild.gen.typed_demo_asdl import (source_location, flag_type,
|
12 | flag_type_str, op_id_e, op_id_str,
|
13 | cflow, cflow_t, Strings, Dicts,
|
14 | Maybes, op_array)
|
15 |
|
16 |
|
17 | class ArithAstTest(unittest.TestCase):
|
18 |
|
19 | def testPrettyPrint(self):
|
20 | s = op_id_str(op_id_e.Plus)
|
21 | self.assertEqual('op_id.Plus', s)
|
22 | print(s)
|
23 |
|
24 | obj = flag_type.Bool
|
25 | s = flag_type_str(obj.tag())
|
26 |
|
27 | self.assertEqual('flag_type.Bool', s)
|
28 | print(s)
|
29 |
|
30 | s = flag_type_str(obj.tag(), dot=False)
|
31 | self.assertEqual('Bool', s)
|
32 | print(s)
|
33 |
|
34 | def testStringDefaults(self):
|
35 | st = Strings('', '')
|
36 | self.assertEqual('', st.required)
|
37 | self.assertEqual('', st.optional)
|
38 |
|
39 | # ZERO ARG "constructor" (static method)
|
40 | st = Strings.CreateNull(alloc_lists=True)
|
41 | self.assertEqual('', st.required)
|
42 | self.assertEqual(None, st.optional)
|
43 |
|
44 | # N arg constructor with None
|
45 | st = Strings('', None)
|
46 | self.assertEqual('', st.required)
|
47 | self.assertEqual(None, st.optional)
|
48 |
|
49 | def testArrayDefault(self):
|
50 | obj = op_array.CreateNull()
|
51 | self.assertEqual(None, obj.ops)
|
52 |
|
53 | obj = op_array.CreateNull(alloc_lists=True)
|
54 | self.assertEqual([], obj.ops)
|
55 |
|
56 | def testMapDefault(self):
|
57 | # TODO: alloc_dicts=True
|
58 | obj = Dicts.CreateNull(alloc_lists=True)
|
59 | self.assertEqual(None, obj.ss)
|
60 |
|
61 | def testOptionalDefault(self):
|
62 | obj = Maybes.CreateNull(alloc_lists=True)
|
63 |
|
64 | # These are None
|
65 | self.assertEqual(None, obj.op)
|
66 | self.assertEqual(None, obj.arg)
|
67 |
|
68 | def testFieldDefaults(self):
|
69 | s = arith_expr.Slice.CreateNull(alloc_lists=True)
|
70 | s.a = arith_expr.Var('foo')
|
71 | self.assertEqual(None, s.begin)
|
72 | self.assertEqual(None, s.end)
|
73 | self.assertEqual(None, s.stride)
|
74 | print(s)
|
75 |
|
76 | func = arith_expr.FuncCall.CreateNull(alloc_lists=True)
|
77 | func.name = 'f'
|
78 | self.assertEqual([], func.args)
|
79 | print(func)
|
80 |
|
81 | def testExtraFields(self):
|
82 | v = arith_expr.Var('z')
|
83 |
|
84 | # TODO: Attach this to EVERY non-simple constructor? Those are subclasses
|
85 | # of Sum types.
|
86 | # What about product types?
|
87 | #print(v.xspans)
|
88 |
|
89 | def testConstructor(self):
|
90 | n1 = arith_expr.Var('x')
|
91 | n2 = arith_expr.Var(name='y')
|
92 | print(n1)
|
93 | print(n2)
|
94 |
|
95 | # Not good because not assigned?
|
96 | n3 = arith_expr.Var.CreateNull(alloc_lists=True)
|
97 |
|
98 | # NOTE: You cannot instantiate a product type directly? It's just used for
|
99 | # type checking. What about OCaml?
|
100 | # That means you just need to create classes for the records (arith_expr.Constructor).
|
101 | # They all descend from Obj. They don't need
|
102 |
|
103 | n3 = arith_expr.Var.CreateNull(alloc_lists=True)
|
104 | try:
|
105 | n4 = arith_expr.Var('x', name='X')
|
106 | except TypeError as e:
|
107 | pass
|
108 | else:
|
109 | raise AssertionError("Should have failed")
|
110 |
|
111 | def testProductType(self):
|
112 | print()
|
113 | print('-- PRODUCT --')
|
114 | print()
|
115 |
|
116 | s = source_location.CreateNull(alloc_lists=True)
|
117 | s.path = 'hi'
|
118 | s.line = 1
|
119 | s.col = 2
|
120 | s.length = 3
|
121 | print(s)
|
122 |
|
123 | # Implementation detail for dynamic type checking
|
124 | assert isinstance(s, pybase.CompoundObj)
|
125 |
|
126 | def testSimpleSumType(self):
|
127 | # TODO: Should be op_id_i.Plus -- instance
|
128 | # Should be op_id_s.Plus
|
129 |
|
130 | print()
|
131 | print('-- SIMPLE SUM --')
|
132 | print()
|
133 |
|
134 | o = op_id_e.Plus
|
135 | assert isinstance(o, pybase.SimpleObj)
|
136 |
|
137 | def testCompoundSumType(self):
|
138 | print()
|
139 | print('-- COMPOUND SUM --')
|
140 | print()
|
141 |
|
142 | c = cflow.Break
|
143 | assert isinstance(c, typed_demo_asdl.cflow__Break)
|
144 | assert isinstance(c, cflow_t)
|
145 | assert isinstance(c, pybase.CompoundObj)
|
146 |
|
147 | def testOtherTypes(self):
|
148 | c = arith_expr.Const(66)
|
149 | print(c)
|
150 |
|
151 | sl = arith_expr.Slice(
|
152 | arith_expr.Const(1),
|
153 | arith_expr.Const(5),
|
154 | arith_expr.Const(2),
|
155 | arith_expr.Const(3),
|
156 | )
|
157 | print(sl)
|
158 |
|
159 | print((op_id_e.Plus))
|
160 |
|
161 | # Class for sum type
|
162 | print(arith_expr)
|
163 |
|
164 | # Invalid because only half were assigned
|
165 | #print(arith_expr.Binary(op_id_e.Plus, arith_expr.Const(5)))
|
166 |
|
167 | n = arith_expr.Binary.CreateNull(alloc_lists=True)
|
168 | #n.CheckUnassigned()
|
169 | n.op_id = op_id_e.Plus
|
170 | n.left = arith_expr.Const(5)
|
171 | #n.CheckUnassigned()
|
172 | n.right = arith_expr.Const(6)
|
173 | #n.CheckUnassigned()
|
174 |
|
175 | self.assertEqual(arith_expr_e.Const, c.tag())
|
176 | self.assertEqual(arith_expr_e.Binary, n.tag())
|
177 |
|
178 |
|
179 | if __name__ == '__main__':
|
180 | unittest.main()
|