OILS / osh / bool_parse_test.py View on Github | oils.pub

176 lines, 124 significant
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"""
9bool_parse_test.py: Tests for bool_parse.py
10"""
11
12import unittest
13
14from _devbuild.gen.id_kind_asdl import Id, Id_str
15from _devbuild.gen.syntax_asdl import bool_expr_e
16from _devbuild.gen.types_asdl import lex_mode_e
17from core import test_lib
18from mycpp.mylib import log
19from osh import bool_parse # module under test
20
21
22def _ReadWords(w_parser):
23 words = []
24 while True:
25 w = w_parser.ReadWord(lex_mode_e.DBracket)
26 if w.Type() == Id.Eof_Real:
27 break
28 words.append(w)
29 print('')
30 print('words:', words)
31
32 return words
33
34
35def _MakeParser(code_str):
36 print(' ----')
37 print(' CASE %s' % code_str)
38
39 # NOTE: We need the extra ]] token
40 arena = test_lib.MakeArena('<bool_parse_test.py>')
41 w_parser = test_lib.InitWordParser(code_str + ' ]]', arena=arena)
42 w_parser._SetNext(lex_mode_e.DBracket) # for tests only
43 p = bool_parse.BoolParser(w_parser)
44 p._Next()
45 return p
46
47
48class BoolParserTest(unittest.TestCase):
49
50 def testParseFactor(self):
51 p = _MakeParser('foo')
52 print(p.ParseFactor())
53 self.assertTrue(p._TestAtEnd())
54
55 p = _MakeParser('$foo"bar"')
56 print(p.ParseFactor())
57 self.assertTrue(p._TestAtEnd())
58
59 p = _MakeParser('-z foo')
60 print('-------------')
61 node = p.ParseFactor()
62 print(node)
63 self.assertTrue(p._TestAtEnd())
64 self.assertEqual(bool_expr_e.Unary, node.tag())
65
66 p = _MakeParser('foo == bar')
67 node = p.ParseFactor()
68 print(node)
69 self.assertTrue(p._TestAtEnd())
70 self.assertEqual(bool_expr_e.Binary, node.tag())
71
72 def testParseNegatedFactor(self):
73 p = _MakeParser('foo')
74 node = p.ParseNegatedFactor()
75 print(node)
76 self.assertTrue(p._TestAtEnd())
77 self.assertEqual(bool_expr_e.WordTest, node.tag())
78
79 p = _MakeParser('! foo')
80 node = p.ParseNegatedFactor()
81 print(node)
82 self.assertTrue(p._TestAtEnd())
83 self.assertEqual(bool_expr_e.LogicalNot, node.tag())
84
85 def testParseTerm(self):
86 p = _MakeParser('foo && ! bar')
87 node = p.ParseTerm()
88 print(node)
89 self.assertEqual(bool_expr_e.LogicalAnd, node.tag())
90
91 # TODO: This is an entire expression I guess
92 p = _MakeParser('foo && ! bar && baz')
93 node = p.ParseTerm()
94 print(node)
95 self.assertEqual(bool_expr_e.LogicalAnd, node.tag())
96
97 p = _MakeParser('-z foo && -z bar')
98 node = p.ParseTerm()
99 print(node)
100 self.assertEqual(bool_expr_e.LogicalAnd, node.tag())
101
102 def testParseExpr(self):
103 p = _MakeParser('foo || ! bar')
104 node = p.ParseExpr()
105 print(node)
106 self.assertEqual(bool_expr_e.LogicalOr, node.tag())
107
108 p = _MakeParser('a == b')
109 print(p.ParseExpr())
110
111 def testParseFactorInParens(self):
112 p = _MakeParser('( foo == bar )')
113 node = p.ParseFactor()
114 print(node)
115 self.assertTrue(p._TestAtEnd())
116 self.assertEqual(bool_expr_e.Binary, node.tag())
117
118 def testParseParenthesized(self):
119 p = _MakeParser('zoo && ( foo == bar )')
120 node = p.ParseExpr()
121 print(node)
122 self.assertEqual(bool_expr_e.LogicalAnd, node.tag())
123
124
125class BugsTest(unittest.TestCase):
126
127 def testParse(self):
128 p = _MakeParser('-f foo')
129 node = p.ParseExpr()
130 print(node)
131 self.assertEqual(bool_expr_e.Unary, node.tag())
132
133 p = _MakeParser('-f == -f')
134 node = p.ParseExpr()
135 print(node)
136 self.assertEqual(bool_expr_e.Binary, node.tag())
137
138 p = _MakeParser('-f ==')
139 node = p.ParseExpr()
140 print(node)
141 #self.assertEqual(bool_expr_e.Unary, node.tag())
142
143 def testLookAhead2(self):
144 p = _MakeParser('-f foo')
145 p._Dump()
146
147 log(' *** LookAhead')
148 p._LookAhead()
149 p._Dump()
150
151 log(' *** Next')
152 p._Next()
153 p._Dump()
154
155 log(' *** Next')
156 p._Next()
157 p._Dump()
158
159 def testNextOne(self):
160 p = _MakeParser('-f foo')
161 self.assertEqual(Id.BoolUnary_f, p.bool_id)
162
163 p._Next()
164 self.assertEqual(Id.Word_Compound, p.bool_id)
165
166 p._Next()
167 self.assertEqual(Id.Lit_DRightBracket, p.bool_id)
168
169 p._Next()
170 self.assertEqual(Id.Eof_Real, p.bool_id)
171
172 log('bool_id %s', Id_str(p.bool_id))
173
174
175if __name__ == '__main__':
176 unittest.main()