def test_more_complex(self): r = collections.OrderedDict() core._add_input(r, 'a', 1) core._add_input(r, 'b', 2) core._add_input(r, 'c', 3) f1 = lambda c: c['a'] + 10 f2 = lambda c: c['d'] * c['b'] # Note this is to force a backtrack (i.e. using 'a' here) as it forces # f3 ('g') to be looked at early, which then causes 'b', etc to be # done. f3 = lambda c: c['e'] + c['c'] + c['a'] + 100 out = None def f4(c): nonlocal out out = c['f'] add_compute_helper(r, 'd', f1, ['a']) add_compute_helper(r, 'e', f2, ['d', 'b']) add_compute_helper(r, 'f', f3, ['e', 'c', 'a']) add_output_helper(r, 'g', f4, ['f']) ctxt = {} getter = functools.partial(TestRun.getter, ctxt) setter = functools.partial(TestRun.setter, ctxt) core._run(r, TestRun.true, getter, setter) self.assertEqual(ctxt['d'], 11) self.assertEqual(ctxt['e'], 22) self.assertEqual(ctxt['f'], 22 + 3 + 1 + 100) self.assertEqual(out, ctxt['f'])
def test_simple_run(self): r = collections.OrderedDict() core._add_input(r, 'a', 1) f1 = lambda c: c['a'] + 1 add_compute_helper(r, 'b', f1, ['a']) ctxt = {} getter = functools.partial(TestRun.getter, ctxt) setter = functools.partial(TestRun.setter, ctxt) core._run(r, TestRun.true, getter, setter) self.assertEqual(ctxt['a'], 1) self.assertEqual(ctxt['b'], 2)
def test_break_process_to_raise_weirdness(self): r = collections.OrderedDict() core._add_input(r, 'a', 1) ctxt = {} getter = functools.partial(TestRun.getter, ctxt) setter = functools.partial(TestRun.setter, ctxt) with mock.patch.object(core, '_process_item') as pi, \ self.assertRaises(core.AbortExecution) as e: pi.side_effect = KeyError('foo') core._run(r, TestRun.true, getter, setter) self.assertIn('Weirdness:', str(e.exception)) self.assertNotIn('a', ctxt)
def test_abort_output(self): r = collections.OrderedDict() core._add_input(r, 'a', 1) def f1(c): raise core.AbortFunction() add_output_helper(r, 'b', f1, ['a']) ctxt = {} getter = functools.partial(TestRun.getter, ctxt) setter = functools.partial(TestRun.setter, ctxt) core._run(r, TestRun.true, getter, setter) self.assertEqual(ctxt['a'], 1) self.assertNotIn('b', ctxt)
def test_abort_execution(self): r = collections.OrderedDict() def f1(): raise core.AbortExecution() core._add_input(r, 'a', f1) f2 = lambda c: 2 add_compute_helper(r, 'b', f1, ['a']) ctxt = {} getter = functools.partial(TestRun.getter, ctxt) setter = functools.partial(TestRun.setter, ctxt) with self.assertRaises(core.AbortExecution): core._run(r, TestRun.true, getter, setter) self.assertNotIn('b', ctxt)
def test_other_exception_causes_abort_execution(self): r = collections.OrderedDict() def f1(): raise KeyError() core._add_input(r, 'a', f1) f2 = lambda c: 2 add_compute_helper(r, 'b', f1, ['a']) ctxt = {} getter = functools.partial(TestRun.getter, ctxt) setter = functools.partial(TestRun.setter, ctxt) with self.assertRaises(core.AbortExecution) as e: core._run(r, TestRun.true, getter, setter) print(str(e.exception)) self.assertNotIn('b', ctxt)
def test_abort_function(self): # test that a compute function can be aborted and stop the chain r = collections.OrderedDict() core._add_input(r, 'a', 1) def f1(c): raise core.AbortFunction() f2 = lambda c: 2 add_compute_helper(r, 'b', f1, ['a']) add_compute_helper(r, 'c', f2, ['b']) ctxt = {} getter = functools.partial(TestRun.getter, ctxt) setter = functools.partial(TestRun.setter, ctxt) core._run(r, TestRun.true, getter, setter) self.assertEqual(ctxt['a'], 1) self.assertEqual(ctxt['b'], None) self.assertNotIn('c', ctxt)