# coding=utf8 # mode: run # tag: constant_folding import cython @cython.test_fail_if_path_exists( "//UnaryMinusNode", "//UnaryPlusNode", ) def unop_floats(): """ >>> unop_floats() (False, 2.0, -2.0, False, 2.0, -2.0, -2.0) """ not1 = not 2.0 plus1 = + 2.0 minus1 = - 2.0 not3 = not not not 2.0 plus3 = +++ 2.0 minus3 = --- 2.0 mix = +-++-- 2.0 return not1, plus1, minus1, not3, plus3, minus3, mix @cython.test_fail_if_path_exists( "//UnaryMinusNode", "//UnaryPlusNode", "//CoerceToPyTypeNode", ) def unop_py_floats_tuple(): """ >>> unop_floats() (False, 2.0, -2.0, False, 2.0, -2.0, -2.0) """ return ( not 2.0, + 2.0, - 2.0, not not not 2.0, +++ 2.0, --- 2.0, +-++-- 2.0) @cython.test_fail_if_path_exists( "//UnaryMinusNode", "//UnaryPlusNode", ) def unop_ints(): """ >>> unop_ints() (False, 2, -2, False, 2, -2, -2) """ not1 = not 2 plus1 = + 2 minus1 = - 2 not3 = not not not 2 plus3 = +++ 2 minus3 = --- 2 mix = +-++-- 2 return not1, plus1, minus1, not3, plus3, minus3, mix @cython.test_fail_if_path_exists( "//UnaryMinusNode", "//UnaryPlusNode", "//NotNode", ) def unop_bool(): """ >>> unop_bool() (False, 1, -1, False, 1, -1, -1) """ not1 = not True plus1 = + True minus1 = - True not3 = not not not True plus3 = +++ True minus3 = --- True mix = +-++-- True return not1, plus1, minus1, not3, plus3, minus3, mix @cython.test_fail_if_path_exists( "//AddNode", "//SubNode", ) def binop_bool(): """ >>> binop_bool() (2, 1, 0, True, True, 1, False, 2, 2, -2, False, True, 1, False) """ plus1 = True + True pmix1 = True + 0 minus1 = True - True and1 = True & True or1 = True | True ormix1 = True | 0 xor1 = True ^ True plus3 = False + True + False + True pmix3 = False + True + 0 + True minus3 = False - True - False - True and3 = False & True & False & True or3 = False | True | False | True ormix3 = False | 0 | False | True xor3 = False ^ True ^ False ^ True return plus1, pmix1, minus1, and1, or1, ormix1, xor1, plus3, pmix3, minus3, and3, or3, ormix3, xor3 @cython.test_fail_if_path_exists( "//SliceIndexNode", ) def slicing2(): """ >>> slicing2() ([1, 2, 3, 4], [3, 4], [1, 2, 3, 4], [3, 4], (1, 2, 3, 4), (3, 4), (1, 2, 3, 4), (3, 4)) """ lst0 = [1, 2, 3, 4][:] lst1 = [1, 2, 3, 4][2:] lst2 = [1, 2, 3, 4][:4] lst3 = [1, 2, 3, 4][2:4] tpl0 = (1, 2, 3, 4)[:] tpl1 = (1, 2, 3, 4)[2:] tpl2 = (1, 2, 3, 4)[:4] tpl3 = (1, 2, 3, 4)[2:4] return lst0, lst1, lst2, lst3, tpl0, tpl1, tpl2, tpl3 @cython.test_fail_if_path_exists( "//SliceIndexNode", ) def str_slicing2(): """ >>> a,b,c,d = str_slicing2() >>> a == 'abc\\xE9def'[:] True >>> b == 'abc\\xE9def'[2:] True >>> c == 'abc\\xE9def'[:4] True >>> d == 'abc\\xE9def'[2:4] True """ str0 = 'abc\xE9def'[:] str1 = 'abc\xE9def'[2:] str2 = 'abc\xE9def'[:4] str3 = 'abc\xE9def'[2:4] return str0, str1, str2, str3 @cython.test_fail_if_path_exists( "//IfStatNode", ) def str_in_and_not_in(): """ >>> str_in_and_not_in() True """ if 'a' in 'abc' and 'b' in 'abc' and 'c' in 'abc' and 'd' not in 'abc': return True else: return False @cython.test_fail_if_path_exists( "//WhileStatNode", ) def while_false(): """ >>> while_false() """ while 1 == 0: return False @cython.test_fail_if_path_exists( "//WhileStatNode", ) def while_false_else(): """ >>> while_false_else() True """ while 1 == 0: return False else: return True @cython.test_fail_if_path_exists( "//WhileStatNode//PrintStatNode", "//WhileStatNode//PrimaryCmpNode", "//WhileStatNode/BoolNode", "//WhileStatNode/IntNode", ) @cython.test_assert_path_exists( "//WhileStatNode", ) def while_true(): """ >>> while_true() True """ while 1 == 1: return True else: print("FAIL") @cython.test_fail_if_path_exists( "//ForInStatNode", ) def for_in_empty(): """ >>> for_in_empty() """ for i in []: print("LOOP") @cython.test_fail_if_path_exists( "//ForInStatNode", ) def for_in_empty_else(): """ >>> for_in_empty_else() True """ for i in []: print("LOOP") else: return True @cython.test_fail_if_path_exists( "//ComprehensionNode", "//ForInStatNode", ) @cython.test_assert_path_exists( "//ListNode", ) def for_in_empty_listcomp(): """ >>> for_in_empty_listcomp() [] """ return [i for i in []] @cython.test_fail_if_path_exists( "//ComprehensionNode", "//ForInStatNode", ) @cython.test_assert_path_exists( "//ListNode", ) def for_in_empty_nested_listcomp(): """ >>> for_in_empty_nested_listcomp() [] """ return [x for _ in [] for x in [1, 2, 3]] @cython.test_fail_if_path_exists( "//ForInStatNode//ForInStatNode", ) @cython.test_assert_path_exists( "//ForInStatNode", "//ComprehensionNode", ) def for_in_nested_listcomp(): """ >>> for_in_nested_listcomp() [] """ return [x for x in [1, 2, 3] for _ in []] @cython.test_fail_if_path_exists( "//MulNode", ) def mult_empty_list(): """ >>> mult_empty_list() [] """ return 5 * [] * 100 @cython.test_fail_if_path_exists( "//MulNode", ) def mult_list_int_int(): """ >>> mult_list_int_int() [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2] """ return [1, 2] * 2 * 3 @cython.test_fail_if_path_exists( "//MulNode", ) def mult_int_list_int(): """ >>> mult_int_list_int() [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2] """ return 3 * [1, 2] * 2 @cython.test_fail_if_path_exists( "//MulNode", "//ListNode//IntNode", ) def neg_mult_list(): """ >>> neg_mult_list() [] """ return -5 * [1, 2] * -100 @cython.test_fail_if_path_exists( "//MulNode", "//ListNode//IntNode", ) def zero_mult_list(): """ >>> zero_mult_list() [] """ return 0 * [1, 2] * 0 @cython.test_assert_path_exists( "//BoolNode", ) @cython.test_fail_if_path_exists( "//PrimaryCmpNode", "//MulNode", "//ListNode//IntNode", ) def in_mult_list(): """ >>> in_mult_list() False """ return 5 in 100 * [1, 2] * 0 @cython.test_assert_path_exists( "//BoolNode", ) @cython.test_fail_if_path_exists( "//PrimaryCmpNode", "//MulNode", "//ListNode//IntNode", ) def not_in_mult_list(): """ >>> not_in_mult_list() True """ return 5 not in 100 * [1, 2] * 0 @cython.test_assert_path_exists( "//BoolNode", ) @cython.test_fail_if_path_exists( "//PrimaryCmpNode", "//MulNode", "//ListNode//IntNode", ) def combined(): """ >>> combined() True """ return 5 in 100 * [1, 2] * 0 or 5 not in 100 * [] * 10 @cython.test_assert_path_exists( '//IntNode[@value = "2"]', '//IntNode[@value = "4"]', '//IntNode[@value = "5"]', '//IntNode[@value = "7"]', '//BoolBinopNode//PrimaryCmpNode', '//BoolBinopNode[.//PrimaryCmpNode//IntNode[@value = "4"] and .//PrimaryCmpNode//IntNode[@value = "5"]]', '//PrimaryCmpNode[.//IntNode[@value = "2"] and .//IntNode[@value = "4"]]', '//PrimaryCmpNode[.//IntNode[@value = "5"] and .//IntNode[@value = "7"]]', ) @cython.test_fail_if_path_exists( '//IntNode[@value = "1"]', '//IntNode[@value = "8"]', '//PrimaryCmpNode[.//IntNode[@value = "4"] and .//IntNode[@value = "5"]]', '//PrimaryCmpNode[.//IntNode[@value = "2"] and .//IntNode[@value = "7"]]', '//BoolNode', ) def cascaded_cmp_with_partial_constants(a, b): """ >>> cascaded_cmp_with_partial_constants(3, 6) True >>> cascaded_cmp_with_partial_constants(1, 6) False >>> cascaded_cmp_with_partial_constants(4, 6) False >>> cascaded_cmp_with_partial_constants(3, 7) False >>> cascaded_cmp_with_partial_constants(3, 6) True """ return 1 < 2 < a < 4 < 5 < b < 7 < 8 @cython.test_assert_path_exists( '//IntNode[@value = "2"]', '//IntNode[@value = "4"]', '//IntNode[@value = "5"]', '//IntNode[@value = "7"]', '//BoolBinopNode', '//SingleAssignmentNode//BoolBinopNode', '//SingleAssignmentNode//BoolBinopNode//NameNode[@name = "a"]', '//SingleAssignmentNode//BoolBinopNode//NameNode[@name = "b"]', '//BoolBinopNode[.//PrimaryCmpNode//IntNode[@value = "4"] and .//PrimaryCmpNode//IntNode[@value = "5"]]', '//BoolNode[@value = False]', ) @cython.test_fail_if_path_exists( '//SingleAssignmentNode//NameNode[@name = "c"]', '//IntNode[@value = "1"]', '//PrimaryCmpNode[.//IntNode[@value = "4"] and .//IntNode[@value = "5"]]', '//PrimaryCmpNode[.//IntNode[@value = "2"] and .//IntNode[@value = "7"]]', '//BoolNode[@value = True]', ) def cascaded_cmp_with_partial_constants_and_false_end(a, b, c): """ >>> cascaded_cmp_with_partial_constants_and_false_end(3, 6, 8) False >>> cascaded_cmp_with_partial_constants_and_false_end(1, 6, 8) False >>> cascaded_cmp_with_partial_constants_and_false_end(4, 6, 8) False >>> cascaded_cmp_with_partial_constants_and_false_end(3, 7, 8) False """ x = 1 < 2 < a < 4 < 5 < b < 7 < 7 < c return x @cython.test_assert_path_exists( '//PrimaryCmpNode', '//PrimaryCmpNode//IntNode', '//PrimaryCmpNode//IntNode[@value = "0"]', '//PrimaryCmpNode//IntNode[@value = "4294967296"]', ) @cython.test_fail_if_path_exists( '//PrimaryCmpNode//IntBinopNode', '//PrimaryCmpNode//IntNode[@value = "1"]', '//PrimaryCmpNode//IntNode[@value = "32"]', ) def const_in_binop(v): """ >>> const_in_binop(-1) 1 >>> const_in_binop(0) 0 >>> const_in_binop(1 << 32) 1 >>> const_in_binop(1 << 32 - 1) 0 """ if v < 0 or v >= (1 << 32): return 1 else: return 0