1 module tests.array;
2 
3 import std.stdio;
4 //import core.exception;
5 import unit_threaded;
6 
7 import endovena;
8 import tests.cut;
9 import tests.utils;
10 
11 @UnitTest
12 void resolving_array_with_default_and_one_named_service_will_return_both_services() {
13    Container container = new Container;
14    container.register!(IService, Service)();
15    container.register!(IService, AnotherService)("another");
16    auto services = container.get!(IService[])();
17    services.length.shouldEqual(2);
18 }
19 
20 @UnitTest
21 void i_can_resolve_array_of_singletons() {
22    Container container = new Container;
23    container.register!(IService, ServiceA, Singleton)();
24    auto services = container.get!(IService[])();
25    services.length.shouldEqual(1);
26 }
27 
28 @UnitTest
29 void I_can_resolve_mixed_array_of_singletons_and_no_scoped() {
30    Container container = new Container;
31    container.register!(IService, Service, Singleton)();
32    container.register!(IService, AnotherService)("another");
33    auto services = container.get!(IService[])();
34    services.length.shouldEqual(2);
35 }
36 
37 @UnitTest
38 void I_can_inject_array_as_dependency() {
39    Container container = new Container;
40    container.register!(IDependency, Dependency)();
41    container.register!(IDependency, Dependency)("Foo2");
42    container.register!(IDependency, Dependency)("Foo3");
43    container.register!(IService, ServiceWithArrayDependencies)();
44 
45    auto service = container.get!(IService)();
46    service.shouldNotBeNull;
47 
48    ServiceWithArrayDependencies sA = cast(ServiceWithArrayDependencies)(service);
49    sA.foos.length.shouldEqual(3);
50    sA.foos[0].instanceof!Dependency.shouldBeTrue;
51 }
52 
53 @UnitTest
54 void i_can_resolve_array_of_named() {
55    Container container = new Container;
56    container.register!(IService, ServiceA, Singleton)("A");
57    container.register!(IService, ServiceA, Singleton)("B");
58    container.register!(IService, ServiceA, Singleton)("C");
59    auto services = container.get!(IService[])();
60    services.length.shouldEqual(3);
61 }
62 
63 @UnitTest
64 void singleton_is_scoped_by_name() {
65    Container container = new Container;
66    container.register!(IService, ServiceA, Singleton)("A");
67    container.register!(IService, ServiceA, Singleton)("B");
68    container.register!(IService, ServiceA, Singleton)("C");
69    IService a1 = container.get!IService("A");
70    IService a2 = container.get!IService("A");
71    IService b1 = container.get!IService("B");
72    IService b2 = container.get!IService("B");
73 
74    shouldBeTrue(a1 is a2);
75    shouldBeTrue(b1 is b2);
76    shouldBeFalse(b1 is a1);
77    shouldBeFalse(b2 is a2);
78    shouldBeFalse(b2 is a1);
79 }
80 
81 @UnitTest
82 void i_can_resolve_transient_array_of_different_named_service() {
83    Container container = new Container;
84    container.register!(IService, ServiceA)("A");
85    container.register!(IService, ServiceB)("B");
86 
87    auto services = container.get!(IService[])();
88    services.length.shouldEqual(2);
89 
90    container.get!IService("A").instanceof!ServiceA.shouldBeTrue;
91    container.get!IService("B").instanceof!ServiceB.shouldBeTrue;
92 
93    auto s1 = container.get!IService("A");
94    auto s2 = container.get!IService("A");
95    shouldBeFalse(s1 == s2);
96 }
97 
98 @UnitTest
99 void i_can_resolve_singleton_array_of_different_named_service() {
100    Container container = new Container;
101    container.register!(IService, ServiceA, Singleton)("A");
102    container.register!(IService, ServiceB, Singleton)("B");
103    auto services = container.get!(IService[])();
104    services.length.shouldEqual(2);
105    container.get!IService("A").instanceof!ServiceA.shouldBeTrue;
106    container.get!IService("B").instanceof!ServiceB.shouldBeTrue;
107    auto s1 = container.get!IService("A");
108    auto s2 = container.get!IService("A");
109    shouldBeTrue(s1 is s2);
110    shouldBeTrue(s1 == s2);
111 }
112 
113 @UnitTest
114 void i_can_resolve_array_of_different_named_service() {
115    Container container = new Container;
116    container.register!(IService)(c => new ServiceA, "A");
117    container.register!(IService)(c => new ServiceB, "B1");
118    container.register!(IService)(c => new ServiceB, "B2");
119    auto services = container.get!(IService[])();
120    services.length.shouldEqual(3);
121    container.get!IService("A").instanceof!ServiceA.shouldBeTrue;
122    container.get!IService("B1").instanceof!ServiceB.shouldBeTrue;
123    container.get!IService("B2").instanceof!ServiceB.shouldBeTrue;
124    auto b1 = container.get!IService("B1");
125    auto b2 = container.get!IService("B2");
126    shouldBeFalse(b1 is b2);
127    shouldBeFalse(b1 == b2);
128 }
129 
130 @UnitTest
131 void resolving_array_of_not_registered_services_should_throw() {
132 Container container = new Container;
133    container.get!(IService[]).shouldThrow!ResolveException;
134 }