OILS
/
frontend
/
typed_args_test.py
1 |
#!/usr/bin/env python2
|
2 |
"""
|
3 |
typed_args_test.py: Tests for typed_args.py
|
4 |
"""
|
5 |
|
6 |
import unittest
|
7 |
|
8 |
from _devbuild.gen.runtime_asdl import value
|
9 |
from core import error
|
10 |
from frontend import typed_args # module under test
|
11 |
|
12 |
from typing import cast
|
13 |
|
14 |
|
15 |
class TypedArgsTest(unittest.TestCase):
|
16 |
def testReaderPosArgs(self):
|
17 |
# Not enough args...
|
18 |
reader = typed_args.Reader([], {})
|
19 |
self.assertRaises(error.TypeErrVerbose, reader.PosStr)
|
20 |
|
21 |
pos_args = [
|
22 |
value.Int(0xc0ffee),
|
23 |
value.Str('foo'),
|
24 |
value.List([value.Int(1), value.Int(2), value.Int(3)]),
|
25 |
value.Dict({'a': value.Int(0xaa), 'b': value.Int(0xbb)}),
|
26 |
value.Float(3.14),
|
27 |
value.Int(0xdead),
|
28 |
value.Int(0xbeef),
|
29 |
value.Str('bar'),
|
30 |
]
|
31 |
reader = typed_args.Reader(list(pos_args), {})
|
32 |
|
33 |
# Haven't processed any args yet...
|
34 |
self.assertRaises(error.TypeErrVerbose, reader.Done)
|
35 |
|
36 |
# Arg is wrong type...
|
37 |
self.assertRaises(error.TypeErrVerbose, reader.PosStr)
|
38 |
|
39 |
# Normal operation from here on
|
40 |
reader = typed_args.Reader(pos_args, {})
|
41 |
arg = reader.PosInt()
|
42 |
self.assertEqual(0xc0ffee, arg)
|
43 |
|
44 |
arg = reader.PosStr()
|
45 |
self.assertEqual('foo', arg)
|
46 |
|
47 |
arg = reader.PosList()
|
48 |
self.assertEqual(1, cast(value.Int, arg[0]).i)
|
49 |
self.assertEqual(2, cast(value.Int, arg[1]).i)
|
50 |
self.assertEqual(3, cast(value.Int, arg[2]).i)
|
51 |
|
52 |
arg = reader.PosDict()
|
53 |
self.assertIn('a', arg)
|
54 |
self.assertEqual(0xaa, arg['a'].i)
|
55 |
self.assertIn('b', arg)
|
56 |
self.assertEqual(0xbb, arg['b'].i)
|
57 |
|
58 |
arg = reader.PosFloat()
|
59 |
self.assertEqual(3.14, arg)
|
60 |
|
61 |
rest = reader.RestPos()
|
62 |
self.assertEqual(3, len(rest))
|
63 |
self.assertEqual(0xdead, rest[0].i)
|
64 |
self.assertEqual(0xbeef, rest[1].i)
|
65 |
self.assertEqual('bar', rest[2].s)
|
66 |
|
67 |
reader.Done()
|
68 |
|
69 |
def testReaderKwargs(self):
|
70 |
kwargs = {
|
71 |
'hot': value.Int(0xc0ffee),
|
72 |
'name': value.Str('foo'),
|
73 |
'numbers': value.List([value.Int(1), value.Int(2), value.Int(3)]),
|
74 |
'blah': value.Dict({'a': value.Int(0xaa), 'b': value.Int(0xbb)}),
|
75 |
'pi': value.Float(3.14),
|
76 |
'a': value.Int(0xdead),
|
77 |
'b': value.Int(0xbeef),
|
78 |
'c': value.Str('bar'),
|
79 |
}
|
80 |
reader = typed_args.Reader([], kwargs)
|
81 |
|
82 |
# Haven't processed any args yet...
|
83 |
self.assertRaises(error.TypeErrVerbose, reader.Done)
|
84 |
|
85 |
arg = reader.NamedInt('hot', -1)
|
86 |
self.assertEqual(0xc0ffee, arg)
|
87 |
|
88 |
arg = reader.NamedStr('name', '')
|
89 |
self.assertEqual('foo', arg)
|
90 |
|
91 |
arg = reader.NamedList('numbers', [])
|
92 |
self.assertEqual(1, cast(value.Int, arg[0]).i)
|
93 |
self.assertEqual(2, cast(value.Int, arg[1]).i)
|
94 |
self.assertEqual(3, cast(value.Int, arg[2]).i)
|
95 |
|
96 |
arg = reader.NamedDict('blah', {})
|
97 |
self.assertIn('a', arg)
|
98 |
self.assertEqual(0xaa, arg['a'].i)
|
99 |
self.assertIn('b', arg)
|
100 |
self.assertEqual(0xbb, arg['b'].i)
|
101 |
|
102 |
arg = reader.NamedFloat('pi', -1.0)
|
103 |
self.assertEqual(3.14, arg)
|
104 |
|
105 |
rest = reader.RestNamed()
|
106 |
self.assertEqual(3, len(rest))
|
107 |
self.assertIn('a', rest)
|
108 |
self.assertEqual(0xdead, rest['a'].i)
|
109 |
self.assertIn('b', rest)
|
110 |
self.assertEqual(0xbeef, rest['b'].i)
|
111 |
self.assertIn('c', rest)
|
112 |
self.assertEqual('bar', rest['c'].s)
|
113 |
|
114 |
|
115 |
if __name__ == '__main__':
|
116 |
unittest.main()
|