Пример #1
0
 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)
Пример #2
0
    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)))
Пример #3
0
    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)
Пример #4
0
    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))))
Пример #5
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)
Пример #6
0
    def test_parser_expr_deref(self):
        input = "&n"

        self.assertEqual(parse_expr(input),
                         ArithUnaryop(ArithUnaryOp.Addr, Var("n")))
Пример #7
0
 def test_parser_bool_neg(self):
     b1 = "!x"
     r1 = BoolNeg(Var("x"))
     self.assertEqual(parse_expr(b1), r1)