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()