def test_named_list(self): class Class1: @named_arg("my_param", "type_1") @named_arg("my_other_param", "type_2") def __init__(self, my_param: List[str], my_other_param: List[str], my_default_param: List[str]): self.my_param = my_param self.my_other_param = my_other_param self.my_default_param = my_default_param injector = Injector(bindings=[ SelfBinding(Class1), MultiBinding(str, [ ItemBinding(bound_instance="my_type_1"), ], named="type_1"), MultiBinding(str, [ ItemBinding(bound_instance="my_type_2"), ], named="type_2"), MultiBinding( str, [ ItemBinding(bound_instance="my_default"), ], ), ]) instance = injector.inject(Class1) self.assertIsInstance(instance, Class1) self.assertEqual(["my_type_1"], instance.my_param) self.assertEqual(["my_type_2"], instance.my_other_param) self.assertEqual(["my_default"], instance.my_default_param)
def test_list_injection_item_singletons(self): injector = Injector(bindings=[ MultiBinding(MyClass, [ItemBinding(bound_class=MyClass)]) ]) list_instance = injector.inject(List[MyClass]) tuple_instance = injector.inject(Tuple[MyClass]) self.assertIs(list_instance[0], tuple_instance[0])
def test_list_direct_injection(self): class_list = Injector(bindings=[ MultiBinding(MyClass, [ItemBinding(bound_class=MyClass)]) ]).inject(List[MyClass]) self.assertIsInstance(class_list, list) self.assertEqual(1, len(class_list)) self.assertIsInstance(class_list[0], MyClass)
def test_set_direct_injection(self): class_set = Injector(bindings=[ MultiBinding(MyClass, [ItemBinding(bound_class=MyClass)]) ]).inject(Set[MyClass]) self.assertIsInstance(class_set, set) self.assertEqual(1, len(list(class_set))) self.assertIsInstance(class_set.pop(), MyClass)
def test_inject_list_with_singleton_items(self): class SubClass1(MyClass): pass class SubClass2(MyClass): pass injector = Injector(bindings=[ MultiBinding(MyClass, [ItemBinding(SubClass1), ItemBinding(SubClass2)]) ]) list_1 = injector.inject(List[MyClass]) list_2 = injector.inject(List[MyClass]) self.assertEqual(2, len(list_1)) self.assertEqual(2, len(list_2)) self.assertIsInstance(list_1[0], SubClass1) self.assertIs(list_1[0], list_2[0]) self.assertIsInstance(list_1[1], SubClass2) self.assertIs(list_1[1], list_2[1])
def test_args_injection_with_multi_binding(self): class MyParentClass: def __init__(self, *my_param: MyClass): self.my_param = my_param injector = Injector(bindings=[ SelfBinding(MyParentClass), MultiBinding(MyClass, [ItemBinding(bound_instance=MyClass())]) ]) parent = injector.inject(MyParentClass) self.assertIsInstance(parent, MyParentClass) self.assertIsInstance(parent.my_param, tuple) self.assertIsInstance(parent.my_param[0], MyClass)
def test_set_injection(self): class MyParentClass: def __init__(self, param: Set[MyClass]): self.param = param parent = Injector(bindings=[ MultiBinding(MyClass, [ItemBinding(bound_class=MyClass)]), SelfBinding(MyParentClass) ]).inject(MyParentClass) self.assertIsInstance(parent, MyParentClass) self.assertIsInstance(parent.param, set) self.assertEqual(1, len(list(parent.param))) self.assertIsInstance(parent.param.pop(), MyClass)
def test_list_injection(self): class MyParentClass: def __init__(self, param: List[MyClass]): self.param = param parent = Injector(bindings=[ MultiBinding(MyClass, [ItemBinding(MyClass)]), SelfBinding(MyParentClass) ]).inject(MyParentClass) self.assertIsInstance(parent, MyParentClass) self.assertIsInstance(parent.param, list) self.assertEqual(1, len(parent.param)) self.assertIsInstance(parent.param[0], MyClass)