from test_pil_builder_utils import TestParser, Expr
def test_pil_builder_expr():
with TestParser():
@TestParser.test
def expr_binop():
Expr.int(0) + Expr.int(1)
@TestParser.test
def expr_named_expr():
(var_a := Expr.int(0))
Expr.str(var_a)
def test_pil_builder_named_expr():
with TestParser():
@TestParser.test
def named_expr_binop():
var_x = (var_a := Expr.int(0)) + (var_b := Expr.int(1))
Expr.str(var_x)
Expr.str(var_a)
Expr.str(var_b)
@TestParser.test
def named_expr_unary():
var_x = -(var_a := Expr.int(5))
Expr.str(var_x)
Expr.str(var_a)
@TestParser.test
def named_expr_if_true():
if var_a := Expr.true(0):
Expr.str(1)
else:
Expr.str(2)
Expr.str(var_a)
@TestParser.test
def named_expr_if_false():
if var_a := Expr.false(0):
Expr.str(1)
else:
Expr.str(2)
Expr.str(var_a)
@TestParser.test
def named_expr_for_iter():
for var_x in (var_it := [Expr.int(0), Expr.int(1)]):
Expr.str(var_x)
Expr.str(len(var_it))
@TestParser.test
def named_expr_while():
var_items = [Expr.int(0), Expr.int(1), Expr.int(2)]
var_i = [0]
while var_n := (var_i[0] < len(var_items)):
Expr.str(var_items[var_i[0]])
var_i[0] = var_i[0] + 1
Expr.str(var_n)
@TestParser.test
def named_expr_call_pos_arg():
Expr.str(var_a := Expr.int(0))
Expr.str(var_a)
@TestParser.test
def named_expr_call_kw_arg():
def func(x):
Expr.str(x)
func(x=(var_a := Expr.int(0)))
Expr.str(var_a)
@TestParser.test
def named_expr_in_tuple():
var_t = ((var_a := Expr.int(0)), (var_b := Expr.int(1)))
Expr.str(var_t[0])
Expr.str(var_t[1])
Expr.str(var_a)
Expr.str(var_b)
@TestParser.test
def named_expr_in_list():
var_l = [(var_a := Expr.int(0)), (var_b := Expr.int(1))]
Expr.str(var_l[0])
Expr.str(var_l[1])
Expr.str(var_a)
Expr.str(var_b)
@TestParser.test
def named_expr_dict_key():
var_d = {(var_k := Expr.int(0)): Expr.int(1)}
Expr.str(var_d[0])
Expr.str(var_k)
@TestParser.test
def named_expr_dict_value():
var_d = {Expr.int(0): (var_v := Expr.int(99))}
Expr.str(var_d[0])
Expr.str(var_v)
@TestParser.test
def named_expr_in_set():
var_s = {(var_a := Expr.int(1)), (var_b := Expr.int(2))}
Expr.str(1 in var_s)
Expr.str(var_a)
Expr.str(var_b)
@TestParser.test
def named_expr_subscript_index():
var_arr = Expr(0)
var_arr[0] = Expr.int(99)
var_x = var_arr[(var_i := Expr.int(0))]
Expr.str(var_x)
Expr.str(var_i)
@TestParser.test
def named_expr_slice_bound():
var_l = [Expr.int(0), Expr.int(1), Expr.int(2)]
var_s = var_l[(var_lo := Expr.int(1)):(var_hi := Expr.int(3))]
Expr.str(var_s[0])
Expr.str(var_lo)
Expr.str(var_hi)
@TestParser.test
def named_expr_annotation_value():
var_x: int = (var_a := Expr.int(0))
Expr.str(var_x)
Expr.str(var_a)
@TestParser.test
def named_expr_as_annotation():
var_x: (var_ann := Expr.str(0))
Expr.str(var_ann)
@TestParser.test
def named_expr_as_annotation_with_value():
var_x: (var_ann := Expr.str(0)) = Expr.int(1)
Expr.str(var_x)
Expr.str(var_ann)
def test_pil_builder_assign():
with TestParser():
@TestParser.test
def assign_name():
var_x = Expr.int(0)
@TestParser.test
def assign_name_rhs_call():
var_x = Expr.int(0) + Expr.int(1)
@TestParser.test
def assign_multi_target():
var_x = var_y = Expr.int(0)
@TestParser.test
def assign_attr():
var_obj = Expr(0)
var_obj.val = Expr.int(0)
@TestParser.test
def assign_attr_rhs_call():
var_obj = Expr(0)
var_obj.val = Expr.int(0) + Expr.int(1)
@TestParser.test
def assign_attr_chain():
var_obj = Expr(0)
var_obj.val = Expr(1)
var_obj.val.val = Expr.int(0)
@TestParser.test
def assign_subscript_const_index():
var_obj = Expr(0)
var_obj[0] = Expr.int(1)
@TestParser.test
def assign_subscript_expr_index():
var_obj = Expr(0)
var_obj[Expr.int(0)] = Expr.int(1)
@TestParser.test
def assign_subscript_attr_index():
var_obj = Expr(0)
var_idx = Expr(1)
var_idx.val = Expr.int(0)
var_obj[var_idx.val] = Expr.int(1)
@TestParser.test
def assign_subscript_subscript_index():
var_obj = Expr(0)
var_idx = Expr(1)
var_idx[0] = Expr.int(0)
var_obj[var_idx[0]] = Expr.int(1)
@TestParser.test
def assign_subscript_binop_index():
var_obj = Expr(0)
var_obj[Expr.int(0) + Expr.int(1)] = Expr.int(2)
@TestParser.test
def assign_subscript_slice():
var_obj = Expr(0)
var_obj[0:2] = Expr.int(1)
@TestParser.test
def assign_subscript_slice_with_step():
var_obj = Expr(0)
var_obj[0:4:2] = Expr.int(1)
@TestParser.test
def assign_subscript_expr_slice():
var_obj = Expr(0)
var_obj[Expr.int(0):Expr.int(1)] = Expr.int(2)
@TestParser.test
def assign_subscript_attr_slice():
var_obj = Expr(0)
var_lo = Expr(1)
var_lo.val = Expr.int(0)
var_hi = Expr(2)
var_hi.val = Expr.int(2)
var_obj[var_lo.val:var_hi.val] = Expr.int(3)
@TestParser.test
def assign_subscript_subscript_slice():
var_obj = Expr(0)
var_lo = Expr(1)
var_lo[0] = Expr.int(0)
var_hi = Expr(2)
var_hi[0] = Expr.int(2)
var_obj[var_lo[0]:var_hi[0]] = Expr.int(3)
@TestParser.test
def assign_subscript_binop_slice():
var_obj = Expr(0)
var_obj[Expr.int(0) + 1: Expr.int(1) * 2] = Expr.int(2)
@TestParser.test
def assign_attr_subscript():
var_obj = Expr(0)
var_obj.val = Expr(1)
var_obj.val[0] = Expr.int(1)
@TestParser.test
def assign_subscript_attr():
var_obj = Expr(0)
var_obj[0] = Expr(1)
var_obj[0].val = Expr.int(1)
@TestParser.test
def assign_subscript_attr_subscript_attr():
var_obj = Expr(0)
var_obj[0] = Expr(1)
var_obj[0].val = Expr(2)
var_obj[0].val[0] = Expr(3)
var_obj[0].val[0].val = Expr.int(1)
@TestParser.test
def assign_tuple_unpack():
var_x, var_y = Expr.int(0), Expr.int(1)
@TestParser.test
def assign_list_unpack():
[var_x, var_y] = [Expr.int(0), Expr.int(1)]
@TestParser.test
def assign_starred_unpack():
var_x, *var_y, var_z = [Expr.int(0), Expr.int(1), Expr.int(2), Expr.int(3)]
@TestParser.test
def assign_nested_tuple_unpack():
(var_x, (var_y, var_z)) = (Expr.int(0), (Expr.int(1), Expr.int(2)))
@TestParser.test
def assign_unpack_to_attr_subscript():
var_obj = Expr(0)
var_obj.val = Expr.int(0)
var_arr = Expr(1)
var_arr[0] = Expr.int(0)
var_obj.val, var_arr[0] = Expr.int(1), Expr.int(2)
@TestParser.test
def assign_chain_name_name():
var_x = var_y = Expr.int(0)
@TestParser.test
def assign_chain_name_attr():
var_obj = Expr(0)
var_obj.val = Expr.int(0)
var_x = var_obj.val = Expr.int(1)
@TestParser.test
def assign_chain_name_subscript():
var_obj = Expr(0)
var_obj[0] = Expr.int(0)
var_x = var_obj[0] = Expr.int(1)
@TestParser.test
def assign_chain_attr_subscript():
var_obj = Expr(0)
var_obj.val = Expr.int(0)
var_arr = Expr(1)
var_arr[0] = Expr.int(0)
var_obj.val = var_arr[0] = Expr.int(1)
@TestParser.test
def assign_chain_three():
var_obj = Expr(0)
var_obj.val = Expr.int(0)
var_arr = Expr(1)
var_arr[0] = Expr.int(0)
var_x = var_obj.val = var_arr[0] = Expr.int(1)
@TestParser.test
def assign_chain_tuple_name():
var_x = var_a, var_b = Expr.int(0), Expr.int(1)
@TestParser.test
def assign_chain_tuple_tuple():
var_a, var_b = var_c, var_d = Expr.int(0), Expr.int(1)
@TestParser.test
def assign_chain_list_list():
[var_a, var_b] = [var_c, var_d] = [Expr.int(0), Expr.int(1)]
@TestParser.test
def assign_chain_tuple_nested_2():
var_x = var_a, (var_b, var_c) = Expr.int(0), (Expr.int(1), Expr.int(2))
@TestParser.test
def assign_chain_tuple_nested_3():
var_x = var_a, (var_b, (var_c, var_d)) = \
Expr.int(0), (Expr.int(1), (Expr.int(2), Expr.int(3)))
@TestParser.test
def assign_chain_list_nested_3():
var_x = [var_a, [var_b, [var_c, var_d]]] = \
[Expr.int(0), [Expr.int(1), [Expr.int(2), Expr.int(3)]]]
@TestParser.test
def assign_chain_mixed_nested_3():
var_x = var_a, [var_b, (var_c, var_d)] = \
Expr.int(0), [Expr.int(1), (Expr.int(2), Expr.int(3))]
@TestParser.test
def assign_chain_starred_nested():
var_x = [var_a, var_b, var_c, var_d] = [Expr.int(0), Expr.int(1), Expr.int(2), Expr.int(3)]
var_a, *var_rest, var_z = var_x = [Expr.int(0), Expr.int(1), Expr.int(2), Expr.int(3)]
@TestParser.test
def assign_chain_three_nested():
var_x = [var_c, var_d] = var_a, var_b = [Expr.int(0), Expr.int(1)]
def test_pil_builder_aug_assign():
with TestParser():
@TestParser.test
def aug_assign_name():
var_x = Expr.int(0)
var_x += Expr.int(1)
@TestParser.test
def aug_assign_name_rhs_call():
var_x = Expr.int(0)
var_x += Expr.int(1) * Expr.int(2)
@TestParser.test
def aug_assign_attr():
var_obj = Expr(0)
var_obj.val = Expr.int(0)
var_obj.val += Expr.int(1)
@TestParser.test
def aug_assign_attr_rhs_call():
var_obj = Expr(0)
var_obj.val = Expr.int(0)
var_obj.val += Expr.int(1) + Expr.int(2)
@TestParser.test
def aug_assign_subscript():
var_obj = Expr(0)
var_obj[0] = Expr.int(1)
var_obj[0] += Expr.int(2)
@TestParser.test
def aug_assign_subscript_rhs_call():
var_obj = Expr(0)
var_obj[0] = Expr.int(1)
var_obj[0] += Expr.int(2) * Expr.int(3)
@TestParser.test
def aug_assign_subscript_expr_index():
var_obj = Expr(0)
var_obj[Expr.int(0)] = Expr.int(1)
var_obj[Expr.int(0)] += Expr.int(2)
@TestParser.test
def aug_assign_nested_attr_subscript():
var_obj = Expr(0)
var_obj.val = Expr(1)
var_obj.val[0] = Expr.int(1)
var_obj.val[0] += Expr.int(2) + Expr.int(3)
@TestParser.test
def aug_assign_subscript_attr_chain():
var_obj = Expr(0)
var_obj[0] = Expr(1)
var_obj[0].val = Expr.int(1)
var_obj[0].val += Expr.int(2)
@TestParser.test
def aug_assign_attr_subscript_attr_subscript():
var_obj = Expr(0)
var_obj.val = Expr(1)
var_obj.val[0] = Expr(2)
var_obj.val[0].val = Expr(3)
var_obj.val[0].val[0] = Expr.int(1)
var_obj.val[0].val[0] += Expr.int(2)
@TestParser.test
def aug_assign_subscript_slice():
var_obj = Expr(0)
var_obj[0:1] = Expr.int(1)
var_obj[0:1] += Expr.int(2)
@TestParser.test
def aug_assign_subscript_slice_with_step():
var_obj = Expr(0)
var_obj[0:4:2] = Expr.int(1)
var_obj[0:4:2] += Expr.int(2)
def test_pil_builder_ann_assign():
with TestParser():
@TestParser.test
def ann_assign_only_call_annotation():
var_x: Expr.str(0)
@TestParser.test
def ann_assign_only_const_annotation():
var_x: int
@TestParser.test
def ann_assign_name_call_annotation():
var_x: Expr.str(0) = Expr.int(1)
@TestParser.test
def ann_assign_name_const_annotation():
var_x: int = Expr.int(0)
@TestParser.test
def ann_assign_attr_target():
var_obj = Expr(0)
var_obj.val: Expr.str(0) = Expr.int(1)
@TestParser.test
def ann_assign_subscript_target():
var_obj = Expr(0)
var_obj[0]: Expr.str(0) = Expr.int(1)
@TestParser.test
def ann_assign_subscript_target_obj_from_call():
def make():
return Expr(0)
make()[0]: Expr.str(0) = Expr.int(1)
@TestParser.test
def ann_assign_subscript_target_slice_from_call():
var_obj = Expr(0)
var_obj[Expr.int(0)]: Expr.str(1) = Expr.int(2)
@TestParser.test
def ann_assign_subscript_target_obj_and_slice_from_calls():
def make():
return Expr(0)
make()[Expr.int(0)]: Expr.str(1) = Expr.int(2)
@TestParser.test
def ann_assign_subscript_target_slice_range_from_calls():
var_obj = Expr(0)
var_obj[Expr.int(0):Expr.int(1)]: Expr.str(2) = Expr.int(3)
@TestParser.test
def ann_assign_subscript_target_obj_call_slice_range():
def make():
return Expr(0)
make()[Expr.int(0):Expr.int(1)]: Expr.str(2) = Expr.int(3)
@TestParser.test
def ann_assign_binop_annotation():
var_x: Expr.int(0) + Expr.int(1) = Expr.int(2)
def test_pil_builder_delete():
with TestParser():
@TestParser.test
def delete_name():
var_x = Expr.int(0)
del var_x
@TestParser.test
def delete_attribute():
var_obj = Expr(0)
var_obj.val = Expr.str(1)
del var_obj.val
@TestParser.test
def delete_subscript():
var_obj = Expr(0)
var_obj[Expr.str(1)] = Expr.str(2)
del var_obj[Expr.str(1)]
@TestParser.test
def delete_subscript_slice():
var_obj = Expr(0)
var_obj[Expr.int(1):Expr.int(2)] = Expr.str(2)
del var_obj[Expr.int(1):Expr.int(2)]
@TestParser.test
def delete_subscript_tuple():
var_obj = Expr(0)
var_obj[Expr.int(1), Expr.int(2)] = Expr.str(2)
del var_obj[Expr.int(1), Expr.int(2)]
@TestParser.test
def delete_subscript_tuple_slice():
var_obj = Expr(0)
var_obj[Expr.int(1), Expr.int(2):Expr.int(3)] = Expr.str(2)
del var_obj[Expr.int(1), Expr.int(2):Expr.int(3)]
@TestParser.test
def delete_tuple():
var_a = Expr.int(0)
var_b = Expr.int(1)
del var_a, var_b
@TestParser.test
def delete_nested_tuple():
var_a = Expr.int(0)
var_b = Expr.int(1)
del (var_a, var_b)
@TestParser.test
def delete_nested_list():
a = Expr.int(0)
b = Expr.int(1)
del [a, b]
@TestParser.test
def delete_mixed():
var_obj = Expr(0)
var_obj.val = Expr.str(1)
var_obj[Expr.str(2)] = Expr.str(3)
var_x = Expr.int(4)
del var_x, var_obj.val, var_obj[Expr.str(2)]