1 #!/usr/bin/env python2
2 # Copyright 2016 Andy Chu. All rights reserved.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 """
9 bool_parse_test.py: Tests for bool_parse.py
10 """
11
12 import unittest
13
14 from _devbuild.gen.id_kind_asdl import Id
15 from _devbuild.gen.syntax_asdl import bool_expr_e
16 from _devbuild.gen.types_asdl import lex_mode_e
17 from core import test_lib
18 from osh import bool_parse # module under test
19
20
21 def _ReadWords(w_parser):
22 words = []
23 while True:
24 w = w_parser.ReadWord(lex_mode_e.DBracket)
25 if w.Type() == Id.Eof_Real:
26 break
27 words.append(w)
28 print('')
29 print('words:', words)
30
31 return words
32
33
34 def _MakeParser(code_str):
35 # NOTE: We need the extra ]] token
36 arena = test_lib.MakeArena('<bool_parse_test.py>')
37 w_parser = test_lib.InitWordParser(code_str + ' ]]', arena=arena)
38 w_parser._SetNext(lex_mode_e.DBracket) # for tests only
39 p = bool_parse.BoolParser(w_parser)
40 p._Next()
41 return p
42
43
44 class BoolParserTest(unittest.TestCase):
45 def testParseFactor(self):
46 p = _MakeParser('foo')
47 print(p.ParseFactor())
48 self.assertTrue(p._TestAtEnd())
49
50 p = _MakeParser('$foo"bar"')
51 print(p.ParseFactor())
52 self.assertTrue(p._TestAtEnd())
53
54 p = _MakeParser('-z foo')
55 print('-------------')
56 node = p.ParseFactor()
57 print(node)
58 self.assertTrue(p._TestAtEnd())
59 self.assertEqual(bool_expr_e.Unary, node.tag())
60
61 p = _MakeParser('foo == bar')
62 node = p.ParseFactor()
63 print(node)
64 self.assertTrue(p._TestAtEnd())
65 self.assertEqual(bool_expr_e.Binary, node.tag())
66
67 def testParseNegatedFactor(self):
68 p = _MakeParser('foo')
69 node = p.ParseNegatedFactor()
70 print(node)
71 self.assertTrue(p._TestAtEnd())
72 self.assertEqual(bool_expr_e.WordTest, node.tag())
73
74 p = _MakeParser('! foo')
75 node = p.ParseNegatedFactor()
76 print(node)
77 self.assertTrue(p._TestAtEnd())
78 self.assertEqual(bool_expr_e.LogicalNot, node.tag())
79
80 def testParseTerm(self):
81 p = _MakeParser('foo && ! bar')
82 node = p.ParseTerm()
83 print(node)
84 self.assertEqual(bool_expr_e.LogicalAnd, node.tag())
85
86 # TODO: This is an entire expression I guess
87 p = _MakeParser('foo && ! bar && baz')
88 node = p.ParseTerm()
89 print(node)
90 self.assertEqual(bool_expr_e.LogicalAnd, node.tag())
91
92 p = _MakeParser('-z foo && -z bar')
93 node = p.ParseTerm()
94 print(node)
95 self.assertEqual(bool_expr_e.LogicalAnd, node.tag())
96
97 def testParseExpr(self):
98 p = _MakeParser('foo || ! bar')
99 node = p.ParseExpr()
100 print(node)
101 self.assertEqual(bool_expr_e.LogicalOr, node.tag())
102
103 p = _MakeParser('a == b')
104 print(p.ParseExpr())
105
106 def testParseFactorInParens(self):
107 p = _MakeParser('( foo == bar )')
108 node = p.ParseFactor()
109 print(node)
110 self.assertTrue(p._TestAtEnd())
111 self.assertEqual(bool_expr_e.Binary, node.tag())
112
113 def testParseParenthesized(self):
114 p = _MakeParser('zoo && ( foo == bar )')
115 node = p.ParseExpr()
116 print(node)
117 self.assertEqual(bool_expr_e.LogicalAnd, node.tag())
118
119
120 if __name__ == '__main__':
121 unittest.main()