def test_non_balanced_expr(self): inputs = [ ")", "(1", "(1 + ()", ] for input in inputs: with self.subTest(i=input): with self.assertRaises(Exception): parse_expr(input)
def test_parser_bool(self): b1 = "x == 1" self.assertEqual(parse_expr(b1), BoolArithCmp(ArithCmp.Eq, Var("x"), ArithLit(1))) b2 = "x != 1" self.assertEqual(parse_expr(b2), BoolArithCmp(ArithCmp.Neq, Var("x"), ArithLit(1))) b3 = "x > 1" self.assertEqual(parse_expr(b3), BoolArithCmp(ArithCmp.Gt, Var("x"), ArithLit(1)))
def test_parse_expr_pointers(self): inputs = [("*n + 1", ArithBinop(ArithOp.Add, ArithUnaryop(ArithUnaryOp.Deref, Var("n")), ArithLit(1))), ("1 + *n", ArithBinop(ArithOp.Add, ArithLit(1), ArithUnaryop(ArithUnaryOp.Deref, Var("n")))), ("*n + *m", ArithBinop(ArithOp.Add, ArithUnaryop(ArithUnaryOp.Deref, Var("n")), ArithUnaryop(ArithUnaryOp.Deref, Var("m"))))] for (input, expected) in inputs: with self.subTest(input=input): self.assertEqual(parse_expr(input), expected)
def test_parser_bool_expr(self): b1a = "(x == 1)" self.assertEqual(parse_expr(b1a), BoolArithCmp(ArithCmp.Eq, Var("x"), ArithLit(1))) b1b = "!(x == 1)" self.assertEqual( parse_expr(b1b), BoolNeg(BoolArithCmp(ArithCmp.Eq, Var("x"), ArithLit(1)))) b4 = "(x > 1) && (y < 0)" self.assertEqual( parse_expr(b4), BoolBinop(BoolOp.And, BoolArithCmp(ArithCmp.Gt, Var("x"), ArithLit(1)), BoolArithCmp(ArithCmp.Lt, Var("y"), ArithLit(0)))) b4a = "x > 1 && y < 0" self.assertEqual( parse_expr(b4a), BoolBinop(BoolOp.And, BoolArithCmp(ArithCmp.Gt, Var("x"), ArithLit(1)), BoolArithCmp(ArithCmp.Lt, Var("y"), ArithLit(0)))) b5 = "(x > 1) || (y < 0)" self.assertEqual( parse_expr(b5), BoolBinop(BoolOp.Or, BoolArithCmp(ArithCmp.Gt, Var("x"), ArithLit(1)), BoolArithCmp(ArithCmp.Lt, Var("y"), ArithLit(0)))) b5a = "x > 1 || y < 0" self.assertEqual( parse_expr(b5a), BoolBinop(BoolOp.Or, BoolArithCmp(ArithCmp.Gt, Var("x"), ArithLit(1)), BoolArithCmp(ArithCmp.Lt, Var("y"), ArithLit(0))))
def test_parser_expr_funcall(self): e1 = "foo()" r1 = FunCall("foo", []) self.assertEqual(parse_expr(e1), r1) e2 = "foo(1)" r2 = FunCall("foo", [ArithLit(1)]) self.assertEqual(parse_expr(e2), r2) e3 = "foo(1,2)" r3 = FunCall("foo", [ArithLit(1), ArithLit(2)]) self.assertEqual(parse_expr(e3), r3) e4 = "2 + foo()" r4 = ArithBinop(ArithOp.Add, ArithLit(2), FunCall("foo", [])) self.assertEqual(parse_expr(e4), r4) e5 = "2 + foo() > 4" r5 = BoolArithCmp(ArithCmp.Gt, r4, ArithLit(4)) self.assertEqual(parse_expr(e5), r5) e6 = "foo(x, y, bar())" r6 = FunCall("foo", [Var("x"), Var("y"), FunCall("bar", [])]) self.assertEqual(parse_expr(e6), r6)
def test_parser_expr_deref(self): input = "&n" self.assertEqual(parse_expr(input), ArithUnaryop(ArithUnaryOp.Addr, Var("n")))
def test_parser_bool_neg(self): b1 = "!x" r1 = BoolNeg(Var("x")) self.assertEqual(parse_expr(b1), r1)