def test_evaluation(self):
     assignments = {
         'sampling_factors': 1234,
         'thumbnail_x': 5,
         'thumbnail_y': 7
     }
     self.assertEqual(65, parse('(sampling_factors & -0xf0) >> 4').eval(assignments))
     self.assertEqual(105, parse('thumbnail_x * thumbnail_y * 3').eval(assignments))
 def test_string_escaping(self):
     input_str = 'foo " bar'
     escaped_input = input_str.replace('"', '\\"')
     ret = parse(f'"{escaped_input}"').eval()
     self.assertIsInstance(ret, StringToken)
     self.assertEqual(input_str, str(ret))
     with self.assertRaises(ParseError):
         parse(f'{input_str}')
    def test_member_access(self):
        class Foo:
            def __init__(self, bar):
                self.bar = bar

        assignments = {
            'foo': Foo(1234)
        }

        self.assertEqual(1234, parse('foo.bar').eval(assignments))
        with self.assertRaises(ParseError):
            parse('foo.__dict__').eval(assignments)
 def test_getitem(self):
     self.assertEqual(1234, parse('foo[(bar + 10) * 2]').eval({
         'foo': {
             40: 1234
         },
         'bar': 10
     }))
 def test_containers(self):
     self.assertEqual([[1, (3,)]], parse('[[1, (3,)]]').eval())
     self.assertEqual([1, 2, 3, 4], parse('[1, 2, 3, 4]').eval())
     self.assertEqual((1, 2, 3, 4), parse('(1, 2, 3, 4)').eval())
     self.assertEqual([[1, 2, [3], 4]], parse('[[1, 2, [3], 4]]').eval())
     self.assertEqual((1,), parse('(1,)').eval())
     self.assertEqual([1], parse('[1]').eval())
     with self.assertRaises(ParseError):
         self.assertEqual([1], parse('[1,]').eval())
 def test_string_parsing(self):
     input_str = 'This is a test'
     ret = parse(f'"{input_str}"').eval()
     self.assertIsInstance(ret, StringToken)
     self.assertEqual(input_str, str(ret))
 def test_functions(self):
     self.assertEqual(sum([1, 2, 3, 4]), parse('sum([1, 2, 3, 4])').eval())
     self.assertEqual('a, b, c, d', parse('", ".join(["a", "b", "c", "d"])').eval())
 def test_bracket_parsing(self):
     with self.assertRaises(ParseError):
         parse('foo[bar(])')
     with self.assertRaises(ParseError):
         parse('(bar[)]')