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)