Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
michael@0 | 1 | #!/usr/bin/env python |
michael@0 | 2 | |
michael@0 | 3 | import unittest |
michael@0 | 4 | from manifestparser import parse |
michael@0 | 5 | |
michael@0 | 6 | class ExpressionParserTest(unittest.TestCase): |
michael@0 | 7 | """Test the conditional expression parser.""" |
michael@0 | 8 | |
michael@0 | 9 | def test_basic(self): |
michael@0 | 10 | |
michael@0 | 11 | self.assertEqual(parse("1"), 1) |
michael@0 | 12 | self.assertEqual(parse("100"), 100) |
michael@0 | 13 | self.assertEqual(parse("true"), True) |
michael@0 | 14 | self.assertEqual(parse("false"), False) |
michael@0 | 15 | self.assertEqual('', parse('""')) |
michael@0 | 16 | self.assertEqual(parse('"foo bar"'), 'foo bar') |
michael@0 | 17 | self.assertEqual(parse("'foo bar'"), 'foo bar') |
michael@0 | 18 | self.assertEqual(parse("foo", foo=1), 1) |
michael@0 | 19 | self.assertEqual(parse("bar", bar=True), True) |
michael@0 | 20 | self.assertEqual(parse("abc123", abc123="xyz"), 'xyz') |
michael@0 | 21 | |
michael@0 | 22 | def test_equality(self): |
michael@0 | 23 | |
michael@0 | 24 | self.assertTrue(parse("true == true")) |
michael@0 | 25 | self.assertTrue(parse("false == false")) |
michael@0 | 26 | self.assertTrue(parse("1 == 1")) |
michael@0 | 27 | self.assertTrue(parse("100 == 100")) |
michael@0 | 28 | self.assertTrue(parse('"some text" == "some text"')) |
michael@0 | 29 | self.assertTrue(parse("true != false")) |
michael@0 | 30 | self.assertTrue(parse("1 != 2")) |
michael@0 | 31 | self.assertTrue(parse('"text" != "other text"')) |
michael@0 | 32 | self.assertTrue(parse("foo == true", foo=True)) |
michael@0 | 33 | self.assertTrue(parse("foo == 1", foo=1)) |
michael@0 | 34 | self.assertTrue(parse('foo == "bar"', foo='bar')) |
michael@0 | 35 | self.assertTrue(parse("foo == bar", foo=True, bar=True)) |
michael@0 | 36 | self.assertTrue(parse("true == foo", foo=True)) |
michael@0 | 37 | self.assertTrue(parse("foo != true", foo=False)) |
michael@0 | 38 | self.assertTrue(parse("foo != 2", foo=1)) |
michael@0 | 39 | self.assertTrue(parse('foo != "bar"', foo='abc')) |
michael@0 | 40 | self.assertTrue(parse("foo != bar", foo=True, bar=False)) |
michael@0 | 41 | self.assertTrue(parse("true != foo", foo=False)) |
michael@0 | 42 | self.assertTrue(parse("!false")) |
michael@0 | 43 | |
michael@0 | 44 | def test_conjunctures(self): |
michael@0 | 45 | self.assertTrue(parse("true && true")) |
michael@0 | 46 | self.assertTrue(parse("true || false")) |
michael@0 | 47 | self.assertFalse(parse("false || false")) |
michael@0 | 48 | self.assertFalse(parse("true && false")) |
michael@0 | 49 | self.assertTrue(parse("true || false && false")) |
michael@0 | 50 | |
michael@0 | 51 | def test_parentheses(self): |
michael@0 | 52 | self.assertTrue(parse("(true)")) |
michael@0 | 53 | self.assertEqual(parse("(10)"), 10) |
michael@0 | 54 | self.assertEqual(parse('("foo")'), 'foo') |
michael@0 | 55 | self.assertEqual(parse("(foo)", foo=1), 1) |
michael@0 | 56 | self.assertTrue(parse("(true == true)"), True) |
michael@0 | 57 | self.assertTrue(parse("(true != false)")) |
michael@0 | 58 | self.assertTrue(parse("(true && true)")) |
michael@0 | 59 | self.assertTrue(parse("(true || false)")) |
michael@0 | 60 | self.assertTrue(parse("(true && true || false)")) |
michael@0 | 61 | self.assertFalse(parse("(true || false) && false")) |
michael@0 | 62 | self.assertTrue(parse("(true || false) && true")) |
michael@0 | 63 | self.assertTrue(parse("true && (true || false)")) |
michael@0 | 64 | self.assertTrue(parse("true && (true || false)")) |
michael@0 | 65 | self.assertTrue(parse("(true && false) || (true && (true || false))")) |
michael@0 | 66 | |
michael@0 | 67 | |
michael@0 | 68 | def test_comments(self): |
michael@0 | 69 | # comments in expressions work accidentally, via an implementation |
michael@0 | 70 | # detail - the '#' character doesn't match any of the regular |
michael@0 | 71 | # expressions we specify as tokens, and thus are ignored. |
michael@0 | 72 | # However, having explicit tests for them means that should the |
michael@0 | 73 | # implementation ever change, comments continue to work, even if that |
michael@0 | 74 | # means a new implementation must handle them explicitly. |
michael@0 | 75 | self.assertTrue(parse("true == true # it does!")) |
michael@0 | 76 | self.assertTrue(parse("false == false # it does")) |
michael@0 | 77 | self.assertTrue(parse("false != true # it doesnt")) |
michael@0 | 78 | self.assertTrue(parse('"string with #" == "string with #" # really, it does')) |
michael@0 | 79 | self.assertTrue(parse('"string with #" != "string with # but not the same" # no match!')) |
michael@0 | 80 | |
michael@0 | 81 | def test_not(self): |
michael@0 | 82 | """ |
michael@0 | 83 | Test the ! operator. |
michael@0 | 84 | """ |
michael@0 | 85 | self.assertTrue(parse("!false")) |
michael@0 | 86 | self.assertTrue(parse("!(false)")) |
michael@0 | 87 | self.assertFalse(parse("!true")) |
michael@0 | 88 | self.assertFalse(parse("!(true)")) |
michael@0 | 89 | self.assertTrue(parse("!true || true)")) |
michael@0 | 90 | self.assertTrue(parse("true || !true)")) |
michael@0 | 91 | self.assertFalse(parse("!true && true")) |
michael@0 | 92 | self.assertFalse(parse("true && !true")) |
michael@0 | 93 | |
michael@0 | 94 | if __name__ == '__main__': |
michael@0 | 95 | unittest.main() |