def test_2(self):
     invoker = FunctionInvoker()
     invoker.provide_object('5')
     with self.assertRaises(TypeNotFoundError):
         invoker.invoke(func2) # abc has no type
     invoker.provide_object(8, provide_name='abce')
     self.assertEqual(invoker.invoke(func2), 8)
 def test_4(self):
     invoker = FunctionInvoker()
     invoker.provide_object('4', provide_name="abc")
     invoker.provide_object('5')
     invoker2 = invoker.create_transient()
     invoker2.provide_object('6')
     self.assertEqual(invoker.invoke(func1), '4')
     self.assertEqual(invoker2.invoke(func1), '4') # because match name and type, so return '4'
     invoker3 = invoker.create_transient()
     invoker3.provide_object('7', provide_name="abc")
     self.assertEqual(invoker.invoke(func1), '4')
     self.assertEqual(invoker2.invoke(func1), '4')
     self.assertEqual(invoker3.invoke(func1), '7')
    def test_3(self):
        invoker = FunctionInvoker()
        invoker.provide_object(3)
        self.assertEqual(invoker.invoke(func3), 3)

        invoker2 = FunctionInvoker()
        invoker2.provide_object(3)
        invoker2.provide_object('4')
        self.assertEqual(invoker2.invoke(func3), 3) # should match first type (int)

        invoker3 = FunctionInvoker()
        invoker3.provide_object('4')
        invoker3.provide_object(3)
        self.assertEqual(invoker3.invoke(func3), 3) # should match first type (int)

        invoker4 = FunctionInvoker()
        invoker4.provide_object('4', provide_name='abc')
        invoker4.provide_object(3)
        self.assertEqual(invoker4.invoke(func3), '4')
 def test_3(self):
     invoker = FunctionInvoker()
     invoker.provide_object('4', provide_name="abc")
     invoker.provide_object('5')
     self.assertEqual(invoker.invoke(func1), '4')
 def test_2(self):
     invoker = FunctionInvoker()
     invoker.provide_object('4')
     invoker.provide_object('5')
     self.assertEqual(invoker.invoke(func1), '5')