| 1 | #!/usr/bin/env python
 | 
| 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 core import test_lib
 | 
| 15 | 
 | 
| 16 | from osh.meta import ast, Id, types
 | 
| 17 | from osh import parse_lib
 | 
| 18 | from osh import bool_parse  # module under test
 | 
| 19 | 
 | 
| 20 | bool_expr_e = ast.bool_expr_e
 | 
| 21 | lex_mode_e = types.lex_mode_e
 | 
| 22 | 
 | 
| 23 | 
 | 
| 24 | def _ReadWords(w_parser):
 | 
| 25 |   words = []
 | 
| 26 |   while True:
 | 
| 27 |     w = w_parser.ReadWord(lex_mode_e.DBRACKET)
 | 
| 28 |     if w.Type() == Id.Eof_Real:
 | 
| 29 |       break
 | 
| 30 |     words.append(w)
 | 
| 31 |   print('')
 | 
| 32 |   print('words:', words)
 | 
| 33 | 
 | 
| 34 |   return words
 | 
| 35 | 
 | 
| 36 | 
 | 
| 37 | def _MakeParser(code_str):
 | 
| 38 |   # NOTE: We need the extra ]] token
 | 
| 39 |   arena = test_lib.MakeArena('<bool_parse_test.py>')
 | 
| 40 |   w_parser, _ = parse_lib.MakeParserForCompletion(code_str + ' ]]', arena)
 | 
| 41 |   w_parser._Next(lex_mode_e.DBRACKET)  # for tests only
 | 
| 42 |   p = bool_parse.BoolParser(w_parser)
 | 
| 43 |   if not p._Next():
 | 
| 44 |     raise AssertionError
 | 
| 45 |   return p
 | 
| 46 | 
 | 
| 47 | 
 | 
| 48 | class 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.BoolUnary, 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.BoolBinary, 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.BoolBinary, 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 | 
 | 
| 125 | if __name__ == '__main__':
 | 
| 126 |   unittest.main()
 |