From 79a52ea96b18368d26ea07d31c4892c5beffde98 Mon Sep 17 00:00:00 2001 From: herr kaste Date: Fri, 30 Nov 2018 11:32:16 +0100 Subject: [PATCH 1/3] Throw and send the condition outcome into the test --- tests/test_yield_condition.py | 17 +++++++++++++++++ unittesting/core/st3/runner.py | 18 ++++++++++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 tests/test_yield_condition.py diff --git a/tests/test_yield_condition.py b/tests/test_yield_condition.py new file mode 100644 index 00000000..1614aeba --- /dev/null +++ b/tests/test_yield_condition.py @@ -0,0 +1,17 @@ +from unittesting import DeferrableTestCase + + +class TestYieldConditionsHandlingInDeferredTestCase(DeferrableTestCase): + def test_reraises_errors_raised_in_conditions(self): + try: + yield lambda: 1 / 0 + self.fail('Did not reraise the exception from the condition') + except ZeroDivisionError: + pass + except Exception: + self.fail('Did not throw the original exception') + + def test_returns_condition_value(self): + rv = yield lambda: 'Hans Peter' + + self.assertEqual(rv, 'Hans Peter') diff --git a/unittesting/core/st3/runner.py b/unittesting/core/st3/runner.py index 89623f86..ca62fc0e 100644 --- a/unittesting/core/st3/runner.py +++ b/unittesting/core/st3/runner.py @@ -45,9 +45,13 @@ def _start_testing(): except Exception as e: _handle_error(e) - def _continue_testing(deferred): + def _continue_testing(deferred, send_value=None, throw_value=None): try: - condition = next(deferred) + if throw_value: + condition = deferred.throw(throw_value) + else: + condition = deferred.send(send_value) + if callable(condition): defer(100, _wait_condition, deferred, condition) elif isinstance(condition, dict) and "condition" in condition and \ @@ -70,8 +74,14 @@ def _wait_condition(deferred, condition, period=100, timeout=10000, start_time=N if start_time is None: start_time = time.time() - if condition(): - defer(10, _continue_testing, deferred) + try: + send_value = condition() + except Exception as e: + defer(10, _continue_testing, deferred, throw_value=e) + return + + if send_value: + defer(10, _continue_testing, deferred, send_value=send_value) elif (time.time() - start_time) * 1000 >= timeout: self.stream.writeln("Condition timeout, continue anyway.") defer(10, _continue_testing, deferred) From 938fb6df87ed182db1ab110295cba8163dcdbd93 Mon Sep 17 00:00:00 2001 From: herr kaste Date: Sat, 1 Dec 2018 19:17:08 +0100 Subject: [PATCH 2/3] Raise TimeoutError if condition times out --- tests/test_yield_condition.py | 13 +++++++++++++ unittesting/core/st3/runner.py | 7 +++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/test_yield_condition.py b/tests/test_yield_condition.py index 1614aeba..a6ad7e4d 100644 --- a/tests/test_yield_condition.py +++ b/tests/test_yield_condition.py @@ -15,3 +15,16 @@ def test_returns_condition_value(self): rv = yield lambda: 'Hans Peter' self.assertEqual(rv, 'Hans Peter') + + def test_handle_condition_timeout_as_failure(self): + try: + yield { + 'condition': lambda: True is False, + 'timeout': 100 + } + self.fail('Unmet condition should have thrown') + except TimeoutError as e: + self.assertEqual( + str(e), + 'Condition not fulfilled within 0.10 seconds' + ) diff --git a/unittesting/core/st3/runner.py b/unittesting/core/st3/runner.py index ca62fc0e..4ce206b4 100644 --- a/unittesting/core/st3/runner.py +++ b/unittesting/core/st3/runner.py @@ -83,8 +83,11 @@ def _wait_condition(deferred, condition, period=100, timeout=10000, start_time=N if send_value: defer(10, _continue_testing, deferred, send_value=send_value) elif (time.time() - start_time) * 1000 >= timeout: - self.stream.writeln("Condition timeout, continue anyway.") - defer(10, _continue_testing, deferred) + error = TimeoutError( + 'Condition not fulfilled within {:.2f} seconds' + .format(timeout / 1000) + ) + defer(10, _continue_testing, deferred, throw_value=error) else: defer(period, _wait_condition, deferred, condition, period, timeout, start_time) From 8a1c28f5ea5b2c14d52726ab8c3b3b40d2eab44f Mon Sep 17 00:00:00 2001 From: herr kaste Date: Sat, 1 Dec 2018 19:32:25 +0100 Subject: [PATCH 3/3] Remove previous contrary timeout test --- tests/_Deferred/tests/test.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/tests/_Deferred/tests/test.py b/tests/_Deferred/tests/test.py index da6b5d7c..3782da8f 100644 --- a/tests/_Deferred/tests/test.py +++ b/tests/_Deferred/tests/test.py @@ -46,16 +46,3 @@ def condition(): yield condition self.assertEqual(x[0], 1) - - def test_condition_timeout(self): - x = [] - - def append(): - x.append(1) - - sublime.set_timeout(append, 100) - - # wait until condition timeout - yield {"condition": lambda: False, "timeout": 500} - - self.assertEqual(x[0], 1)