From 6d3936301023f3c9f69e863d00b14ccf002389b1 Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Mon, 7 Nov 2022 10:12:24 -0500 Subject: [PATCH 01/48] Implemented assert_neq --- python/inline/conftest.py | 53 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/python/inline/conftest.py b/python/inline/conftest.py index af7acef..33c92d1 100644 --- a/python/inline/conftest.py +++ b/python/inline/conftest.py @@ -240,7 +240,7 @@ class ExtractInlineTest(ast.NodeTransformer): # TODO: Zach - Finish Implementation of assertNull, assertNotEquals, assertInstanceOf, assertThrows check_null_str = "check_null" check_not_null_str = "check_not_null" - check_not_equals_str = "check_not_equals" + check_not_equals_str = "check_neq" check_instance_of = "check_instance_of" check_throw = "check_throw" ########################################################################################################## @@ -730,6 +730,52 @@ def parse_check_false(self, node): "inline test: invalid check_false(), expected 1 arg" ) + #TODO CHANGE FOR ASSERT NOT EQUALS + #Reference _ast.pyi Abstract Syntax Tree + def build_assert_neq(self, left_node, comparator_node): + equal_node = ast.Compare( + left=left_node, + ops=[ast.NotEq()], + comparators=[comparator_node], + ) + assert_node = ast.Assert( + test=equal_node, + msg=ast.Call( + func=ast.Attribute( + ast.Constant("{0} == {1}\nActual: {2}\nExpected: {3}\n"), + "format", + ast.Load(), + ), + args=[ + ast.Constant(self.node_to_source_code(left_node)), + ast.Constant(self.node_to_source_code(comparator_node)), + left_node, + comparator_node, + ], + keywords=[], + ), + ) + return assert_node + + def parse_check_neq(self, node): + # check if the function being called is an inline test function + if len(node.args) == 2: + left_node = self.parse_group(node.args[0]) + if self.cur_inline_test.parameterized: + self.parameterized_inline_tests_init(node.args[1]) + for index, value in enumerate(node.args[1].elts): + comparator_node = self.parse_group(value) + assert_node = self.build_assert_neq(left_node, comparator_node) + self.cur_inline_test.parameterized_inline_tests[ + index + ].check_stmts.append(assert_node) + else: + comparator_node = self.parse_group(node.args[1]) + assert_node = self.build_assert_neq(left_node, comparator_node) + self.cur_inline_test.check_stmts.append(assert_node) + else: + raise MalformedException("inline test: invalid check_neq(), expected 2 args") + def parse_group(self, node): if ( isinstance(node, ast.Call) @@ -805,7 +851,7 @@ def parse_inline_test(self, node): else: break - # "check_eq" or "check_true" or "check_false" + # "check_eq" or "check_true" or "check_false" or "check_neq" for call in inline_test_calls[inline_test_call_index:]: # "check_eq(a, 1)" if call.func.attr == self.check_eq_str: @@ -816,6 +862,9 @@ def parse_inline_test(self, node): # "check_false(a)" elif call.func.attr == self.check_false_str: self.parse_check_false(call) + # "check_neq(a, 1)" + elif call.func.attr == self.check_not_equals_str: + self.parse_check_neq(call) elif call.func.attr == self.given_str: raise MalformedException( f"inline test: given() must be called before check_eq()/check_true()/check_false()" From 8010ec8b64fffa27325c1e96a506307282a8954c Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Mon, 7 Nov 2022 11:02:02 -0500 Subject: [PATCH 02/48] Implemented check_none and check_not_none --- python/inline/conftest.py | 91 ++++++++++++++++++++++++++++++++++- python/inline/inline.py | 4 +- python/tests/test_conftest.py | 46 ++++++++++++++++++ 3 files changed, 137 insertions(+), 4 deletions(-) diff --git a/python/inline/conftest.py b/python/inline/conftest.py index 33c92d1..e4f8cb5 100644 --- a/python/inline/conftest.py +++ b/python/inline/conftest.py @@ -238,8 +238,8 @@ class ExtractInlineTest(ast.NodeTransformer): check_false_str = "check_false" ########################################################################################################## # TODO: Zach - Finish Implementation of assertNull, assertNotEquals, assertInstanceOf, assertThrows - check_null_str = "check_null" - check_not_null_str = "check_not_null" + check_none_str = "check_none" + check_not_none_str = "check_not_none" check_not_equals_str = "check_neq" check_instance_of = "check_instance_of" check_throw = "check_throw" @@ -776,6 +776,89 @@ def parse_check_neq(self, node): else: raise MalformedException("inline test: invalid check_neq(), expected 2 args") + #TODO CHANGE FOR ASSERT NONE + #Reference _ast.pyi Abstract Syntax Tree + def build_assert_none(self, left_node): + equal_node = ast.Compare( + left=left_node, + ops=[ast.Is()], + comparators=[ast.Constant(None)], + ) + assert_node = ast.Assert( + test=equal_node, + msg=ast.Call( + func=ast.Attribute( + ast.Constant("Assertion that value was None failed\n"), + "format", + ast.Load(), + ), + args=[], + keywords=[], + ), + ) + return assert_node + + def parse_check_none(self, node): + if len(node.args) == 1: + if self.cur_inline_test.parameterized: + self.parameterized_inline_tests_init(node.args[0]) + for index, value in enumerate(node.args[0].elts): + operand_node = self.parse_group(value) + assert_node = self.build_assert_none(operand_node) + self.cur_inline_test.parameterized_inline_tests[ + index + ].check_stmts.append(assert_node) + else: + operand_node = self.parse_group(node.args[0]) + assert_node = self.build_assert_none(operand_node) + self.cur_inline_test.check_stmts.append(assert_node) + else: + raise MalformedException( + "inline test: invalid check_none(), expected 1 arg" + ) + + #TODO CHANGE FOR ASSERT NONE + #Reference _ast.pyi Abstract Syntax Tree + def build_assert_not_none(self, left_node): + equal_node = ast.Compare( + left=left_node, + ops=[ast.IsNot()], + comparators=[ast.Constant(None)], + ) + assert_node = ast.Assert( + test=equal_node, + msg=ast.Call( + func=ast.Attribute( + ast.Constant("Assertion that value was not None failed\n"), + "format", + ast.Load(), + ), + args=[], + keywords=[], + ), + ) + return assert_node + + def parse_check_not_none(self, node): + if len(node.args) == 1: + if self.cur_inline_test.parameterized: + self.parameterized_inline_tests_init(node.args[0]) + for index, value in enumerate(node.args[0].elts): + operand_node = self.parse_group(value) + assert_node = self.build_assert_not_none(operand_node) + self.cur_inline_test.parameterized_inline_tests[ + index + ].check_stmts.append(assert_node) + else: + operand_node = self.parse_group(node.args[0]) + assert_node = self.build_assert_not_none(operand_node) + self.cur_inline_test.check_stmts.append(assert_node) + else: + raise MalformedException( + "inline test: invalid check_none(), expected 1 arg" + ) + + def parse_group(self, node): if ( isinstance(node, ast.Call) @@ -865,6 +948,10 @@ def parse_inline_test(self, node): # "check_neq(a, 1)" elif call.func.attr == self.check_not_equals_str: self.parse_check_neq(call) + elif call.func.attr == self.check_none_str: + self.parse_check_none(call) + elif call.func.attr == self.check_not_none_str: + self.parse_check_not_none(call) elif call.func.attr == self.given_str: raise MalformedException( f"inline test: given() must be called before check_eq()/check_true()/check_false()" diff --git a/python/inline/inline.py b/python/inline/inline.py index f77c902..d9807de 100644 --- a/python/inline/inline.py +++ b/python/inline/inline.py @@ -65,7 +65,7 @@ def check_false(self, expr): ####################################################################### # TODO Zach - Add More API for Asserts as Development Continues - def check_null(self, value): + def check_none(self, value): """ Assert whether an object is null @@ -75,7 +75,7 @@ def check_null(self, value): """ return self - def check_not_null(self, value): + def check_not_none(self, value): """ Assert whether a value is not null diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index b718e7e..598a019 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -429,3 +429,49 @@ def loop(b): res = pytester.runpytest() res.ret == 0 pytest.raises(TimeoutException) + + + def test_assert_neq(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): + a = a - 1 + Here().given(a, 1).check_neq(a, 1) + """ + ) + for x in (pytester.path, checkfile): + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 0 + + def test_assert_none(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): + a = None + Here().given(a, 1).check_none(a) + """ + ) + for x in (pytester.path, checkfile): + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 0 + + def test_assert_not_none(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): + a = 3 + Here().given(a, 1).check_not_none(a) + """ + ) + for x in (pytester.path, checkfile): + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 0 \ No newline at end of file From fbc2880b5ad38f9068e02796c9fed8f4c2d0d22a Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Wed, 9 Nov 2022 12:49:51 -0500 Subject: [PATCH 03/48] WIP for instance_of --- python/inline/conftest.py | 162 ++++++++++++++++++++++++++++++++-- python/inline/inline.py | 32 ++++++- python/tests/test_conftest.py | 45 ++++++++++ 3 files changed, 230 insertions(+), 9 deletions(-) diff --git a/python/inline/conftest.py b/python/inline/conftest.py index e4f8cb5..67a599d 100644 --- a/python/inline/conftest.py +++ b/python/inline/conftest.py @@ -243,6 +243,9 @@ class ExtractInlineTest(ast.NodeTransformer): check_not_equals_str = "check_neq" check_instance_of = "check_instance_of" check_throw = "check_throw" + check_same = "check_same" + check_not_same = "check_not_same" + fail_str = "fail" ########################################################################################################## given_str = "given" group_str = "Group" @@ -730,8 +733,6 @@ def parse_check_false(self, node): "inline test: invalid check_false(), expected 1 arg" ) - #TODO CHANGE FOR ASSERT NOT EQUALS - #Reference _ast.pyi Abstract Syntax Tree def build_assert_neq(self, left_node, comparator_node): equal_node = ast.Compare( left=left_node, @@ -776,8 +777,6 @@ def parse_check_neq(self, node): else: raise MalformedException("inline test: invalid check_neq(), expected 2 args") - #TODO CHANGE FOR ASSERT NONE - #Reference _ast.pyi Abstract Syntax Tree def build_assert_none(self, left_node): equal_node = ast.Compare( left=left_node, @@ -817,8 +816,6 @@ def parse_check_none(self, node): "inline test: invalid check_none(), expected 1 arg" ) - #TODO CHANGE FOR ASSERT NONE - #Reference _ast.pyi Abstract Syntax Tree def build_assert_not_none(self, left_node): equal_node = ast.Compare( left=left_node, @@ -855,9 +852,154 @@ def parse_check_not_none(self, node): self.cur_inline_test.check_stmts.append(assert_node) else: raise MalformedException( - "inline test: invalid check_none(), expected 1 arg" + "inline test: invalid check_not_none(), expected 1 arg" + ) + + def build_assert_same(self, left_node, comparator_node): + equal_node = ast.Compare( + left=left_node, + ops=[ast.Is()], + comparators=[comparator_node], + ) + assert_node = ast.Assert( + test=equal_node, + msg=ast.Call( + func=ast.Attribute( + ast.Constant("{0} == {1}\nActual: {2}\nExpected: {3}\n"), + "format", + ast.Load(), + ), + args=[ + ast.Constant(self.node_to_source_code(left_node)), + ast.Constant(self.node_to_source_code(comparator_node)), + left_node, + comparator_node, + ], + keywords=[], + ), + ) + return assert_node + + def parse_check_same(self, node): + # check if the function being called is an inline test function + if len(node.args) == 2: + left_node = self.parse_group(node.args[0]) + if self.cur_inline_test.parameterized: + self.parameterized_inline_tests_init(node.args[1]) + for index, value in enumerate(node.args[1].elts): + comparator_node = self.parse_group(value) + assert_node = self.build_assert_same(left_node, comparator_node) + self.cur_inline_test.parameterized_inline_tests[ + index + ].check_stmts.append(assert_node) + else: + comparator_node = self.parse_group(node.args[1]) + assert_node = self.build_assert_same(left_node, comparator_node) + self.cur_inline_test.check_stmts.append(assert_node) + else: + raise MalformedException("inline test: invalid check_same(), expected 2 args") + + def build_assert_not_same(self, left_node, comparator_node): + equal_node = ast.Compare( + left=left_node, + ops=[ast.IsNot()], + comparators=[comparator_node], + ) + assert_node = ast.Assert( + test=equal_node, + msg=ast.Call( + func=ast.Attribute( + ast.Constant("{0} == {1}\nActual: {2}\nExpected: {3}\n"), + "format", + ast.Load(), + ), + args=[ + ast.Constant(self.node_to_source_code(left_node)), + ast.Constant(self.node_to_source_code(comparator_node)), + left_node, + comparator_node, + ], + keywords=[], + ), + ) + return assert_node + + def parse_check_not_same(self, node): + # check if the function being called is an inline test function + if len(node.args) == 2: + left_node = self.parse_group(node.args[0]) + if self.cur_inline_test.parameterized: + self.parameterized_inline_tests_init(node.args[1]) + for index, value in enumerate(node.args[1].elts): + comparator_node = self.parse_group(value) + assert_node = self.build_assert_not_same(left_node, comparator_node) + self.cur_inline_test.parameterized_inline_tests[ + index + ].check_stmts.append(assert_node) + else: + comparator_node = self.parse_group(node.args[1]) + assert_node = self.build_assert_not_same(left_node, comparator_node) + self.cur_inline_test.check_stmts.append(assert_node) + else: + raise MalformedException("inline test: invalid check_not_same(), expected 2 args") + + # TODO Assert Instance of + def build_assert_instance_of(self, left_node, type): + print("LeftNode") + print(left_node) + print(ast.unparse(left_node)) + print("TYPE IS ") + print(ast.unparse(type)) + assert_node = ast.Assert( + test=ast.Call( + func = isinstance(ast.unparse(left_node), ast.unparse(type)), + args= [ + left_node, + ], + keywords = [] ) + ) + return assert_node + def parse_check_instance_of(self, node): + # check if the function being called is an inline test function + print("Node is") + print(node) + if len(node.args) == 2: + left_node = self.parse_group(node.args[0]) + if self.cur_inline_test.parameterized: + self.parameterized_inline_tests_init(node.args[1]) + for index, value in enumerate(node.args[1].elts): + comparator_node = self.parse_group(value) + assert_node = self.build_assert_instance_of(left_node, comparator_node) + self.cur_inline_test.parameterized_inline_tests[ + index + ].check_stmts.append(assert_node) + else: + comparator_node = self.parse_group(node.args[1]) + assert_node = self.build_assert_instance_of(left_node, comparator_node) + self.cur_inline_test.check_stmts.append(assert_node) + else: + raise MalformedException("inline test: invalid check_instance_of(), expected 2 args") + + def build_fail(self): + equal_node = ast.Compare( + left=ast.Constant(0), + ops=[ast.Eq()], + comparators=[ast.Constant(1)], + ) + assert_node = ast.Assert( + test=equal_node + + ) + return assert_node + + def parse_fail(self, node): + # check if the function being called is an inline test function + if len(node.args) == 0: + self.build_fail() + else: + raise MalformedException("inline test: invalid check_instance_of(), expected 2 args") def parse_group(self, node): if ( @@ -952,6 +1094,12 @@ def parse_inline_test(self, node): self.parse_check_none(call) elif call.func.attr == self.check_not_none_str: self.parse_check_not_none(call) + elif call.func.attr == self.check_same: + self.parse_check_same(call) + elif call.func.attr == self.check_not_same: + self.parse_check_not_same(call) + elif call.func.attr == self.check_instance_of: + self.parse_check_instance_of(call) elif call.func.attr == self.given_str: raise MalformedException( f"inline test: given() must be called before check_eq()/check_true()/check_false()" diff --git a/python/inline/inline.py b/python/inline/inline.py index d9807de..2d122da 100644 --- a/python/inline/inline.py +++ b/python/inline/inline.py @@ -89,7 +89,7 @@ def check_not_equals(self, actual_value, expected_value): """ Assert whether two values are not equal - :param actual_value: an value to check against expected + :param actual_value: a value to check against expected :param expected_value: expected value :returns: Inline object :raises: AssertionError @@ -101,7 +101,7 @@ def check_instance_of(self, actual_type, expected_type): Assert whether an object is an instance of a given type :param actual_type: the value to check against expected - :param expected_type: expected type + :param expected_type: expected type, can be a tuple :returns: Inline object :raises: AssertionError """ @@ -118,7 +118,35 @@ def check_throw(self, executable, expected_type_exception): """ return self + def check_same(self, actual_value, expected_value): + """ + Assert whether an object is the same as a given expected object + + :param actual_value: a value to check against expected + :param expected_value: expected value + :returns: Inline object + :raises: AssertionError + """ + return self + def check_not_same(self, actual_value, expected_value): + """ + Assert whether an object is not the same as a given expected object + + :param actual_value: a value to check against expected + :param expected_value: expected value + :returns: Inline object + :raises: AssertionError + """ + return self + + def fail(self): + """ + Fails the test + + :returns: Inline object + :raises: AssertionError + """ ####################################################################### diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index 598a019..04167d9 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -468,6 +468,51 @@ def test_assert_not_none(self, pytester: Pytester): def m(a): a = 3 Here().given(a, 1).check_not_none(a) + """ + ) + for x in (pytester.path, checkfile): + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 0 + + def test_assert_same(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): + b = a + Here().given(a, "Hi").check_same(a,b) + """ + ) + for x in (pytester.path, checkfile): + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 0 + + def test_assert_not_same(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): + b = a + "a" + Here().given(a, "Hi").check_not_same(a,b) + """ + ) + for x in (pytester.path, checkfile): + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 0 + + def test_assert_instance_of(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): + b = a + "a" + Here().given(a, "Hi").check_instance_of(a, int) """ ) for x in (pytester.path, checkfile): From 7ca19fa93471782979d37926779454f0122d92ba Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Fri, 11 Nov 2022 00:58:27 -0500 Subject: [PATCH 04/48] Implemented fail --- python/inline/conftest.py | 78 +++++++++++++++++------------------ python/tests/test_conftest.py | 24 ++++++++--- 2 files changed, 57 insertions(+), 45 deletions(-) diff --git a/python/inline/conftest.py b/python/inline/conftest.py index 67a599d..0feb82e 100644 --- a/python/inline/conftest.py +++ b/python/inline/conftest.py @@ -943,44 +943,42 @@ def parse_check_not_same(self, node): else: raise MalformedException("inline test: invalid check_not_same(), expected 2 args") - # TODO Assert Instance of - def build_assert_instance_of(self, left_node, type): - print("LeftNode") - print(left_node) - print(ast.unparse(left_node)) - print("TYPE IS ") - print(ast.unparse(type)) - assert_node = ast.Assert( - test=ast.Call( - func = isinstance(ast.unparse(left_node), ast.unparse(type)), - args= [ - left_node, - ], - keywords = [] - ) - ) - return assert_node - - def parse_check_instance_of(self, node): - # check if the function being called is an inline test function - print("Node is") - print(node) - if len(node.args) == 2: - left_node = self.parse_group(node.args[0]) - if self.cur_inline_test.parameterized: - self.parameterized_inline_tests_init(node.args[1]) - for index, value in enumerate(node.args[1].elts): - comparator_node = self.parse_group(value) - assert_node = self.build_assert_instance_of(left_node, comparator_node) - self.cur_inline_test.parameterized_inline_tests[ - index - ].check_stmts.append(assert_node) - else: - comparator_node = self.parse_group(node.args[1]) - assert_node = self.build_assert_instance_of(left_node, comparator_node) - self.cur_inline_test.check_stmts.append(assert_node) - else: - raise MalformedException("inline test: invalid check_instance_of(), expected 2 args") + # TODO Assert Instance of WORK IN PROGRESS + # def build_assert_instance_of(self, left_node, type): + # print("LeftNode") + # print(left_node) + # print(ast.unparse(left_node)) + # print("TYPE IS ") + # print(ast.unparse(type)) + # assert_node = ast.Assert( + # test=ast.Call( + # func = isinstance(ast.unparse(left_node), locate(ast.unparse(type))), + # args= [], + # keywords = [] + # ) + # ) + # return assert_node + + # def parse_check_instance_of(self, node): + # # check if the function being called is an inline test function + # print("Node is") + # print(node) + # if len(node.args) == 2: + # left_node = self.parse_group(node.args[0]) + # if self.cur_inline_test.parameterized: + # self.parameterized_inline_tests_init(node.args[1]) + # for index, value in enumerate(node.args[1].elts): + # comparator_node = self.parse_group(value) + # assert_node = self.build_assert_instance_of(left_node, comparator_node) + # self.cur_inline_test.parameterized_inline_tests[ + # index + # ].check_stmts.append(assert_node) + # else: + # comparator_node = self.parse_group(node.args[1]) + # assert_node = self.build_assert_instance_of(left_node, comparator_node) + # self.cur_inline_test.check_stmts.append(assert_node) + # else: + # raise MalformedException("inline test: invalid check_instance_of(), expected 2 args") def build_fail(self): equal_node = ast.Compare( @@ -1098,8 +1096,8 @@ def parse_inline_test(self, node): self.parse_check_same(call) elif call.func.attr == self.check_not_same: self.parse_check_not_same(call) - elif call.func.attr == self.check_instance_of: - self.parse_check_instance_of(call) + elif call.func.attr == self.fail_str: + self.parse_fail(call) elif call.func.attr == self.given_str: raise MalformedException( f"inline test: given() must be called before check_eq()/check_true()/check_false()" diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index 04167d9..7abe180 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -506,17 +506,31 @@ def m(a): res = pytester.runpytest() assert res.ret == 0 - def test_assert_instance_of(self, pytester: Pytester): + # def test_assert_instance_of(self, pytester: Pytester): + # checkfile = pytester.makepyfile( + # """ + # from inline import Here + # def m(a): + # b = a + "a" + # Here().given(a, "Hi").check_instance_of(a, int) + # """ + # ) + # for x in (pytester.path, checkfile): + # items, reprec = pytester.inline_genitems(x) + # assert len(items) == 1 + # res = pytester.runpytest() + # assert res.ret == 0 + + def test_fail_statement(self, pytester: Pytester): checkfile = pytester.makepyfile( """ from inline import Here def m(a): b = a + "a" - Here().given(a, "Hi").check_instance_of(a, int) + Here().given(a, "Hi").fail() """ ) for x in (pytester.path, checkfile): items, reprec = pytester.inline_genitems(x) - assert len(items) == 1 - res = pytester.runpytest() - assert res.ret == 0 \ No newline at end of file + assert len(items) == 0 + res = pytester.runpytest() \ No newline at end of file From 5718f3097c02d7526da2b48d3fb6b6fa2829f2eb Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Sun, 13 Nov 2022 15:33:19 -0600 Subject: [PATCH 05/48] prepare for release --- python/LICENSE | 19 +++++++++++++++++++ python/README.rst | 5 +++++ python/pyproject.toml | 3 +++ python/setup.py | 8 ++++---- 4 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 python/LICENSE create mode 100644 python/README.rst create mode 100644 python/pyproject.toml diff --git a/python/LICENSE b/python/LICENSE new file mode 100644 index 0000000..8a1111b --- /dev/null +++ b/python/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2022 Inline Tests Dev Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/python/README.rst b/python/README.rst new file mode 100644 index 0000000..5817755 --- /dev/null +++ b/python/README.rst @@ -0,0 +1,5 @@ +=============== +pytest-inline +=============== + +pytest-inline is a plugin for `pytest `_ that writes inline tests. \ No newline at end of file diff --git a/python/pyproject.toml b/python/pyproject.toml new file mode 100644 index 0000000..7fd26b9 --- /dev/null +++ b/python/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/python/setup.py b/python/setup.py index dec5b46..2352735 100644 --- a/python/setup.py +++ b/python/setup.py @@ -22,9 +22,9 @@ def read(fname): license="MIT", url="https://github.com/sweetStreet/pytest-inline", description="A simple plugin to use with pytest", - long_description="TODO", # read('README.rst'), + long_description=read('README.rst'), packages=["inline"], - python_requires=">=3.6", + python_requires=">=3.7", install_requires=["pytest>=7.0.0"], classifiers=[ "Development Status :: 4 - Beta", @@ -33,10 +33,10 @@ def read(fname): "Topic :: Software Development :: Testing", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.5", - "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", From 3d4249d74d762411993b8f30252994ec865bd32d Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Sun, 13 Nov 2022 15:42:05 -0600 Subject: [PATCH 06/48] update project name --- python/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/setup.py b/python/setup.py index 2352735..670ad13 100644 --- a/python/setup.py +++ b/python/setup.py @@ -13,7 +13,7 @@ def read(fname): setup( - name="inline", + name="pytest-inline", version="0.1.0", author="Yu Liu", author_email="yuki.liu@utexas.edu", From 1aab7328cd5902448c0c68bc6db361c1741c626e Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Sun, 13 Nov 2022 15:50:46 -0600 Subject: [PATCH 07/48] update url --- python/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/setup.py b/python/setup.py index 670ad13..4feadfc 100644 --- a/python/setup.py +++ b/python/setup.py @@ -20,7 +20,7 @@ def read(fname): maintainer="Yu Liu", maintainer_email="yuki.liu@utexas.edu", license="MIT", - url="https://github.com/sweetStreet/pytest-inline", + url="https://github.com/EngineeringSoftware/inlinetest", description="A simple plugin to use with pytest", long_description=read('README.rst'), packages=["inline"], From ffe6d85d9a5fa4a227cbc0efaa609e341e2e5e60 Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Sun, 13 Nov 2022 15:53:58 -0600 Subject: [PATCH 08/48] update gitignore --- python/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/.gitignore b/python/.gitignore index bc1a61a..044df8c 100644 --- a/python/.gitignore +++ b/python/.gitignore @@ -1,2 +1,3 @@ /build -/*.egg-info \ No newline at end of file +/*.egg-info +/dist \ No newline at end of file From 71140722c871854019f3d4a060bf0f2a1e6b32ad Mon Sep 17 00:00:00 2001 From: Yu Liu Date: Mon, 14 Nov 2022 15:23:24 -0600 Subject: [PATCH 09/48] Update README.md --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cd1b345..dd355ad 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ Ekstazi I-Test is a framework for writing inline tests in Python and Java. + ## Introduction This repo contains the code and data for producing the experiments in @@ -31,7 +32,7 @@ The data includes: * **replicate our performance evaluation of I-Test**: see detailed steps in [REPLICATION.md](/REPLICATION.md) * **replicate other parts of our paper, e.g., collecting examples and user study**: we already described the steps in the paper, and you may find the documents and intermediate files for those in this repository; see the remainder of this README for more details -## Content of this Repository +## Repo structure - [java](/java): code of I-Test framework for Java - [python](/python): code of I-Test framework for Python @@ -127,6 +128,13 @@ the logs by doing `python -m research.exp_integrated view_result (modify the results file path accordingly), and fix the scripts/patches as needed. +### Installation and usage + +Use `pip install pytest-inline` to install our Python pytest-plugin + +Use `pytest .` to run all inline tests in working directory + +Use `pytest {filename}` to run all inline tests in a Python file ## Citation From 00101d8c33d442dfc15392e98883eff9cc378ee8 Mon Sep 17 00:00:00 2001 From: Yu Liu Date: Mon, 14 Nov 2022 15:23:49 -0600 Subject: [PATCH 10/48] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dd355ad..5ff56eb 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ the logs by doing `python -m research.exp_integrated view_result (modify the results file path accordingly), and fix the scripts/patches as needed. -### Installation and usage +## Installation and usage Use `pip install pytest-inline` to install our Python pytest-plugin From 9b801e420e16aeb0e2dec86801bc5a99a13518a6 Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Tue, 15 Nov 2022 11:45:26 -0500 Subject: [PATCH 11/48] Updated changes for pull request --- python/inline/conftest.py | 44 +-------------------------------------- python/inline/inline.py | 22 -------------------- 2 files changed, 1 insertion(+), 65 deletions(-) diff --git a/python/inline/conftest.py b/python/inline/conftest.py index 0feb82e..255f4f6 100644 --- a/python/inline/conftest.py +++ b/python/inline/conftest.py @@ -236,17 +236,12 @@ class ExtractInlineTest(ast.NodeTransformer): check_eq_str = "check_eq" check_true_str = "check_true" check_false_str = "check_false" - ########################################################################################################## - # TODO: Zach - Finish Implementation of assertNull, assertNotEquals, assertInstanceOf, assertThrows check_none_str = "check_none" check_not_none_str = "check_not_none" - check_not_equals_str = "check_neq" - check_instance_of = "check_instance_of" - check_throw = "check_throw" + check_neq_str = "check_neq" check_same = "check_same" check_not_same = "check_not_same" fail_str = "fail" - ########################################################################################################## given_str = "given" group_str = "Group" arg_test_name_str = "test_name" @@ -943,43 +938,6 @@ def parse_check_not_same(self, node): else: raise MalformedException("inline test: invalid check_not_same(), expected 2 args") - # TODO Assert Instance of WORK IN PROGRESS - # def build_assert_instance_of(self, left_node, type): - # print("LeftNode") - # print(left_node) - # print(ast.unparse(left_node)) - # print("TYPE IS ") - # print(ast.unparse(type)) - # assert_node = ast.Assert( - # test=ast.Call( - # func = isinstance(ast.unparse(left_node), locate(ast.unparse(type))), - # args= [], - # keywords = [] - # ) - # ) - # return assert_node - - # def parse_check_instance_of(self, node): - # # check if the function being called is an inline test function - # print("Node is") - # print(node) - # if len(node.args) == 2: - # left_node = self.parse_group(node.args[0]) - # if self.cur_inline_test.parameterized: - # self.parameterized_inline_tests_init(node.args[1]) - # for index, value in enumerate(node.args[1].elts): - # comparator_node = self.parse_group(value) - # assert_node = self.build_assert_instance_of(left_node, comparator_node) - # self.cur_inline_test.parameterized_inline_tests[ - # index - # ].check_stmts.append(assert_node) - # else: - # comparator_node = self.parse_group(node.args[1]) - # assert_node = self.build_assert_instance_of(left_node, comparator_node) - # self.cur_inline_test.check_stmts.append(assert_node) - # else: - # raise MalformedException("inline test: invalid check_instance_of(), expected 2 args") - def build_fail(self): equal_node = ast.Compare( left=ast.Constant(0), diff --git a/python/inline/inline.py b/python/inline/inline.py index 2d122da..b8ba6ec 100644 --- a/python/inline/inline.py +++ b/python/inline/inline.py @@ -96,28 +96,6 @@ def check_not_equals(self, actual_value, expected_value): """ return self - def check_instance_of(self, actual_type, expected_type): - """ - Assert whether an object is an instance of a given type - - :param actual_type: the value to check against expected - :param expected_type: expected type, can be a tuple - :returns: Inline object - :raises: AssertionError - """ - return self - - def check_throw(self, executable, expected_type_exception): - """ - Assert whether an object is an instance of a given type - - :param executable: an executable to run - :param expected_type_exception: expected type of exception executable should raise - :returns: Exception - :raises: AssertionError - """ - return self - def check_same(self, actual_value, expected_value): """ Assert whether an object is the same as a given expected object From effe58321e7a1daf90c9532cc39edfc6f2d0a50f Mon Sep 17 00:00:00 2001 From: Yu Liu Date: Tue, 15 Nov 2022 12:16:07 -0600 Subject: [PATCH 12/48] Update inline.py --- python/inline/inline.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/python/inline/inline.py b/python/inline/inline.py index b8ba6ec..70f555c 100644 --- a/python/inline/inline.py +++ b/python/inline/inline.py @@ -63,8 +63,6 @@ def check_false(self, expr): """ return self - ####################################################################### - # TODO Zach - Add More API for Asserts as Development Continues def check_none(self, value): """ Assert whether an object is null @@ -125,7 +123,6 @@ def fail(self): :returns: Inline object :raises: AssertionError """ -####################################################################### class Group: From 37d72b061fd33053b475b352c565d25611d11a88 Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Tue, 15 Nov 2022 15:39:07 -0500 Subject: [PATCH 13/48] Removed the extra test case --- python/tests/test_conftest.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index 7abe180..cca1f04 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -506,21 +506,6 @@ def m(a): res = pytester.runpytest() assert res.ret == 0 - # def test_assert_instance_of(self, pytester: Pytester): - # checkfile = pytester.makepyfile( - # """ - # from inline import Here - # def m(a): - # b = a + "a" - # Here().given(a, "Hi").check_instance_of(a, int) - # """ - # ) - # for x in (pytester.path, checkfile): - # items, reprec = pytester.inline_genitems(x) - # assert len(items) == 1 - # res = pytester.runpytest() - # assert res.ret == 0 - def test_fail_statement(self, pytester: Pytester): checkfile = pytester.makepyfile( """ From 047e82563e10beef9e20969c10c986f7b468822e Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Tue, 15 Nov 2022 15:54:57 -0500 Subject: [PATCH 14/48] Fixed check_neq_str --- python/inline/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/inline/conftest.py b/python/inline/conftest.py index 255f4f6..57b0917 100644 --- a/python/inline/conftest.py +++ b/python/inline/conftest.py @@ -1044,7 +1044,7 @@ def parse_inline_test(self, node): elif call.func.attr == self.check_false_str: self.parse_check_false(call) # "check_neq(a, 1)" - elif call.func.attr == self.check_not_equals_str: + elif call.func.attr == self.check_neq_str: self.parse_check_neq(call) elif call.func.attr == self.check_none_str: self.parse_check_none(call) From 2db3b3c9de8d8cab791ed53d532dfa5633394238 Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Tue, 15 Nov 2022 16:19:42 -0600 Subject: [PATCH 15/48] fix test file format error --- python/tests/test_conftest.py | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index c0c6c69..594ffdd 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -447,6 +447,10 @@ def loop(b): pytest.raises(TimeoutException) def test_check_order_tests(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): a = a + 1 Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) a = a - 1 @@ -457,11 +461,14 @@ def test_check_order_tests(self, pytester: Pytester): reprec = pytester.inline_run("--inlinetest-order=minus", "--inlinetest-order=add") items = [x.item for x in reprec.getcalls("pytest_itemcollected")] assert len(items) == 2 - assert items[0].dtest.test_name == "2" assert items[1].dtest.test_name == "1" - + def test_check_order_and_nonorder_tests(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): a = a + 1 Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) a = a + 2 @@ -477,9 +484,13 @@ def test_check_order_and_nonorder_tests(self, pytester: Pytester): assert items[0].dtest.test_name == "3" assert items[1].dtest.test_name == "1" - assert items[2].dtest.test_name == "2" - - def test_check_same_tag_order_tests(self, pytester: Pytester): + assert items[2].dtest.test_name == "2" + + def test_check_same_tag_order_tests(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): a = a + 1 Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) a = a + 2 @@ -501,6 +512,10 @@ def test_check_same_tag_order_tests(self, pytester: Pytester): assert items[3].dtest.test_name == "4" def test_check_group_and_order_tests(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): a = a + 1 Here(tag = ["add"]).given(a, 1).check_eq(a, 2) a = a - 1 @@ -511,7 +526,7 @@ def test_check_group_and_order_tests(self, pytester: Pytester): reprec = pytester.inline_run("--inlinetest-order=minus", "--inlinetest-order=add", "--inlinetest-group=add") items = [x.item for x in reprec.getcalls("pytest_itemcollected")] assert len(items) == 1 - + def test_assert_neq(self, pytester: Pytester): checkfile = pytester.makepyfile( """ @@ -599,4 +614,4 @@ def m(a): for x in (pytester.path, checkfile): items, reprec = pytester.inline_genitems(x) assert len(items) == 0 - res = pytester.runpytest() + res = pytester.runpytest() \ No newline at end of file From ac3401e4cf310538ab3de2942e17af3239bc151b Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Tue, 15 Nov 2022 20:35:29 -0600 Subject: [PATCH 16/48] fix API --- python/inline/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/inline/inline.py b/python/inline/inline.py index 70f555c..1b0d08a 100644 --- a/python/inline/inline.py +++ b/python/inline/inline.py @@ -83,7 +83,7 @@ def check_not_none(self, value): """ return self - def check_not_equals(self, actual_value, expected_value): + def check_neq(self, actual_value, expected_value): """ Assert whether two values are not equal From c02ef07c4cb78d7858d63709993fac700c17bd31 Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Tue, 15 Nov 2022 20:57:37 -0600 Subject: [PATCH 17/48] update API --- python/inline/inline.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/python/inline/inline.py b/python/inline/inline.py index 1b0d08a..3931bde 100644 --- a/python/inline/inline.py +++ b/python/inline/inline.py @@ -43,19 +43,20 @@ def check_eq(self, actual_value, expected_value): """ return self - def check_true(self, expr): + def check_neq(self, actual_value, expected_value): """ - Assert whether a boolean expression is true + Assert whether two values are not equal - :param expr: a boolean expression + :param actual_value: a value to check against expected + :param expected_value: expected value :returns: Inline object :raises: AssertionError """ return self - def check_false(self, expr): + def check_true(self, expr): """ - Assert whether a boolean expression is false + Assert whether a boolean expression is true :param expr: a boolean expression :returns: Inline object @@ -63,32 +64,31 @@ def check_false(self, expr): """ return self - def check_none(self, value): + def check_false(self, expr): """ - Assert whether an object is null + Assert whether a boolean expression is false - :param object: a value to check against + :param expr: a boolean expression :returns: Inline object :raises: AssertionError """ return self - def check_not_none(self, value): + def check_none(self, var): """ - Assert whether a value is not null + Assert whether a variable is None - :param value: a value to check against + :param var: a variable to check against :returns: Inline object :raises: AssertionError """ return self - def check_neq(self, actual_value, expected_value): + def check_not_none(self, var): """ - Assert whether two values are not equal + Assert whether a variable is not None - :param actual_value: a value to check against expected - :param expected_value: expected value + :param var: a variable to check against :returns: Inline object :raises: AssertionError """ From 73fe29f4a024cfe3449286e18f56836ad022b840 Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Tue, 15 Nov 2022 20:59:45 -0600 Subject: [PATCH 18/48] update API --- python/inline/inline.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/inline/inline.py b/python/inline/inline.py index 3931bde..019dce4 100644 --- a/python/inline/inline.py +++ b/python/inline/inline.py @@ -74,21 +74,21 @@ def check_false(self, expr): """ return self - def check_none(self, var): + def check_none(self, variable): """ Assert whether a variable is None - :param var: a variable to check against + :param variable: a variable to check against :returns: Inline object :raises: AssertionError """ return self - def check_not_none(self, var): + def check_not_none(self, variable): """ Assert whether a variable is not None - :param var: a variable to check against + :param variable: a variable to check against :returns: Inline object :raises: AssertionError """ From c0191a1ec9c1b6c4c16a22b5d3fc94737c590c56 Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Wed, 16 Nov 2022 11:51:14 -0600 Subject: [PATCH 19/48] configure tox --- python/.gitignore | 3 ++- python/tox.ini | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 python/tox.ini diff --git a/python/.gitignore b/python/.gitignore index 044df8c..f64cb16 100644 --- a/python/.gitignore +++ b/python/.gitignore @@ -1,3 +1,4 @@ /build /*.egg-info -/dist \ No newline at end of file +/dist +/.tox \ No newline at end of file diff --git a/python/tox.ini b/python/tox.ini new file mode 100644 index 0000000..3494950 --- /dev/null +++ b/python/tox.ini @@ -0,0 +1,14 @@ +[tox] +isolated_build = True +envlist = + py{37,38,39,310} + +[testenv] +commands = pytest -p pytester +deps = + pytest + pytest-cov + flake8 + black +setenv = + PYTHONDEVMODE=1 \ No newline at end of file From d54b68fff9529d951819f6715141954b43c852a8 Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Wed, 16 Nov 2022 11:57:10 -0600 Subject: [PATCH 20/48] add change log --- python/changelog | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 python/changelog diff --git a/python/changelog b/python/changelog new file mode 100644 index 0000000..73167c4 --- /dev/null +++ b/python/changelog @@ -0,0 +1,8 @@ +# Changelog + +## [Unreleased] +### Added + +- JUnit 5 features + +### Fixed From 3ce05e66258c4ea6bac74426fbedbf1cfcd40a4b Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Wed, 16 Nov 2022 12:00:13 -0600 Subject: [PATCH 21/48] update gitignore --- python/.gitignore | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/python/.gitignore b/python/.gitignore index f64cb16..4631397 100644 --- a/python/.gitignore +++ b/python/.gitignore @@ -1,4 +1,6 @@ -/build +build/ /*.egg-info -/dist -/.tox \ No newline at end of file +dist/ +.tox/ +.pytest_cache/ +__pycache__/ \ No newline at end of file From a3f5fe97cabcfc84ca3170645a5137f4f1cb9796 Mon Sep 17 00:00:00 2001 From: h-alan Date: Wed, 16 Nov 2022 21:58:43 -0500 Subject: [PATCH 22/48] Added 2 files with tests and sleeps --- python/tests/parallelization/b.py | 251 ++++++++++++++++++++++++++++++ python/tests/parallelization/c.py | 251 ++++++++++++++++++++++++++++++ 2 files changed, 502 insertions(+) create mode 100644 python/tests/parallelization/b.py create mode 100644 python/tests/parallelization/c.py diff --git a/python/tests/parallelization/b.py b/python/tests/parallelization/b.py new file mode 100644 index 0000000..a8704ff --- /dev/null +++ b/python/tests/parallelization/b.py @@ -0,0 +1,251 @@ +from inline import Here + +sleep = 10 +b = 0 +b = b + 1 +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +c = c + 2 +Here("2").given(b, 1).check_eq(b, 3).check_eq(time.sleep(sleep), None) +Here("2").given(b, 1).check_eq(b, 3).check_eq(time.sleep(sleep), None) +Here("2").given(b, 1).check_eq(b, 3).check_eq(time.sleep(sleep), None) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +b = b - 1 +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) \ No newline at end of file diff --git a/python/tests/parallelization/c.py b/python/tests/parallelization/c.py new file mode 100644 index 0000000..cee5f67 --- /dev/null +++ b/python/tests/parallelization/c.py @@ -0,0 +1,251 @@ +from inline import Here + +sleep = 5 +c = 0 +c = c + 1 +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +c = c + 2 +Here("2").given(c, 1).check_eq(c, 3).check_eq(time.sleep(sleep), None) +Here("2").given(c, 1).check_eq(c, 3).check_eq(time.sleep(sleep), None) +Here("2").given(c, 1).check_eq(c, 3).check_eq(time.sleep(sleep), None) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +c = c - 1 +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) \ No newline at end of file From d10cc2909aa37c1bb60f3379aab10943b91dcb5f Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Thu, 17 Nov 2022 14:09:50 -0600 Subject: [PATCH 23/48] add document --- python/README.rst | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/python/README.rst b/python/README.rst index 5817755..bb1aa6d 100644 --- a/python/README.rst +++ b/python/README.rst @@ -1,5 +1,44 @@ -=============== +============= pytest-inline -=============== +============= -pytest-inline is a plugin for `pytest `_ that writes inline tests. \ No newline at end of file +pytest-inline is a plugin for `pytest `_ that writes inline tests. + +API +--- +Declaration an inline test + +- Here(test_name, parameterized, repeated, tag, disabled, timeout): + declare an inline test: + #. test_name is a string that represents the name of the test. The default value is the file name + line number of the test statement. + #. parameterized is a boolean value that indicates whether the test is parameterized. The default value is false. + #. repeated is an integer that indicates how many times the test is repeated. The default value is 1. + #. tag is a string that represents the tag of the test. The default value is an empty string. + #. disabled is a boolean value that indicates whether the test is disabled. The default value is false. + #. timeout is an integer that represents the timeout of the test. The default value is -1. + + +Provide test inputs + +- given(variable, value): + assign the value to the variable. + + +Specify test oracles + +- check\_eq(actual\_value, expected\_value)}: + check if the actual value is equal to the expected value. +- check\_neq(actual\_value, expected\_value)}: + check if the actual value is not equal to the expected value. +- check\_true(expr)}: + check if the boolean expression is true. +- check\_false(expr)}: + check if the boolean expression is false. +- check\_none(variable)}: + check if the variable is none. +- check\_not\_none(variable)}: + check if the variable is not none. +- check\_same(actual\_value, expected\_value)}: + check if the actual value and the expected value refer to the same object. +- check\_not\_same(actual\_value, expected\_value)}: + check if the actual value and the expected value refer to different objects. From 38616affcc912843c49ae6095dc56003a613521b Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Thu, 17 Nov 2022 14:12:53 -0600 Subject: [PATCH 24/48] update API --- python/README.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/python/README.rst b/python/README.rst index bb1aa6d..6a532ce 100644 --- a/python/README.rst +++ b/python/README.rst @@ -10,12 +10,12 @@ Declaration an inline test - Here(test_name, parameterized, repeated, tag, disabled, timeout): declare an inline test: - #. test_name is a string that represents the name of the test. The default value is the file name + line number of the test statement. - #. parameterized is a boolean value that indicates whether the test is parameterized. The default value is false. - #. repeated is an integer that indicates how many times the test is repeated. The default value is 1. - #. tag is a string that represents the tag of the test. The default value is an empty string. - #. disabled is a boolean value that indicates whether the test is disabled. The default value is false. - #. timeout is an integer that represents the timeout of the test. The default value is -1. + 1. test_name is a string that represents the name of the test. The default value is the file name + line number of the test statement. + 2. parameterized is a boolean value that indicates whether the test is parameterized. The default value is false. + 3. repeated is an integer that indicates how many times the test is repeated. The default value is 1. + 4. tag is a string that represents the tag of the test. The default value is an empty string. + 5. disabled is a boolean value that indicates whether the test is disabled. The default value is false. + 6. timeout is an integer that represents the timeout of the test. The default value is -1. Provide test inputs From 4b8ead380dea4136f195ce9e139484aec37b5fb9 Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Thu, 17 Nov 2022 14:13:42 -0600 Subject: [PATCH 25/48] update format --- python/README.rst | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/python/README.rst b/python/README.rst index 6a532ce..e134b20 100644 --- a/python/README.rst +++ b/python/README.rst @@ -9,13 +9,12 @@ API Declaration an inline test - Here(test_name, parameterized, repeated, tag, disabled, timeout): - declare an inline test: - 1. test_name is a string that represents the name of the test. The default value is the file name + line number of the test statement. - 2. parameterized is a boolean value that indicates whether the test is parameterized. The default value is false. - 3. repeated is an integer that indicates how many times the test is repeated. The default value is 1. - 4. tag is a string that represents the tag of the test. The default value is an empty string. - 5. disabled is a boolean value that indicates whether the test is disabled. The default value is false. - 6. timeout is an integer that represents the timeout of the test. The default value is -1. + 1. test_name is a string that represents the name of the test. The default value is the file name + line number of the test statement. + 2. parameterized is a boolean value that indicates whether the test is parameterized. The default value is false. + 3. repeated is an integer that indicates how many times the test is repeated. The default value is 1. + 4. tag is a string that represents the tag of the test. The default value is an empty string. + 5. disabled is a boolean value that indicates whether the test is disabled. The default value is false. + 6. timeout is an integer that represents the timeout of the test. The default value is -1. Provide test inputs From e9187a104ce588c26bad66af799bec8eb782e6bf Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Thu, 17 Nov 2022 14:30:14 -0600 Subject: [PATCH 26/48] update format --- python/README.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/python/README.rst b/python/README.rst index e134b20..568b10c 100644 --- a/python/README.rst +++ b/python/README.rst @@ -25,19 +25,19 @@ Provide test inputs Specify test oracles -- check\_eq(actual\_value, expected\_value)}: +- check\_eq(actual\_value, expected\_value): check if the actual value is equal to the expected value. -- check\_neq(actual\_value, expected\_value)}: +- check\_neq(actual\_value, expected\_value): check if the actual value is not equal to the expected value. -- check\_true(expr)}: +- check\_true(expr): check if the boolean expression is true. -- check\_false(expr)}: +- check\_false(expr): check if the boolean expression is false. -- check\_none(variable)}: +- check\_none(variable): check if the variable is none. -- check\_not\_none(variable)}: +- check\_not\_none(variable): check if the variable is not none. -- check\_same(actual\_value, expected\_value)}: +- check\_same(actual\_value, expected\_value): check if the actual value and the expected value refer to the same object. -- check\_not\_same(actual\_value, expected\_value)}: +- check\_not\_same(actual\_value, expected\_value): check if the actual value and the expected value refer to different objects. From 002606628af7a86bfb355feb6951c37c3ea43708 Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Thu, 17 Nov 2022 15:42:14 -0500 Subject: [PATCH 27/48] Updated to support assumptions --- python/inline/conftest.py | 102 +++++++++++++++++++++++++++++++++- python/inline/inline.py | 16 ++++++ python/tests/test_conftest.py | 96 +++++++++++++++++++++++++++++++- 3 files changed, 211 insertions(+), 3 deletions(-) diff --git a/python/inline/conftest.py b/python/inline/conftest.py index bb60216..303cd44 100644 --- a/python/inline/conftest.py +++ b/python/inline/conftest.py @@ -258,6 +258,8 @@ class ExtractInlineTest(ast.NodeTransformer): arg_tag_str = "tag" arg_disabled_str = "disabled" arg_timeout_str = "timeout" + assume_true_str = "assume_true" + assume_false_str = "assume_false" inline_module_imported = False def __init__(self): @@ -614,6 +616,84 @@ def parse_given(self, node): else: raise MalformedException("inline test: invalid given(), expected 2 args") + def build_assume_true(self, test_node): + assert_node = ast.Assert( + test=test_node, + msg=ast.Call( + func=ast.Attribute( + ast.Constant( + "Assumption that bool({0}) is True\nActual: bool({0}) is False\n" + ), + "format", + ast.Load(), + ), + args=[ + ast.Constant(self.node_to_source_code(test_node)), + test_node, + ], + keywords=[], + ), + ) + return assert_node + + def parse_assume_true(self, node): + if len(node.args) == 1: + if self.cur_inline_test.parameterized: + self.parameterized_inline_tests_init(node.args[0]) + for index, value in enumerate(node.args[0].elts): + test_node = self.parse_group(value) + assert_node = self.build_assume_true(test_node) + self.cur_inline_test.parameterized_inline_tests[ + index + ].check_stmts.append(assert_node) + else: + test_node = self.parse_group(node.args[0]) + assert_node = self.build_assume_true(test_node) + self.cur_inline_test.check_stmts.append(assert_node) + else: + raise MalformedException( + "inline test: invalid assume_true(), expected 1 arg" + ) + + def build_assume_false(self, test_node): + assert_node = ast.Assert( + test=ast.UnaryOp(op=ast.Not(), operand=test_node), + msg=ast.Call( + func=ast.Attribute( + ast.Constant( + "Assumption that bool({0}) is False\nActual: bool({0}) is True\n" + ), + "format", + ast.Load(), + ), + args=[ + ast.Constant(self.node_to_source_code(test_node)), + test_node, + ], + keywords=[], + ), + ) + return assert_node + + def parse_assume_false(self, node): + if len(node.args) == 1: + if self.cur_inline_test.parameterized: + self.parameterized_inline_tests_init(node.args[0]) + for index, value in enumerate(node.args[0].elts): + test_node = self.parse_group(value) + assert_node = self.build_assume_false(test_node) + self.cur_inline_test.parameterized_inline_tests[ + index + ].check_stmts.append(assert_node) + else: + test_node = self.parse_group(node.args[0]) + assert_node = self.build_assume_false(test_node) + self.cur_inline_test.check_stmts.append(assert_node) + else: + raise MalformedException( + "inline test: invalid assume_false(), expected 1 arg" + ) + def build_assert_eq(self, left_node, comparator_node): equal_node = ast.Compare( left=left_node, @@ -963,7 +1043,7 @@ def parse_fail(self, node): if len(node.args) == 0: self.build_fail() else: - raise MalformedException("inline test: invalid check_instance_of(), expected 2 args") + raise MalformedException("inline test: fail() does not expect any arguments") def parse_group(self, node): if ( @@ -1028,9 +1108,27 @@ def parse_inline_test(self, node): else: raise MalformedException("inline test: invalid inline test constructor") - # "given(a, 1)" + # "assume_true(...) or assume_false(...) inline_test_call_index = 1 for call in inline_test_calls[1:]: + if ( + isinstance(call.func, ast.Attribute) + and call.func.attr == self.assume_true_str + ): + self.parse_assume_true(call) + inline_test_call_index += 1 + elif ( + isinstance(call.func, ast.Attribute) + and call.func.attr == self.assume_false_str + ): + self.parse_assume_false(call) + inline_test_call_index += 1 + else: + break + + + # "given(a, 1)" + for call in inline_test_calls[inline_test_call_index:]: if ( isinstance(call.func, ast.Attribute) and call.func.attr == self.given_str diff --git a/python/inline/inline.py b/python/inline/inline.py index 019dce4..2d7d6a8 100644 --- a/python/inline/inline.py +++ b/python/inline/inline.py @@ -123,6 +123,22 @@ def fail(self): :returns: Inline object :raises: AssertionError """ + + def assume_true(self, condition:bool): + """ + Executes the test under the assuming the given condition is true + + :param condition: a boolean condition + :raises: AssertionError + """ + + def assume_false(self, condition:bool): + """ + Executes the test under the assuming the given condition is true + + :param condition: a boolean condition + :raises: AssertionError + """ class Group: diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index 594ffdd..7315d46 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -614,4 +614,98 @@ def m(a): for x in (pytester.path, checkfile): items, reprec = pytester.inline_genitems(x) assert len(items) == 0 - res = pytester.runpytest() \ No newline at end of file + + def test_assume_true_fail(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): + a = 3 + Here().assume_true(a == 4).given(a, 1).check_not_none(a) + """ + ) + for x in (pytester.path, checkfile): + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 1 #Failure + + def test_assume_true(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): + a = 3 + Here().assume_true(a == 3).given(a, 1).check_not_none(a) + """ + ) + for x in (pytester.path, checkfile): + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 0 + + def test_assume_true_false_combo(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): + b = 4 + Here().assume_true(b < 5).assume_false(b > 6).given(a, 1).check_not_none(a) + """ + ) + for x in (pytester.path, checkfile): + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 0 + + def test_assume_false_fail(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): + b = 4 + Here().assume_false(b == 4).given(a, 1).check_not_none(a) + """ + ) + for x in (pytester.path, checkfile): + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 1 + + def test_assume_false(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def m(a): + b = 4 + Here().assume_false(b == 3).given(a, 1).check_not_none(a) + """ + ) + for x in (pytester.path, checkfile): + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 0 + + def test_assume_incorrect_with_timeout(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + import time + def m(a): + a = -3 + Here(timeout=5.75).assume_true(a > 0).given(a, loop(3)).check_eq(a,1) + + def loop(b): + while True: + b = b + 1 + """ + ) + for x in (pytester.path, checkfile): + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 1 \ No newline at end of file From 3f472828b800e93b3df37c55a217f3fdbd3cbded Mon Sep 17 00:00:00 2001 From: h-alan Date: Thu, 17 Nov 2022 16:16:01 -0500 Subject: [PATCH 28/48] Added time imports and variable changes --- python/tests/parallelization/b.py | 3 ++- python/tests/parallelization/c.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/python/tests/parallelization/b.py b/python/tests/parallelization/b.py index a8704ff..9db8d14 100644 --- a/python/tests/parallelization/b.py +++ b/python/tests/parallelization/b.py @@ -1,4 +1,5 @@ from inline import Here +import time sleep = 10 b = 0 @@ -82,7 +83,7 @@ Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -c = c + 2 +b = b + 2 Here("2").given(b, 1).check_eq(b, 3).check_eq(time.sleep(sleep), None) Here("2").given(b, 1).check_eq(b, 3).check_eq(time.sleep(sleep), None) Here("2").given(b, 1).check_eq(b, 3).check_eq(time.sleep(sleep), None) diff --git a/python/tests/parallelization/c.py b/python/tests/parallelization/c.py index cee5f67..12ea322 100644 --- a/python/tests/parallelization/c.py +++ b/python/tests/parallelization/c.py @@ -1,4 +1,5 @@ from inline import Here +import time sleep = 5 c = 0 From 8caebf66dabae3db5bdd7209d7ec3f797fc9c2d4 Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Fri, 18 Nov 2022 12:33:35 -0500 Subject: [PATCH 29/48] Added assumptions, and tested relevant feature additions --- python/inline/conftest.py | 27 +++++++++++++++++++-------- python/tests/test_conftest.py | 22 ++++++++++++++++++++++ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/python/inline/conftest.py b/python/inline/conftest.py index 303cd44..94400bf 100644 --- a/python/inline/conftest.py +++ b/python/inline/conftest.py @@ -133,6 +133,7 @@ class InlineTest: ] def __init__(self): + self.assume_stmts = [] self.check_stmts = [] self.given_stmts = [] self.previous_stmts = [] @@ -154,6 +155,7 @@ def to_test(self): if self.prev_stmt_type == PrevStmtType.CondExpr: return "\n".join( self.import_libraries + + [ExtractInlineTest.node_to_source_code(n) for n in self.assume_stmts] + [ExtractInlineTest.node_to_source_code(n) for n in self.given_stmts] + [ExtractInlineTest.node_to_source_code(n) for n in self.check_stmts] ) @@ -161,12 +163,16 @@ def to_test(self): return "\n".join( self.import_libraries + [ExtractInlineTest.node_to_source_code(n) for n in self.given_stmts] - + [ - ExtractInlineTest.node_to_source_code(n) - for n in self.previous_stmts - ] + + [ExtractInlineTest.node_to_source_code(n) for n in self.previous_stmts] + [ExtractInlineTest.node_to_source_code(n) for n in self.check_stmts] ) + + def to_test_assumptions(self): + return "\n".join( + self.import_libraries + + [ExtractInlineTest.node_to_source_code(n) for n in self.previous_stmts] + + [ExtractInlineTest.node_to_source_code(n) for n in self.assume_stmts] + ) def __repr__(self): if self.test_name: @@ -180,6 +186,7 @@ def is_empty(self) -> bool: def __eq__(self, other): return ( self.import_libraries == other.import_libraries + and self.assume_stmts == other.assume_stmts and self.given_stmts == other.given_stmts and self.previous_stmts == other.previous_stmts and self.check_stmts == other.check_stmts @@ -645,11 +652,11 @@ def parse_assume_true(self, node): assert_node = self.build_assume_true(test_node) self.cur_inline_test.parameterized_inline_tests[ index - ].check_stmts.append(assert_node) + ].assume_stmts.append(assert_node) else: test_node = self.parse_group(node.args[0]) assert_node = self.build_assume_true(test_node) - self.cur_inline_test.check_stmts.append(assert_node) + self.cur_inline_test.assume_stmts.append(assert_node) else: raise MalformedException( "inline test: invalid assume_true(), expected 1 arg" @@ -684,11 +691,11 @@ def parse_assume_false(self, node): assert_node = self.build_assume_false(test_node) self.cur_inline_test.parameterized_inline_tests[ index - ].check_stmts.append(assert_node) + ].assume_stmts.append(assert_node) else: test_node = self.parse_group(node.args[0]) assert_node = self.build_assume_false(test_node) - self.cur_inline_test.check_stmts.append(assert_node) + self.cur_inline_test.assume_stmts.append(assert_node) else: raise MalformedException( "inline test: invalid assume_false(), expected 1 arg" @@ -1313,6 +1320,10 @@ def _find(self, tests, obj, module, globs, seen): ###################################################################### class InlineTestRunner: def run(self, test: InlineTest, out: List) -> None: + if(test.assume_stmts != []): + assumptions = ast.parse(test.to_test_assumptions()) + assumptionscodeobj = compile(assumptions, filename="", mode="exec") + exec(assumptionscodeobj, test.globs) tree = ast.parse(test.to_test()) codeobj = compile(tree, filename="", mode="exec") start_time = time.time() diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index 7315d46..e21a23d 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -708,4 +708,26 @@ def loop(b): items, reprec = pytester.inline_genitems(x) assert len(items) == 1 res = pytester.runpytest() + #Should throw an AssertError + assert res.ret == 1 + + def test_assume_correct_with_timeout(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + import time + def m(a): + a = -3 + Here(timeout=5.75).assume_true(a < 0).given(a, loop(3)).check_eq(a,1) + + def loop(b): + while True: + b = b + 1 + """ + ) + for x in (pytester.path, checkfile): + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + #Should timeout instead of throwing AssertError assert res.ret == 1 \ No newline at end of file From f1df70565c0f08cc0027af143eb7100c4c8731fe Mon Sep 17 00:00:00 2001 From: h-alan Date: Fri, 18 Nov 2022 16:22:51 -0500 Subject: [PATCH 30/48] Changed bash script to run multiple files --- python/tests/parallelization/time-parallel-tests.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/python/tests/parallelization/time-parallel-tests.sh b/python/tests/parallelization/time-parallel-tests.sh index 37dc1e1..a5054b1 100644 --- a/python/tests/parallelization/time-parallel-tests.sh +++ b/python/tests/parallelization/time-parallel-tests.sh @@ -1,25 +1,24 @@ #!/bin/bash if [ "$#" -ne 1 ]; then - echo "Script needs 1 arguments: python file" - echo "Example: bash parallel_tests.sh a.py" + echo "Script needs 1 arguments: python file dir" + echo "Example: bash parallel_tests.sh ." else script_dir=$( cd $( dirname $0 ) && pwd ) logs_dir="$script_dir/logs" - test_file="$script_dir/${1}" mkdir -p $logs_dir pip uninstall -y pytest-xdist echo "Running non-parallel..." - ( time pytest $test_file ) &> "$logs_dir/non-parallel" + ( time pytest $1 ) &> "$logs_dir/non-parallel" echo "Finished non-parallel" pip install pytest-xdist echo "Running parallel..." - ( time pytest -n auto $test_file ) &> "$logs_dir/parallel" + ( time pytest -n auto $1 ) &> "$logs_dir/parallel" echo "Finished parallel" echo "Logs in: $logs_dir" From 93cbea2c45a06f40a113b3e9f8a730e7cdaf3e26 Mon Sep 17 00:00:00 2001 From: h-alan Date: Fri, 18 Nov 2022 18:01:27 -0500 Subject: [PATCH 31/48] Added parallel testing to workflow - Create 7 more python files for testing --- .github/workflows/python-package.yml | 4 ++++ python/tests/parallelization/test_files/a.py | 15 +++++++++++++++ python/tests/parallelization/test_files/b.py | 17 +++++++++++++++++ python/tests/parallelization/test_files/c.py | 17 +++++++++++++++++ python/tests/parallelization/test_files/d.py | 17 +++++++++++++++++ python/tests/parallelization/test_files/e.py | 17 +++++++++++++++++ python/tests/parallelization/test_files/f.py | 17 +++++++++++++++++ python/tests/parallelization/test_files/g.py | 17 +++++++++++++++++ python/tests/parallelization/test_files/h.py | 17 +++++++++++++++++ python/tests/parallelization/test_files/i.py | 17 +++++++++++++++++ python/tests/parallelization/test_files/j.py | 17 +++++++++++++++++ .../parallelization/time-parallel-tests.sh | 2 +- 12 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 python/tests/parallelization/test_files/a.py create mode 100644 python/tests/parallelization/test_files/b.py create mode 100644 python/tests/parallelization/test_files/c.py create mode 100644 python/tests/parallelization/test_files/d.py create mode 100644 python/tests/parallelization/test_files/e.py create mode 100644 python/tests/parallelization/test_files/f.py create mode 100644 python/tests/parallelization/test_files/g.py create mode 100644 python/tests/parallelization/test_files/h.py create mode 100644 python/tests/parallelization/test_files/i.py create mode 100644 python/tests/parallelization/test_files/j.py diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 32795f6..e101a5b 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -26,5 +26,9 @@ jobs: run: | cd python pytest -p pytester --cov-report=term-missing + - name: Test parallel execution + run: | + cd python/tests/parallelization + bash time-parallel-tests.sh . - name: Publish Unit Test Results uses: EnricoMi/publish-unit-test-result-action@v2.0.0-beta.2 diff --git a/python/tests/parallelization/test_files/a.py b/python/tests/parallelization/test_files/a.py new file mode 100644 index 0000000..1aeac47 --- /dev/null +++ b/python/tests/parallelization/test_files/a.py @@ -0,0 +1,15 @@ +from inline import Here + +a = 0 +a = a + 1 +Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) +Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) +Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) +a = a + 2 +Here("2").given(a, 1).check_eq(a, 3) +Here("2").given(a, 1).check_eq(a, 3) +Here("2").given(a, 1).check_eq(a, 3) +a = a - 1 +Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) +Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) +Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) diff --git a/python/tests/parallelization/test_files/b.py b/python/tests/parallelization/test_files/b.py new file mode 100644 index 0000000..f946c9f --- /dev/null +++ b/python/tests/parallelization/test_files/b.py @@ -0,0 +1,17 @@ +from inline import Here +import time + +sleep = 1 +b = 0 +b = b + 1 +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) +b = b + 2 +Here("2").given(b, 1).check_eq(b, 3).check_eq(time.sleep(sleep), None) +Here("2").given(b, 1).check_eq(b, 3) +Here("2").given(b, 1).check_eq(b, 3) +b = b - 1 +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) +Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) \ No newline at end of file diff --git a/python/tests/parallelization/test_files/c.py b/python/tests/parallelization/test_files/c.py new file mode 100644 index 0000000..d00d7b6 --- /dev/null +++ b/python/tests/parallelization/test_files/c.py @@ -0,0 +1,17 @@ +from inline import Here +import time + +sleep = 2 +c = 0 +c = c + 1 +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) +c = c + 2 +Here("2").given(c, 1).check_eq(c, 3).check_eq(time.sleep(sleep), None) +Here("2").given(c, 1).check_eq(c, 3) +Here("2").given(c, 1).check_eq(c, 3) +c = c - 1 +Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(c, 1) +Here("3", tag = ["minus"]).given(c, 1) \ No newline at end of file diff --git a/python/tests/parallelization/test_files/d.py b/python/tests/parallelization/test_files/d.py new file mode 100644 index 0000000..5c44eef --- /dev/null +++ b/python/tests/parallelization/test_files/d.py @@ -0,0 +1,17 @@ +from inline import Here +import time + +sleep = 3 +d = 0 +d = d + 1 +Here("1", tag = ["add"]).given(d, 1).check_eq(d, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(d, 1).check_eq(d, 2) +Here("1", tag = ["add"]).given(d, 1).check_eq(d, 2) +d = d + 2 +Here("2").given(d, 1).check_eq(d, 3).check_eq(time.sleep(sleep), None) +Here("2").given(d, 1).check_eq(d, 3) +Here("2").given(d, 1).check_eq(d, 3) +d = d - 1 +Here("3", tag = ["minus"]).given(d, 1).check_eq(d, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(d, 1).check_eq(d, 0) +Here("3", tag = ["minus"]).given(d, 1).check_eq(d, 0) \ No newline at end of file diff --git a/python/tests/parallelization/test_files/e.py b/python/tests/parallelization/test_files/e.py new file mode 100644 index 0000000..753ea69 --- /dev/null +++ b/python/tests/parallelization/test_files/e.py @@ -0,0 +1,17 @@ +from inline import Here +import time + +sleep = 1 +e = 0 +e = e + 1 +Here("1", tag = ["add"]).given(e, 1).check_eq(e, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(e, 1).check_eq(e, 2) +Here("1", tag = ["add"]).given(e, 1).check_eq(e, 2) +e = e + 2 +Here("2").given(e, 1).check_eq(e, 3).check_eq(time.sleep(sleep), None) +Here("2").given(e, 1).check_eq(e, 3) +Here("2").given(e, 1).check_eq(e, 3) +e = e - 1 +Here("3", tag = ["minus"]).given(e, 1).check_eq(e, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(e, 1).check_eq(e, 0) +Here("3", tag = ["minus"]).given(e, 1).check_eq(e, 0) \ No newline at end of file diff --git a/python/tests/parallelization/test_files/f.py b/python/tests/parallelization/test_files/f.py new file mode 100644 index 0000000..2e4c026 --- /dev/null +++ b/python/tests/parallelization/test_files/f.py @@ -0,0 +1,17 @@ +from inline import Here +import time + +sleep = 2 +f = 0 +f = f + 1 +Here("1", tag = ["add"]).given(f, 1).check_eq(f, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(f, 1).check_eq(f, 2) +Here("1", tag = ["add"]).given(f, 1).check_eq(f, 2) +f = f + 2 +Here("2").given(f, 1).check_eq(f, 3).check_eq(time.sleep(sleep), None) +Here("2").given(f, 1).check_eq(f, 3) +Here("2").given(f, 1).check_eq(f, 3) +f = f - 1 +Here("3", tag = ["minus"]).given(f, 1).check_eq(f, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(f, 1).check_eq(f, 0) +Here("3", tag = ["minus"]).given(f, 1).check_eq(f, 0) \ No newline at end of file diff --git a/python/tests/parallelization/test_files/g.py b/python/tests/parallelization/test_files/g.py new file mode 100644 index 0000000..4e30076 --- /dev/null +++ b/python/tests/parallelization/test_files/g.py @@ -0,0 +1,17 @@ +from inline import Here +import time + +sleep = 3 +g = 0 +g = g + 1 +Here("1", tag = ["add"]).given(g, 1).check_eq(g, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(g, 1).check_eq(g, 2) +Here("1", tag = ["add"]).given(g, 1).check_eq(g, 2) +g = g + 2 +Here("2").given(g, 1).check_eq(g, 3).check_eq(time.sleep(sleep), None) +Here("2").given(g, 1).check_eq(g, 3) +Here("2").given(g, 1).check_eq(g, 3) +g = g - 1 +Here("3", tag = ["minus"]).given(g, 1).check_eq(g, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(g, 1).check_eq(g, 0) +Here("3", tag = ["minus"]).given(g, 1).check_eq(g, 0) \ No newline at end of file diff --git a/python/tests/parallelization/test_files/h.py b/python/tests/parallelization/test_files/h.py new file mode 100644 index 0000000..04eac26 --- /dev/null +++ b/python/tests/parallelization/test_files/h.py @@ -0,0 +1,17 @@ +from inline import Here +import time + +sleep = 1 +h = 0 +h = h + 1 +Here("1", tag = ["add"]).given(h, 1).check_eq(h, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(h, 1).check_eq(h, 2) +Here("1", tag = ["add"]).given(h, 1).check_eq(h, 2) +h = h + 2 +Here("2").given(h, 1).check_eq(h, 3).check_eq(time.sleep(sleep), None) +Here("2").given(h, 1).check_eq(h, 3) +Here("2").given(h, 1).check_eq(h, 3) +h = h - 1 +Here("3", tag = ["minus"]).given(h, 1).check_eq(h, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(h, 1).check_eq(h, 0) +Here("3", tag = ["minus"]).given(h, 1).check_eq(h, 0) \ No newline at end of file diff --git a/python/tests/parallelization/test_files/i.py b/python/tests/parallelization/test_files/i.py new file mode 100644 index 0000000..215778a --- /dev/null +++ b/python/tests/parallelization/test_files/i.py @@ -0,0 +1,17 @@ +from inline import Here +import time + +sleep = 2 +i = 0 +i = i + 1 +Here("1", tag = ["add"]).given(i, 1).check_eq(i, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(i, 1).check_eq(i, 2) +Here("1", tag = ["add"]).given(i, 1).check_eq(i, 2) +i = i + 2 +Here("2").given(i, 1).check_eq(i, 3).check_eq(time.sleep(sleep), None) +Here("2").given(i, 1).check_eq(i, 3) +Here("2").given(i, 1).check_eq(i, 3) +i = i - 1 +Here("3", tag = ["minus"]).given(i, 1).check_eq(i, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(i, 1).check_eq(i, 0) +Here("3", tag = ["minus"]).given(i, 1).check_eq(i, 0) \ No newline at end of file diff --git a/python/tests/parallelization/test_files/j.py b/python/tests/parallelization/test_files/j.py new file mode 100644 index 0000000..20689ea --- /dev/null +++ b/python/tests/parallelization/test_files/j.py @@ -0,0 +1,17 @@ +from inline import Here +import time + +sleep = 3 +j = 0 +j = j + 1 +Here("1", tag = ["add"]).given(j, 1).check_eq(j, 2).check_eq(time.sleep(sleep), None) +Here("1", tag = ["add"]).given(j, 1).check_eq(j, 2) +Here("1", tag = ["add"]).given(j, 1).check_eq(j, 2) +j = j + 2 +Here("2").given(j, 1).check_eq(j, 3).check_eq(time.sleep(sleep), None) +Here("2").given(j, 1).check_eq(j, 3) +Here("2").given(j, 1).check_eq(j, 3) +j = j - 1 +Here("3", tag = ["minus"]).given(j, 1).check_eq(j, 0).check_eq(time.sleep(sleep), None) +Here("3", tag = ["minus"]).given(j, 1).check_eq(j, 0) +Here("3", tag = ["minus"]).given(j, 1).check_eq(j, 0) \ No newline at end of file diff --git a/python/tests/parallelization/time-parallel-tests.sh b/python/tests/parallelization/time-parallel-tests.sh index a5054b1..e112069 100644 --- a/python/tests/parallelization/time-parallel-tests.sh +++ b/python/tests/parallelization/time-parallel-tests.sh @@ -2,7 +2,7 @@ if [ "$#" -ne 1 ]; then echo "Script needs 1 arguments: python file dir" - echo "Example: bash parallel_tests.sh ." + echo "Example: bash parallel_tests.sh ./test_files" else script_dir=$( cd $( dirname $0 ) && pwd ) logs_dir="$script_dir/logs" From dbd7b3f8e79a8688d33b74781b19c335120f9aa4 Mon Sep 17 00:00:00 2001 From: h-alan Date: Fri, 18 Nov 2022 18:03:53 -0500 Subject: [PATCH 32/48] Moved python files to be more organized --- python/tests/parallelization/a.py | 250 ----------------------------- python/tests/parallelization/b.py | 252 ------------------------------ python/tests/parallelization/c.py | 252 ------------------------------ 3 files changed, 754 deletions(-) delete mode 100644 python/tests/parallelization/a.py delete mode 100644 python/tests/parallelization/b.py delete mode 100644 python/tests/parallelization/c.py diff --git a/python/tests/parallelization/a.py b/python/tests/parallelization/a.py deleted file mode 100644 index 74926a0..0000000 --- a/python/tests/parallelization/a.py +++ /dev/null @@ -1,250 +0,0 @@ -from inline import Here - -a = 0 -a = a + 1 -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -Here("1", tag = ["add"]).given(a, 1).check_eq(a, 2) -a = a + 2 -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -Here("2").given(a, 1).check_eq(a, 3) -a = a - 1 -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) -Here("3", tag = ["minus"]).given(a, 1).check_eq(a, 0) diff --git a/python/tests/parallelization/b.py b/python/tests/parallelization/b.py deleted file mode 100644 index 9db8d14..0000000 --- a/python/tests/parallelization/b.py +++ /dev/null @@ -1,252 +0,0 @@ -from inline import Here -import time - -sleep = 10 -b = 0 -b = b + 1 -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2).check_eq(time.sleep(sleep), None) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2).check_eq(time.sleep(sleep), None) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2).check_eq(time.sleep(sleep), None) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -Here("1", tag = ["add"]).given(b, 1).check_eq(b, 2) -b = b + 2 -Here("2").given(b, 1).check_eq(b, 3).check_eq(time.sleep(sleep), None) -Here("2").given(b, 1).check_eq(b, 3).check_eq(time.sleep(sleep), None) -Here("2").given(b, 1).check_eq(b, 3).check_eq(time.sleep(sleep), None) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -Here("2").given(b, 1).check_eq(b, 3) -b = b - 1 -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0).check_eq(time.sleep(sleep), None) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0).check_eq(time.sleep(sleep), None) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0).check_eq(time.sleep(sleep), None) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) -Here("3", tag = ["minus"]).given(b, 1).check_eq(b, 0) \ No newline at end of file diff --git a/python/tests/parallelization/c.py b/python/tests/parallelization/c.py deleted file mode 100644 index 12ea322..0000000 --- a/python/tests/parallelization/c.py +++ /dev/null @@ -1,252 +0,0 @@ -from inline import Here -import time - -sleep = 5 -c = 0 -c = c + 1 -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2).check_eq(time.sleep(sleep), None) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2).check_eq(time.sleep(sleep), None) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2).check_eq(time.sleep(sleep), None) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -Here("1", tag = ["add"]).given(c, 1).check_eq(c, 2) -c = c + 2 -Here("2").given(c, 1).check_eq(c, 3).check_eq(time.sleep(sleep), None) -Here("2").given(c, 1).check_eq(c, 3).check_eq(time.sleep(sleep), None) -Here("2").given(c, 1).check_eq(c, 3).check_eq(time.sleep(sleep), None) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -Here("2").given(c, 1).check_eq(c, 3) -c = c - 1 -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0).check_eq(time.sleep(sleep), None) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0).check_eq(time.sleep(sleep), None) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0).check_eq(time.sleep(sleep), None) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) -Here("3", tag = ["minus"]).given(c, 1).check_eq(c, 0) \ No newline at end of file From 1ccb2640a541d4e64f6139aa2811fc8bcd14e52e Mon Sep 17 00:00:00 2001 From: h-alan Date: Sat, 19 Nov 2022 23:19:56 -0500 Subject: [PATCH 33/48] Added command line output for times --- python/tests/parallelization/time-parallel-tests.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/tests/parallelization/time-parallel-tests.sh b/python/tests/parallelization/time-parallel-tests.sh index e112069..c7a6c02 100644 --- a/python/tests/parallelization/time-parallel-tests.sh +++ b/python/tests/parallelization/time-parallel-tests.sh @@ -12,13 +12,13 @@ else pip uninstall -y pytest-xdist echo "Running non-parallel..." - ( time pytest $1 ) &> "$logs_dir/non-parallel" + ( time pytest $1 ) >> "$logs_dir/non-parallel" echo "Finished non-parallel" pip install pytest-xdist echo "Running parallel..." - ( time pytest -n auto $1 ) &> "$logs_dir/parallel" + ( time pytest -n auto $1 ) >> "$logs_dir/parallel" echo "Finished parallel" echo "Logs in: $logs_dir" From eec41a0a21516f1d77381488a61ff8821adade17 Mon Sep 17 00:00:00 2001 From: h-alan Date: Sat, 19 Nov 2022 23:29:16 -0500 Subject: [PATCH 34/48] Reduce sleep time to lower total execution time --- python/tests/parallelization/test_files/d.py | 2 +- python/tests/parallelization/test_files/e.py | 2 +- python/tests/parallelization/test_files/f.py | 2 +- python/tests/parallelization/test_files/g.py | 2 +- python/tests/parallelization/test_files/j.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/python/tests/parallelization/test_files/d.py b/python/tests/parallelization/test_files/d.py index 5c44eef..701c8cd 100644 --- a/python/tests/parallelization/test_files/d.py +++ b/python/tests/parallelization/test_files/d.py @@ -1,7 +1,7 @@ from inline import Here import time -sleep = 3 +sleep = 1 d = 0 d = d + 1 Here("1", tag = ["add"]).given(d, 1).check_eq(d, 2).check_eq(time.sleep(sleep), None) diff --git a/python/tests/parallelization/test_files/e.py b/python/tests/parallelization/test_files/e.py index 753ea69..9e2467c 100644 --- a/python/tests/parallelization/test_files/e.py +++ b/python/tests/parallelization/test_files/e.py @@ -1,7 +1,7 @@ from inline import Here import time -sleep = 1 +sleep = 2 e = 0 e = e + 1 Here("1", tag = ["add"]).given(e, 1).check_eq(e, 2).check_eq(time.sleep(sleep), None) diff --git a/python/tests/parallelization/test_files/f.py b/python/tests/parallelization/test_files/f.py index 2e4c026..e560773 100644 --- a/python/tests/parallelization/test_files/f.py +++ b/python/tests/parallelization/test_files/f.py @@ -1,7 +1,7 @@ from inline import Here import time -sleep = 2 +sleep = 1 f = 0 f = f + 1 Here("1", tag = ["add"]).given(f, 1).check_eq(f, 2).check_eq(time.sleep(sleep), None) diff --git a/python/tests/parallelization/test_files/g.py b/python/tests/parallelization/test_files/g.py index 4e30076..883beb2 100644 --- a/python/tests/parallelization/test_files/g.py +++ b/python/tests/parallelization/test_files/g.py @@ -1,7 +1,7 @@ from inline import Here import time -sleep = 3 +sleep = 2 g = 0 g = g + 1 Here("1", tag = ["add"]).given(g, 1).check_eq(g, 2).check_eq(time.sleep(sleep), None) diff --git a/python/tests/parallelization/test_files/j.py b/python/tests/parallelization/test_files/j.py index 20689ea..ad99959 100644 --- a/python/tests/parallelization/test_files/j.py +++ b/python/tests/parallelization/test_files/j.py @@ -1,7 +1,7 @@ from inline import Here import time -sleep = 3 +sleep = 1 j = 0 j = j + 1 Here("1", tag = ["add"]).given(j, 1).check_eq(j, 2).check_eq(time.sleep(sleep), None) From 3a7fa7f13b878a900d27550972d4501e6f253da6 Mon Sep 17 00:00:00 2001 From: Yu Liu Date: Sun, 20 Nov 2022 17:58:00 -0600 Subject: [PATCH 35/48] Update README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5ff56eb..9158452 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,14 @@ I-Test is a framework for writing inline tests in Python and Java. +## Installation and usage + +Use `pip install pytest-inline` to install our Python pytest-plugin + +Use `pytest .` to run all inline tests in working directory + +Use `pytest {filename}` to run all inline tests in a Python file + ## Introduction This repo contains the code and data for producing the experiments in @@ -128,14 +136,6 @@ the logs by doing `python -m research.exp_integrated view_result (modify the results file path accordingly), and fix the scripts/patches as needed. -## Installation and usage - -Use `pip install pytest-inline` to install our Python pytest-plugin - -Use `pytest .` to run all inline tests in working directory - -Use `pytest {filename}` to run all inline tests in a Python file - ## Citation Title: [Inline Tests][paper-url] From cd2c6a4d406cca463b02c7c6d960c05dcd0a8381 Mon Sep 17 00:00:00 2001 From: Yu Liu Date: Sun, 20 Nov 2022 17:58:37 -0600 Subject: [PATCH 36/48] Update README.md --- README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/README.md b/README.md index 9158452..09322be 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,6 @@ I-Test is a framework for writing inline tests in Python and Java. -## Installation and usage - -Use `pip install pytest-inline` to install our Python pytest-plugin - -Use `pytest .` to run all inline tests in working directory - -Use `pytest {filename}` to run all inline tests in a Python file - ## Introduction This repo contains the code and data for producing the experiments in From 74d97161761426e0ecf8bd7826b07d0381bd3ca1 Mon Sep 17 00:00:00 2001 From: Yu Liu Date: Sun, 20 Nov 2022 17:59:04 -0600 Subject: [PATCH 37/48] Update README.rst --- python/README.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/python/README.rst b/python/README.rst index 568b10c..2f76d05 100644 --- a/python/README.rst +++ b/python/README.rst @@ -4,6 +4,15 @@ pytest-inline pytest-inline is a plugin for `pytest `_ that writes inline tests. +Installation and usage +---------------------- + +Use `pip install pytest-inline` to install our Python pytest-plugin + +Use `pytest .` to run all inline tests in working directory + +Use `pytest {filename}` to run all inline tests in a Python file + API --- Declaration an inline test From c5cd4ae5ee34a5f40e7d950c402cc8c3e5c41a43 Mon Sep 17 00:00:00 2001 From: Yu Liu Date: Sun, 20 Nov 2022 18:00:18 -0600 Subject: [PATCH 38/48] Update README.rst --- python/README.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/README.rst b/python/README.rst index 2f76d05..1c8e8e9 100644 --- a/python/README.rst +++ b/python/README.rst @@ -7,11 +7,11 @@ pytest-inline is a plugin for `pytest `_ that writes inline t Installation and usage ---------------------- -Use `pip install pytest-inline` to install our Python pytest-plugin +Use ``pip install pytest-inline`` to install our Python pytest-plugin -Use `pytest .` to run all inline tests in working directory +Use ``pytest .`` to run all inline tests in working directory -Use `pytest {filename}` to run all inline tests in a Python file +Use ``pytest {filename}`` to run all inline tests in a Python file API --- From 15d17a5fe51d015d01777b6de8562213036c8ba6 Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Sun, 20 Nov 2022 18:16:01 -0600 Subject: [PATCH 39/48] add option inlinetest-only --- python/inline/conftest.py | 56 ++++++++++++++++++++--------- python/tests/test_conftest.py | 66 +++++++++++++++++++++++++++++++---- 2 files changed, 99 insertions(+), 23 deletions(-) diff --git a/python/inline/conftest.py b/python/inline/conftest.py index bb60216..d935bc6 100644 --- a/python/inline/conftest.py +++ b/python/inline/conftest.py @@ -11,6 +11,7 @@ from _pytest.pathlib import fnmatch_ex, import_path from pytest import Collector, Config, FixtureRequest, Parser import signal +from _pytest.main import Session if sys.version_info >= (3, 9, 0): from ast import unparse as ast_unparse @@ -25,11 +26,11 @@ def pytest_addoption(parser: Parser) -> None: group = parser.getgroup("collect") group.addoption( - "--inlinetest-modules", + "--inlinetest-only", action="store_true", default=False, help="run inlinetests in all .py modules", - dest="inlinetest_modules", + dest="inlinetest_only", ) group.addoption( "--inlinetest-glob", @@ -96,6 +97,19 @@ def pytest_configure(config): config.addinivalue_line("markers", "inline: mark inline tests") +@pytest.hookimpl() +def pytest_collectstart(collector): + if not isinstance(collector, Session): + if collector.config.getoption("inlinetest_only") and ( + not isinstance(collector, InlinetestModule) + ): + collector.collect = lambda: [] # type: ignore[assignment] + elif collector.config.getoption("inlinetest_disable") and isinstance( + collector, InlinetestModule + ): + collector.collect = lambda: [] # type: ignore[assignment] + + def pytest_collect_file( file_path: Path, parent: Collector, @@ -778,7 +792,9 @@ def parse_check_neq(self, node): assert_node = self.build_assert_neq(left_node, comparator_node) self.cur_inline_test.check_stmts.append(assert_node) else: - raise MalformedException("inline test: invalid check_neq(), expected 2 args") + raise MalformedException( + "inline test: invalid check_neq(), expected 2 args" + ) def build_assert_none(self, left_node): equal_node = ast.Compare( @@ -900,7 +916,9 @@ def parse_check_same(self, node): assert_node = self.build_assert_same(left_node, comparator_node) self.cur_inline_test.check_stmts.append(assert_node) else: - raise MalformedException("inline test: invalid check_same(), expected 2 args") + raise MalformedException( + "inline test: invalid check_same(), expected 2 args" + ) def build_assert_not_same(self, left_node, comparator_node): equal_node = ast.Compare( @@ -944,7 +962,9 @@ def parse_check_not_same(self, node): assert_node = self.build_assert_not_same(left_node, comparator_node) self.cur_inline_test.check_stmts.append(assert_node) else: - raise MalformedException("inline test: invalid check_not_same(), expected 2 args") + raise MalformedException( + "inline test: invalid check_not_same(), expected 2 args" + ) def build_fail(self): equal_node = ast.Compare( @@ -952,10 +972,7 @@ def build_fail(self): ops=[ast.Eq()], comparators=[ast.Constant(1)], ) - assert_node = ast.Assert( - test=equal_node - - ) + assert_node = ast.Assert(test=equal_node) return assert_node def parse_fail(self, node): @@ -963,7 +980,9 @@ def parse_fail(self, node): if len(node.args) == 0: self.build_fail() else: - raise MalformedException("inline test: invalid check_instance_of(), expected 2 args") + raise MalformedException( + "inline test: invalid check_instance_of(), expected 2 args" + ) def parse_group(self, node): if ( @@ -1285,23 +1304,28 @@ class InlinetestModule(pytest.Module): def order_tests(test_list, tags): prio_unsorted = [] unordered = [] - + # sorting the tests based on if they are ordered or not for test in test_list: - if (len(set(test.tag) & set(tags)) > 0): + if len(set(test.tag) & set(tags)) > 0: prio_unsorted.append(test) else: unordered.append(test) # giving each test a value for its order in tags sorted_ordering = [None] * len(prio_unsorted) - for i in range(0,len(prio_unsorted)): + for i in range(0, len(prio_unsorted)): for tag in tags: - if(tag in prio_unsorted[i].tag): + if tag in prio_unsorted[i].tag: sorted_ordering[i] = tags.index(tag) - + # sorting the list based on their tag positions - prio_sorted = [val for (_, val) in sorted(zip(sorted_ordering, prio_unsorted), key=lambda x: x[0])] + prio_sorted = [ + val + for (_, val) in sorted( + zip(sorted_ordering, prio_unsorted), key=lambda x: x[0] + ) + ] prio_sorted.extend(unordered) return prio_sorted diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index 594ffdd..9bbf021 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -244,7 +244,7 @@ def m(a): reprec = pytester.inline_run("--inlinetest-group=add") items = [x.item for x in reprec.getcalls("pytest_itemcollected")] assert len(items) == 1 - + def test_check_multiple_group_tests(self, pytester: Pytester): checkfile = pytester.makepyfile( """ @@ -257,7 +257,9 @@ def m(a): """ ) for x in (pytester.path, checkfile): - reprec = pytester.inline_run("--inlinetest-group=add", "--inlinetest-group=minus") + reprec = pytester.inline_run( + "--inlinetest-group=add", "--inlinetest-group=minus" + ) items = [x.item for x in reprec.getcalls("pytest_itemcollected")] assert len(items) == 2 @@ -458,7 +460,9 @@ def m(a): """ ) for x in (pytester.path, checkfile): - reprec = pytester.inline_run("--inlinetest-order=minus", "--inlinetest-order=add") + reprec = pytester.inline_run( + "--inlinetest-order=minus", "--inlinetest-order=add" + ) items = [x.item for x in reprec.getcalls("pytest_itemcollected")] assert len(items) == 2 assert items[0].dtest.test_name == "2" @@ -478,7 +482,9 @@ def m(a): """ ) for x in (pytester.path, checkfile): - reprec = pytester.inline_run("--inlinetest-order=minus", "--inlinetest-order=add") + reprec = pytester.inline_run( + "--inlinetest-order=minus", "--inlinetest-order=add" + ) items = [x.item for x in reprec.getcalls("pytest_itemcollected")] assert len(items) == 3 @@ -502,7 +508,9 @@ def m(a): """ ) for x in (pytester.path, checkfile): - reprec = pytester.inline_run("--inlinetest-order=minus", "--inlinetest-order=add") + reprec = pytester.inline_run( + "--inlinetest-order=minus", "--inlinetest-order=add" + ) items = [x.item for x in reprec.getcalls("pytest_itemcollected")] assert len(items) == 4 @@ -523,7 +531,11 @@ def m(a): """ ) for x in (pytester.path, checkfile): - reprec = pytester.inline_run("--inlinetest-order=minus", "--inlinetest-order=add", "--inlinetest-group=add") + reprec = pytester.inline_run( + "--inlinetest-order=minus", + "--inlinetest-order=add", + "--inlinetest-group=add", + ) items = [x.item for x in reprec.getcalls("pytest_itemcollected")] assert len(items) == 1 @@ -614,4 +626,44 @@ def m(a): for x in (pytester.path, checkfile): items, reprec = pytester.inline_genitems(x) assert len(items) == 0 - res = pytester.runpytest() \ No newline at end of file + res = pytester.runpytest() + + def test_unit_test_disable_inline_test_enable(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def test_mtd(a, c): + b = a + c + Here().given(a, 2).given(c, a + 1).check_true(b == 5) + assert False + """ + ) + for x in (pytester.path, checkfile): + pytester.makefile( + ".ini", pytest="[pytest]\naddopts = -p pytester --inlinetest-only" + ) + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 0 + + def test_unit_test_enable_inline_test_disable(self, pytester: Pytester): + checkfile = pytester.makepyfile( + """ + from inline import Here + def test_mtd(): + a = 1 + c = 1 + b = a + c + Here().given(a, 2).given(c, a + 1).check_true(b == 5) + assert False + """ + ) + for x in (pytester.path, checkfile): + pytester.makefile( + ".ini", pytest="[pytest]\naddopts = -p pytester --inlinetest-disable" + ) + items, reprec = pytester.inline_genitems(x) + assert len(items) == 1 + res = pytester.runpytest() + assert res.ret == 1 From c7b12057b129ea0ba173649fa1ccf50131a8a4cb Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Sun, 20 Nov 2022 18:20:55 -0600 Subject: [PATCH 40/48] update changelog --- python/changelog | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/changelog b/python/changelog index 73167c4..9cb5168 100644 --- a/python/changelog +++ b/python/changelog @@ -1,8 +1,8 @@ # Changelog -## [Unreleased] +## [1.0.0] ### Added -- JUnit 5 features - -### Fixed +- JUnit 5 features: timeout, more types of assertions, assumptions, and running tests in order +- Option "inlinetest-only" +- Integration tests of running tests in parallel with pytest-xdist From 8c1367bc2e53eabaee1ee5adf6366e323365688d Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Sun, 20 Nov 2022 18:21:33 -0600 Subject: [PATCH 41/48] update version --- python/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/setup.py b/python/setup.py index 4feadfc..4043def 100644 --- a/python/setup.py +++ b/python/setup.py @@ -14,7 +14,7 @@ def read(fname): setup( name="pytest-inline", - version="0.1.0", + version="1.0.0", author="Yu Liu", author_email="yuki.liu@utexas.edu", maintainer="Yu Liu", From a62f12e7e9f86fd93b8a78650ee394d236ce7bbe Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Mon, 21 Nov 2022 14:53:34 -0500 Subject: [PATCH 42/48] Updated Assume Statements --- python/inline/conftest.py | 143 +++++++++++----------------------- python/inline/inline.py | 14 +--- python/tests/test_conftest.py | 90 +++++---------------- 3 files changed, 65 insertions(+), 182 deletions(-) diff --git a/python/inline/conftest.py b/python/inline/conftest.py index 94400bf..441fa50 100644 --- a/python/inline/conftest.py +++ b/python/inline/conftest.py @@ -134,6 +134,7 @@ class InlineTest: def __init__(self): self.assume_stmts = [] + self.assume_node : ast.If = None self.check_stmts = [] self.given_stmts = [] self.previous_stmts = [] @@ -153,26 +154,42 @@ def __init__(self): def to_test(self): if self.prev_stmt_type == PrevStmtType.CondExpr: - return "\n".join( - self.import_libraries - + [ExtractInlineTest.node_to_source_code(n) for n in self.assume_stmts] - + [ExtractInlineTest.node_to_source_code(n) for n in self.given_stmts] - + [ExtractInlineTest.node_to_source_code(n) for n in self.check_stmts] - ) + if self.assume_stmts == []: + return "\n".join( + self.import_libraries + + [ExtractInlineTest.node_to_source_code(n) for n in self.given_stmts] + + [ExtractInlineTest.node_to_source_code(n) for n in self.check_stmts] + ) + else: + body_nodes = [n for n in self.given_stmts] + [n for n in self.previous_stmts] + [n for n in self.check_stmts] + assume_statement = self.assume_stmts[0] + assume_node = self.build_assume_node(assume_statement, body_nodes) + return "\n".join( + self.import_libraries + + ExtractInlineTest.node_to_source_code(assume_node) + + ) + + else: - return "\n".join( - self.import_libraries - + [ExtractInlineTest.node_to_source_code(n) for n in self.given_stmts] - + [ExtractInlineTest.node_to_source_code(n) for n in self.previous_stmts] - + [ExtractInlineTest.node_to_source_code(n) for n in self.check_stmts] - ) + if self.assume_stmts == []: + return "\n".join( + self.import_libraries + + [ExtractInlineTest.node_to_source_code(n) for n in self.given_stmts] + + [ExtractInlineTest.node_to_source_code(n) for n in self.previous_stmts] + + [ExtractInlineTest.node_to_source_code(n) for n in self.check_stmts] + ) + else: + body_nodes = [n for n in self.given_stmts] + [n for n in self.previous_stmts] + [n for n in self.check_stmts] + assume_statement = self.assume_stmts[0] + assume_node = self.build_assume_node(assume_statement, body_nodes) + return "\n".join( + self.import_libraries + + [ExtractInlineTest.node_to_source_code(assume_node)] + ) - def to_test_assumptions(self): - return "\n".join( - self.import_libraries - + [ExtractInlineTest.node_to_source_code(n) for n in self.previous_stmts] - + [ExtractInlineTest.node_to_source_code(n) for n in self.assume_stmts] - ) + def build_assume_node(self, assumption_node, body_nodes): + return ast.If(assumption_node, body_nodes,[]) def __repr__(self): if self.test_name: @@ -265,8 +282,7 @@ class ExtractInlineTest(ast.NodeTransformer): arg_tag_str = "tag" arg_disabled_str = "disabled" arg_timeout_str = "timeout" - assume_true_str = "assume_true" - assume_false_str = "assume_false" + assume = "assume" inline_module_imported = False def __init__(self): @@ -623,82 +639,22 @@ def parse_given(self, node): else: raise MalformedException("inline test: invalid given(), expected 2 args") - def build_assume_true(self, test_node): - assert_node = ast.Assert( - test=test_node, - msg=ast.Call( - func=ast.Attribute( - ast.Constant( - "Assumption that bool({0}) is True\nActual: bool({0}) is False\n" - ), - "format", - ast.Load(), - ), - args=[ - ast.Constant(self.node_to_source_code(test_node)), - test_node, - ], - keywords=[], - ), - ) - return assert_node - - def parse_assume_true(self, node): + def parse_assume(self, node): if len(node.args) == 1: if self.cur_inline_test.parameterized: self.parameterized_inline_tests_init(node.args[0]) for index, value in enumerate(node.args[0].elts): test_node = self.parse_group(value) - assert_node = self.build_assume_true(test_node) + assumption_node = self.build_assume(test_node) self.cur_inline_test.parameterized_inline_tests[ index - ].assume_stmts.append(assert_node) + ].assume_stmts.append(assumption_node) else: test_node = self.parse_group(node.args[0]) - assert_node = self.build_assume_true(test_node) - self.cur_inline_test.assume_stmts.append(assert_node) + self.cur_inline_test.assume_stmts.append(test_node) else: raise MalformedException( - "inline test: invalid assume_true(), expected 1 arg" - ) - - def build_assume_false(self, test_node): - assert_node = ast.Assert( - test=ast.UnaryOp(op=ast.Not(), operand=test_node), - msg=ast.Call( - func=ast.Attribute( - ast.Constant( - "Assumption that bool({0}) is False\nActual: bool({0}) is True\n" - ), - "format", - ast.Load(), - ), - args=[ - ast.Constant(self.node_to_source_code(test_node)), - test_node, - ], - keywords=[], - ), - ) - return assert_node - - def parse_assume_false(self, node): - if len(node.args) == 1: - if self.cur_inline_test.parameterized: - self.parameterized_inline_tests_init(node.args[0]) - for index, value in enumerate(node.args[0].elts): - test_node = self.parse_group(value) - assert_node = self.build_assume_false(test_node) - self.cur_inline_test.parameterized_inline_tests[ - index - ].assume_stmts.append(assert_node) - else: - test_node = self.parse_group(node.args[0]) - assert_node = self.build_assume_false(test_node) - self.cur_inline_test.assume_stmts.append(assert_node) - else: - raise MalformedException( - "inline test: invalid assume_false(), expected 1 arg" + "inline test: invalid assume() call, expected 1 arg" ) def build_assert_eq(self, left_node, comparator_node): @@ -1117,18 +1073,12 @@ def parse_inline_test(self, node): # "assume_true(...) or assume_false(...) inline_test_call_index = 1 - for call in inline_test_calls[1:]: + for call in inline_test_calls[1:2]: if ( isinstance(call.func, ast.Attribute) - and call.func.attr == self.assume_true_str + and call.func.attr == self.assume ): - self.parse_assume_true(call) - inline_test_call_index += 1 - elif ( - isinstance(call.func, ast.Attribute) - and call.func.attr == self.assume_false_str - ): - self.parse_assume_false(call) + self.parse_assume(call) inline_test_call_index += 1 else: break @@ -1204,7 +1154,6 @@ def node_to_source_code(node): ast.fix_missing_locations(node) return ast_unparse(node) - ###################################################################### ## InlineTest Finder ###################################################################### @@ -1320,10 +1269,6 @@ def _find(self, tests, obj, module, globs, seen): ###################################################################### class InlineTestRunner: def run(self, test: InlineTest, out: List) -> None: - if(test.assume_stmts != []): - assumptions = ast.parse(test.to_test_assumptions()) - assumptionscodeobj = compile(assumptions, filename="", mode="exec") - exec(assumptionscodeobj, test.globs) tree = ast.parse(test.to_test()) codeobj = compile(tree, filename="", mode="exec") start_time = time.time() diff --git a/python/inline/inline.py b/python/inline/inline.py index 2d7d6a8..30edc49 100644 --- a/python/inline/inline.py +++ b/python/inline/inline.py @@ -124,22 +124,14 @@ def fail(self): :raises: AssertionError """ - def assume_true(self, condition:bool): + def assume(self, condition:bool): """ - Executes the test under the assuming the given condition is true + Executes the test under the assuming the given condition is true. If supplied, must be supplied immediately after Here(). + Can only supply 1 assume statement. :param condition: a boolean condition :raises: AssertionError """ - - def assume_false(self, condition:bool): - """ - Executes the test under the assuming the given condition is true - - :param condition: a boolean condition - :raises: AssertionError - """ - class Group: def __init__(self, *arg): diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index e21a23d..f8b7ed1 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -615,28 +615,13 @@ def m(a): items, reprec = pytester.inline_genitems(x) assert len(items) == 0 - def test_assume_true_fail(self, pytester: Pytester): + def test_assume_correct(self, pytester: Pytester): checkfile = pytester.makepyfile( """ from inline import Here def m(a): a = 3 - Here().assume_true(a == 4).given(a, 1).check_not_none(a) - """ - ) - for x in (pytester.path, checkfile): - items, reprec = pytester.inline_genitems(x) - assert len(items) == 1 - res = pytester.runpytest() - assert res.ret == 1 #Failure - - def test_assume_true(self, pytester: Pytester): - checkfile = pytester.makepyfile( - """ - from inline import Here - def m(a): - a = 3 - Here().assume_true(a == 3).given(a, 1).check_not_none(a) + Here().assume(2 == 3).given(a, 1).check_none(a) """ ) for x in (pytester.path, checkfile): @@ -644,60 +629,18 @@ def m(a): assert len(items) == 1 res = pytester.runpytest() assert res.ret == 0 - - def test_assume_true_false_combo(self, pytester: Pytester): - checkfile = pytester.makepyfile( - """ - from inline import Here - def m(a): - b = 4 - Here().assume_true(b < 5).assume_false(b > 6).given(a, 1).check_not_none(a) - """ - ) - for x in (pytester.path, checkfile): - items, reprec = pytester.inline_genitems(x) - assert len(items) == 1 - res = pytester.runpytest() - assert res.ret == 0 - - def test_assume_false_fail(self, pytester: Pytester): - checkfile = pytester.makepyfile( - """ - from inline import Here - def m(a): - b = 4 - Here().assume_false(b == 4).given(a, 1).check_not_none(a) - """ - ) - for x in (pytester.path, checkfile): - items, reprec = pytester.inline_genitems(x) - assert len(items) == 1 - res = pytester.runpytest() - assert res.ret == 1 - - def test_assume_false(self, pytester: Pytester): + + def test_assume_correct_with_timeout(self, pytester: Pytester): checkfile = pytester.makepyfile( """ from inline import Here - def m(a): - b = 4 - Here().assume_false(b == 3).given(a, 1).check_not_none(a) - """ - ) - for x in (pytester.path, checkfile): - items, reprec = pytester.inline_genitems(x) - assert len(items) == 1 - res = pytester.runpytest() - assert res.ret == 0 - - def test_assume_incorrect_with_timeout(self, pytester: Pytester): - checkfile = pytester.makepyfile( - """ - from inline import Here import time + import sys + print(sys.version) + def m(a): a = -3 - Here(timeout=5.75).assume_true(a > 0).given(a, loop(3)).check_eq(a,1) + Here(timeout=5.75).assume(sys.version > '3.9.0' and sys.version < '4.0').given(a, loop(3)).check_eq(a,1) def loop(b): while True: @@ -708,17 +651,20 @@ def loop(b): items, reprec = pytester.inline_genitems(x) assert len(items) == 1 res = pytester.runpytest() - #Should throw an AssertError + #Should timeout instead of throwing AssertError assert res.ret == 1 - - def test_assume_correct_with_timeout(self, pytester: Pytester): + + def test_assume_incorrect_with_timeout(self, pytester: Pytester): checkfile = pytester.makepyfile( """ - from inline import Here + from inline import Here import time + import sys + print(sys.version) + def m(a): a = -3 - Here(timeout=5.75).assume_true(a < 0).given(a, loop(3)).check_eq(a,1) + Here(timeout=5.75).assume(sys.version < '3.9.0' and sys.version > '4.0').given(a, loop(3)).check_eq(a,1) def loop(b): while True: @@ -729,5 +675,5 @@ def loop(b): items, reprec = pytester.inline_genitems(x) assert len(items) == 1 res = pytester.runpytest() - #Should timeout instead of throwing AssertError - assert res.ret == 1 \ No newline at end of file + #Should not return any assert + assert res.ret == 0 \ No newline at end of file From 35f43ea2e98da822590e5be171a9950ecb4207b9 Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Mon, 21 Nov 2022 15:33:16 -0500 Subject: [PATCH 43/48] Updated tests to pass CI --- python/tests/test_conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index f8b7ed1..dd13880 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -640,7 +640,7 @@ def test_assume_correct_with_timeout(self, pytester: Pytester): def m(a): a = -3 - Here(timeout=5.75).assume(sys.version > '3.9.0' and sys.version < '4.0').given(a, loop(3)).check_eq(a,1) + Here(timeout=5.75).assume(sys.version > '3.4.0' and sys.version < '4.0').given(a, loop(3)).check_eq(a,1) def loop(b): while True: From 3bae802afe092e87f57effdc1583f2c4c2cf9af8 Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Mon, 21 Nov 2022 15:34:00 -0500 Subject: [PATCH 44/48] Updated tests to pass CI --- python/tests/test_conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index dd13880..fbb72e4 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -640,7 +640,7 @@ def test_assume_correct_with_timeout(self, pytester: Pytester): def m(a): a = -3 - Here(timeout=5.75).assume(sys.version > '3.4.0' and sys.version < '4.0').given(a, loop(3)).check_eq(a,1) + Here(timeout=5.75).assume(sys.version > '3.4.0' and sys.version < '3.11.9').given(a, loop(3)).check_eq(a,1) def loop(b): while True: From b9bc9849afe15707091c838d70e89800d3cc27ca Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Mon, 21 Nov 2022 15:36:57 -0500 Subject: [PATCH 45/48] Updated tests to pass CI --- python/tests/test_conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index fbb72e4..4e44fbc 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -640,7 +640,7 @@ def test_assume_correct_with_timeout(self, pytester: Pytester): def m(a): a = -3 - Here(timeout=5.75).assume(sys.version > '3.4.0' and sys.version < '3.11.9').given(a, loop(3)).check_eq(a,1) + Here(timeout=5.75).assume(sys.version > '2' and sys.version < '4').given(a, loop(3)).check_eq(a,1) def loop(b): while True: From 14f6f6ec34cb9b265088a9d179ae8787d44962f5 Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Mon, 21 Nov 2022 15:48:42 -0500 Subject: [PATCH 46/48] Updated tests to pass CI --- python/tests/test_conftest.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index 4e44fbc..cbdca54 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -621,7 +621,7 @@ def test_assume_correct(self, pytester: Pytester): from inline import Here def m(a): a = 3 - Here().assume(2 == 3).given(a, 1).check_none(a) + Here().assume(True).given(a, 1).check_not_none(a) """ ) for x in (pytester.path, checkfile): @@ -640,7 +640,7 @@ def test_assume_correct_with_timeout(self, pytester: Pytester): def m(a): a = -3 - Here(timeout=5.75).assume(sys.version > '2' and sys.version < '4').given(a, loop(3)).check_eq(a,1) + Here(timeout=5.75).assume(True).given(a, loop(3)).check_eq(a,1) def loop(b): while True: @@ -664,7 +664,7 @@ def test_assume_incorrect_with_timeout(self, pytester: Pytester): def m(a): a = -3 - Here(timeout=5.75).assume(sys.version < '3.9.0' and sys.version > '4.0').given(a, loop(3)).check_eq(a,1) + Here(timeout=5.75).assume(False).given(a, loop(3)).check_eq(a,1) def loop(b): while True: From 2a4c0c0539f36ceda602f00e564f549d7d874b45 Mon Sep 17 00:00:00 2001 From: Zachary Thurston Date: Mon, 21 Nov 2022 16:06:51 -0500 Subject: [PATCH 47/48] Updated to reflect comments on MR --- python/inline/conftest.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/python/inline/conftest.py b/python/inline/conftest.py index 441fa50..a6f1053 100644 --- a/python/inline/conftest.py +++ b/python/inline/conftest.py @@ -1073,16 +1073,14 @@ def parse_inline_test(self, node): # "assume_true(...) or assume_false(...) inline_test_call_index = 1 - for call in inline_test_calls[1:2]: + if(len(inline_test_calls) >= 2): + call = inline_test_calls[1] if ( isinstance(call.func, ast.Attribute) and call.func.attr == self.assume ): self.parse_assume(call) inline_test_call_index += 1 - else: - break - # "given(a, 1)" for call in inline_test_calls[inline_test_call_index:]: From bbe2867513c690765116200c3e603c2e13dfd199 Mon Sep 17 00:00:00 2001 From: Yu Liu Date: Mon, 21 Nov 2022 15:39:03 -0600 Subject: [PATCH 48/48] Update test_conftest.py --- python/tests/test_conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tests/test_conftest.py b/python/tests/test_conftest.py index 1259f09..a627c91 100644 --- a/python/tests/test_conftest.py +++ b/python/tests/test_conftest.py @@ -637,7 +637,7 @@ def m(a): """ ) for x in (pytester.path, checkfile): - res = pytester.runpytest() + items, reprec = pytester.inline_genitems(x) assert len(items) == 1 res = pytester.runpytest() assert res.ret == 0