test_expressionparser.py (6172B)
1 #!/usr/bin/env python 2 3 import unittest 4 5 import mozunit 6 from manifestparser import parse 7 8 9 class ExpressionParserTest(unittest.TestCase): 10 """Test the conditional expression parser.""" 11 12 def test_basic(self): 13 self.assertEqual(parse("1"), 1) 14 self.assertEqual(parse("100"), 100) 15 self.assertEqual(parse("true"), True) 16 self.assertEqual(parse("false"), False) 17 self.assertEqual("", parse('""')) 18 self.assertEqual(parse('"foo bar"'), "foo bar") 19 self.assertEqual(parse("'foo bar'"), "foo bar") 20 self.assertEqual(parse("foo", foo=1), 1) 21 self.assertEqual(parse("bar", bar=True), True) 22 self.assertEqual(parse("abc123", abc123="xyz"), "xyz") 23 24 def test_equality(self): 25 self.assertTrue(parse("true == true")) 26 self.assertTrue(parse("false == false")) 27 self.assertTrue(parse("1 == 1")) 28 self.assertTrue(parse("100 == 100")) 29 self.assertTrue(parse('"some text" == "some text"')) 30 self.assertTrue(parse("true != false")) 31 self.assertTrue(parse("1 != 2")) 32 self.assertTrue(parse('"text" != "other text"')) 33 self.assertTrue(parse("foo == true", foo=True)) 34 self.assertTrue(parse("foo == 1", foo=1)) 35 self.assertTrue(parse('foo == "bar"', foo="bar")) 36 self.assertTrue(parse("foo == bar", foo=True, bar=True)) 37 self.assertTrue(parse("true == foo", foo=True)) 38 self.assertTrue(parse("foo != true", foo=False)) 39 self.assertTrue(parse("foo != 2", foo=1)) 40 self.assertTrue(parse('foo != "bar"', foo="abc")) 41 self.assertTrue(parse("foo != bar", foo=True, bar=False)) 42 self.assertTrue(parse("true != foo", foo=False)) 43 self.assertTrue(parse("!false")) 44 45 def test_conjunctures(self): 46 self.assertTrue(parse("true && true")) 47 self.assertTrue(parse("true || false")) 48 self.assertFalse(parse("false || false")) 49 self.assertFalse(parse("true && false")) 50 self.assertTrue(parse("true || false && false")) 51 52 def test_parentheses(self): 53 self.assertTrue(parse("(true)")) 54 self.assertEqual(parse("(10)"), 10) 55 self.assertEqual(parse('("foo")'), "foo") 56 self.assertEqual(parse("(foo)", foo=1), 1) 57 self.assertTrue(parse("(true == true)"), True) 58 self.assertTrue(parse("(true != false)")) 59 self.assertTrue(parse("(true && true)")) 60 self.assertTrue(parse("(true || false)")) 61 self.assertTrue(parse("(true && true || false)")) 62 self.assertFalse(parse("(true || false) && false")) 63 self.assertTrue(parse("(true || false) && true")) 64 self.assertTrue(parse("true && (true || false)")) 65 self.assertTrue(parse("true && (true || false)")) 66 self.assertTrue(parse("(true && false) || (true && (true || false))")) 67 68 def test_comments(self): 69 # comments in expressions work accidentally, via an implementation 70 # detail - the '#' character doesn't match any of the regular 71 # expressions we specify as tokens, and thus are ignored. 72 # However, having explicit tests for them means that should the 73 # implementation ever change, comments continue to work, even if that 74 # means a new implementation must handle them explicitly. 75 self.assertTrue(parse("true == true # it does!")) 76 self.assertTrue(parse("false == false # it does")) 77 self.assertTrue(parse("false != true # it doesnt")) 78 self.assertTrue(parse('"string with #" == "string with #" # really, it does')) 79 self.assertTrue( 80 parse('"string with #" != "string with # but not the same" # no match!') 81 ) 82 83 def test_not(self): 84 """ 85 Test the ! operator. 86 """ 87 self.assertTrue(parse("!false")) 88 self.assertTrue(parse("!(false)")) 89 self.assertFalse(parse("!true")) 90 self.assertFalse(parse("!(true)")) 91 self.assertTrue(parse("!true || true)")) 92 self.assertTrue(parse("true || !true)")) 93 self.assertFalse(parse("!true && true")) 94 self.assertFalse(parse("true && !true")) 95 96 def test_lesser_than(self): 97 """ 98 Test the < operator. 99 """ 100 self.assertTrue(parse("1 < 2")) 101 self.assertFalse(parse("3 < 2")) 102 self.assertTrue(parse("false || (1 < 2)")) 103 self.assertTrue(parse("1 < 2 && true")) 104 self.assertTrue(parse("true && 1 < 2")) 105 self.assertTrue(parse("!(5 < 1)")) 106 self.assertTrue(parse("'abc' < 'def'")) 107 self.assertFalse(parse("1 < 1")) 108 self.assertFalse(parse("'abc' < 'abc'")) 109 110 def test_greater_than(self): 111 """ 112 Test the > operator. 113 """ 114 self.assertTrue(parse("2 > 1")) 115 self.assertFalse(parse("2 > 3")) 116 self.assertTrue(parse("false || (2 > 1)")) 117 self.assertTrue(parse("2 > 1 && true")) 118 self.assertTrue(parse("true && 2 > 1")) 119 self.assertTrue(parse("!(1 > 5)")) 120 self.assertTrue(parse("'def' > 'abc'")) 121 self.assertFalse(parse("1 > 1")) 122 self.assertFalse(parse("'abc' > 'abc'")) 123 124 def test_lesser_or_equals_than(self): 125 """ 126 Test the <= operator. 127 """ 128 self.assertTrue(parse("1 <= 2")) 129 self.assertFalse(parse("3 <= 2")) 130 self.assertTrue(parse("false || (1 <= 2)")) 131 self.assertTrue(parse("1 < 2 && true")) 132 self.assertTrue(parse("true && 1 <= 2")) 133 self.assertTrue(parse("!(5 <= 1)")) 134 self.assertTrue(parse("'abc' <= 'def'")) 135 self.assertTrue(parse("1 <= 1")) 136 self.assertTrue(parse("'abc' <= 'abc'")) 137 138 def test_greater_or_equals_than(self): 139 """ 140 Test the > operator. 141 """ 142 self.assertTrue(parse("2 >= 1")) 143 self.assertFalse(parse("2 >= 3")) 144 self.assertTrue(parse("false || (2 >= 1)")) 145 self.assertTrue(parse("2 >= 1 && true")) 146 self.assertTrue(parse("true && 2 >= 1")) 147 self.assertTrue(parse("!(1 >= 5)")) 148 self.assertTrue(parse("'def' >= 'abc'")) 149 self.assertTrue(parse("1 >= 1")) 150 self.assertTrue(parse("'abc' >= 'abc'")) 151 152 153 if __name__ == "__main__": 154 mozunit.main()