OLD | NEW |
1 @Injectables(const [ | 1 @Injectables(const [ |
2 ClassOne, | 2 ClassOne, |
3 CircularA, | 3 CircularA, |
4 CircularB, | 4 CircularB, |
5 MultipleConstructors, | 5 MultipleConstructors, |
6 NumDependency, | 6 NumDependency, |
7 IntDependency, | 7 IntDependency, |
8 DoubleDependency, | 8 DoubleDependency, |
9 BoolDependency, | 9 BoolDependency, |
10 StringDependency | 10 StringDependency |
11 ]) | 11 ]) |
12 library di.tests; | 12 library di.tests; |
13 | 13 |
14 import 'fixed-unittest.dart'; | 14 import 'fixed-unittest.dart'; |
15 import 'package:di/di.dart'; | 15 import 'package:di/di.dart'; |
16 import 'package:di/dynamic_injector.dart'; | 16 import 'package:di/dynamic_injector.dart'; |
17 import 'package:di/static_injector.dart'; | 17 import 'package:di/static_injector.dart'; |
18 import 'package:di/annotations.dart'; | 18 import 'package:di/annotations.dart'; |
19 | 19 |
| 20 import 'test_annotations.dart'; |
20 // Generated file. Run ../test_tf_gen.sh. | 21 // Generated file. Run ../test_tf_gen.sh. |
21 import 'type_factories_gen.dart' as type_factories_gen; | 22 import 'type_factories_gen.dart' as type_factories_gen; |
22 | 23 |
23 /** | 24 /** |
24 * Annotation used to mark classes for which static type factory must be | 25 * Annotation used to mark classes for which static type factory must be |
25 * generated. For testing purposes not all classes are marked with this | 26 * generated. For testing purposes not all classes are marked with this |
26 * annotation, some classes are included in @Injectables at the top. | 27 * annotation, some classes are included in @Injectables at the top. |
27 */ | 28 */ |
28 class Injectable { | 29 class InjectableTest { |
29 const Injectable(); | 30 const InjectableTest(); |
30 } | 31 } |
31 | 32 |
32 // just some classes for testing | 33 // just some classes for testing |
33 @Injectable() | 34 @InjectableTest() |
34 class Engine { | 35 class Engine { |
35 final String id = 'v8-id'; | 36 final String id = 'v8-id'; |
36 } | 37 } |
37 | 38 |
38 @Injectable() | 39 @Injectable() |
39 class MockEngine implements Engine { | 40 class MockEngine implements Engine { |
40 final String id = 'mock-id'; | 41 final String id = 'mock-id'; |
41 } | 42 } |
42 | 43 |
43 @Injectable() | 44 @InjectableTest() |
44 class MockEngine2 implements Engine { | 45 class MockEngine2 implements Engine { |
45 String id = 'mock-id-2'; | 46 String id = 'mock-id-2'; |
46 } | 47 } |
47 | 48 |
48 class HiddenConstructor { | 49 class HiddenConstructor { |
49 HiddenConstructor._(); | 50 HiddenConstructor._(); |
50 } | 51 } |
51 | 52 |
52 @Injectable() | 53 @InjectableTest() |
| 54 class TurboEngine implements Engine { |
| 55 String id = 'turbo-engine-id'; |
| 56 } |
| 57 |
| 58 @InjectableTest() |
| 59 class BrokenOldEngine implements Engine { |
| 60 String id = 'broken-old-engine-id'; |
| 61 } |
| 62 |
| 63 @InjectableTest() |
53 class Car { | 64 class Car { |
54 Engine engine; | 65 Engine engine; |
55 Injector injector; | 66 Injector injector; |
56 | 67 |
57 Car(this.engine, this.injector); | 68 Car(this.engine, this.injector); |
58 } | 69 } |
59 | 70 |
60 class Lemon { | 71 class Lemon { |
61 final engine; | 72 final engine; |
62 final Injector injector; | 73 final Injector injector; |
63 | 74 |
64 Lemon(this.engine, this.injector); | 75 Lemon(this.engine, this.injector); |
65 } | 76 } |
66 | 77 |
| 78 @InjectableTest() |
| 79 class Porsche { |
| 80 Engine engine; |
| 81 Injector injector; |
| 82 |
| 83 Porsche(@Turbo() this.engine, this.injector); |
| 84 } |
| 85 |
67 class NumDependency { | 86 class NumDependency { |
68 NumDependency(num value) {} | 87 NumDependency(num value) {} |
69 } | 88 } |
70 | 89 |
71 class IntDependency { | 90 class IntDependency { |
72 IntDependency(int value) {} | 91 IntDependency(int value) {} |
73 } | 92 } |
74 | 93 |
75 class DoubleDependency { | 94 class DoubleDependency { |
76 DoubleDependency(double value) {} | 95 DoubleDependency(double value) {} |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 | 130 |
112 class InterfaceOne { | 131 class InterfaceOne { |
113 } | 132 } |
114 | 133 |
115 class ClassOne implements InterfaceOne { | 134 class ClassOne implements InterfaceOne { |
116 ClassOne(Log log) { | 135 ClassOne(Log log) { |
117 log.add('ClassOne'); | 136 log.add('ClassOne'); |
118 } | 137 } |
119 } | 138 } |
120 | 139 |
121 @Injectable() | 140 @InjectableTest() |
122 class ParameterizedType<T1, T2> { | 141 class ParameterizedType<T1, T2> { |
123 ParameterizedType(); | 142 ParameterizedType(); |
124 } | 143 } |
125 | 144 |
126 @Injectable() | 145 @InjectableTest() |
127 class ParameterizedDependency { | 146 class ParameterizedDependency { |
128 final ParameterizedType<bool, int> _p; | 147 final ParameterizedType<bool, int> _p; |
129 ParameterizedDependency(this._p); | 148 ParameterizedDependency(this._p); |
130 } | 149 } |
131 | 150 |
132 @Injectable() | 151 @InjectableTest() |
133 class GenericParameterizedDependency { | 152 class GenericParameterizedDependency { |
134 final ParameterizedType _p; | 153 final ParameterizedType _p; |
135 GenericParameterizedDependency(this._p); | 154 GenericParameterizedDependency(this._p); |
136 } | 155 } |
137 | 156 |
138 @Injectable() | 157 @InjectableTest() |
139 class Log { | 158 class Log { |
140 var log = []; | 159 var log = []; |
141 | 160 |
142 add(String message) => log.add(message); | 161 add(String message) => log.add(message); |
143 } | 162 } |
144 | 163 |
| 164 @InjectableTest() |
| 165 class AnnotatedPrimitiveDependency { |
| 166 String strValue; |
| 167 AnnotatedPrimitiveDependency(@Turbo() this.strValue); |
| 168 } |
| 169 |
145 class EmulatedMockEngineFactory { | 170 class EmulatedMockEngineFactory { |
146 call(Injector i) => new MockEngine(); | 171 call(Injector i) => new MockEngine(); |
147 } | 172 } |
148 | 173 |
| 174 bool throwOnceShouldThrow = true; |
| 175 @InjectableTest() |
| 176 class ThrowOnce { |
| 177 ThrowOnce() { |
| 178 if (throwOnceShouldThrow) { |
| 179 throwOnceShouldThrow = false; |
| 180 throw ["ThrowOnce"]; |
| 181 } |
| 182 } |
| 183 } |
| 184 |
149 void main() { | 185 void main() { |
150 createInjectorSpec('DynamicInjector', | 186 createInjectorSpec('DynamicInjector', |
151 (modules, [name]) => new DynamicInjector(modules: modules, name: name)); | 187 (modules, [name]) => new DynamicInjector(modules: modules, name: name)); |
152 | 188 |
153 createInjectorSpec('StaticInjector', | 189 createInjectorSpec('StaticInjector', |
154 (modules, [name]) => new StaticInjector(modules: modules, name: name, | 190 (modules, [name]) => new StaticInjector(modules: modules, name: name, |
155 typeFactories: type_factories_gen.typeFactories)); | 191 typeFactories: type_factories_gen.typeFactories)); |
156 | 192 |
157 dynamicInjectorTest(); | 193 dynamicInjectorTest(); |
158 staticInjectorTest(); | 194 staticInjectorTest(); |
| 195 createKeySpec(); |
159 } | 196 } |
160 | 197 |
161 typedef Injector InjectorFactory(List<Module> modules, [String name]); | 198 typedef Injector InjectorFactory(List<Module> modules, [String name]); |
162 | 199 |
163 createInjectorSpec(String injectorName, InjectorFactory injectorFactory) { | 200 createInjectorSpec(String injectorName, InjectorFactory injectorFactory) { |
164 | 201 |
165 describe(injectorName, () { | 202 describe(injectorName, () { |
166 | 203 |
167 it('should instantiate a type', () { | 204 it('should instantiate a type', () { |
168 var injector = injectorFactory([new Module()..type(Engine)]); | 205 var injector = injectorFactory([new Module()..type(Engine)]); |
169 var instance = injector.get(Engine); | 206 var instance = injector.get(Engine); |
170 | 207 |
171 expect(instance, instanceOf(Engine)); | 208 expect(instance, instanceOf(Engine)); |
172 expect(instance.id, toEqual('v8-id')); | 209 expect(instance.id, toEqual('v8-id')); |
173 }); | 210 }); |
174 | 211 |
| 212 it('should instantiate an annotated type', () { |
| 213 var injector = injectorFactory([new Module() |
| 214 ..type(Engine, withAnnotation: Turbo, implementedBy: TurboEngine) |
| 215 ..value(Car, new Engine()) |
| 216 ]); |
| 217 var instance = injector.getByKey(new Key(Engine, Turbo)); |
| 218 |
| 219 expect(instance, instanceOf(TurboEngine)); |
| 220 expect(instance.id, toEqual('turbo-engine-id')); |
| 221 }); |
| 222 |
175 it('should fail if no binding is found', () { | 223 it('should fail if no binding is found', () { |
176 var injector = injectorFactory([]); | 224 var injector = injectorFactory([]); |
177 expect(() { | 225 expect(() { |
178 injector.get(Engine); | 226 injector.get(Engine); |
179 }, toThrow(NoProviderError, 'No provider found for Engine! ' | 227 }, toThrow(NoProviderError, 'No provider found for Engine! ' |
180 '(resolving Engine)')); | 228 '(resolving Engine)')); |
181 }); | 229 }); |
182 | 230 |
183 | 231 |
184 it('should resolve basic dependencies', () { | 232 it('should resolve basic dependencies', () { |
185 var injector = injectorFactory([new Module()..type(Car)..type(Engine)]); | 233 var injector = injectorFactory([new Module()..type(Car)..type(Engine)]); |
186 var instance = injector.get(Car); | 234 var instance = injector.get(Car); |
187 | 235 |
188 expect(instance, instanceOf(Car)); | 236 expect(instance, instanceOf(Car)); |
189 expect(instance.engine.id, toEqual('v8-id')); | 237 expect(instance.engine.id, toEqual('v8-id')); |
190 }); | 238 }); |
191 | 239 |
| 240 it('should resolve complex dependencies', () { |
| 241 var injector = injectorFactory([new Module() |
| 242 ..type(Porsche) |
| 243 ..type(TurboEngine) |
| 244 ..type(Engine, withAnnotation: Turbo, implementedBy: TurboEngine) |
| 245 ]); |
| 246 var instance = injector.get(Porsche); |
| 247 |
| 248 expect(instance, instanceOf(Porsche)); |
| 249 expect(instance.engine.id, toEqual('turbo-engine-id')); |
| 250 }); |
| 251 |
| 252 it('should resolve annotated primitive type', () { |
| 253 var injector = injectorFactory([new Module() |
| 254 ..type(AnnotatedPrimitiveDependency) |
| 255 ..value(String, 'Worked!', withAnnotation: Turbo) |
| 256 ]); |
| 257 var instance = injector.get(AnnotatedPrimitiveDependency); |
| 258 |
| 259 expect(instance, instanceOf(AnnotatedPrimitiveDependency)); |
| 260 expect(instance.strValue, toEqual('Worked!')); |
| 261 }); |
192 | 262 |
193 it('should inject generic parameterized types', () { | 263 it('should inject generic parameterized types', () { |
194 var injector = injectorFactory([new Module() | 264 var injector = injectorFactory([new Module() |
195 ..type(ParameterizedType) | 265 ..type(ParameterizedType) |
196 ..type(GenericParameterizedDependency) | 266 ..type(GenericParameterizedDependency) |
197 ]); | 267 ]); |
198 expect(injector.get(GenericParameterizedDependency), | 268 expect(injector.get(GenericParameterizedDependency), |
199 new isInstanceOf<GenericParameterizedDependency>()); | 269 new isInstanceOf<GenericParameterizedDependency>()); |
200 }); | 270 }); |
201 | 271 |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 '(resolving BoolDependency -> bool)')); | 384 '(resolving BoolDependency -> bool)')); |
315 | 385 |
316 expect(() { | 386 expect(() { |
317 injector.get(StringDependency); | 387 injector.get(StringDependency); |
318 }, toThrow(NoProviderError, 'Cannot inject a primitive type of String! ' | 388 }, toThrow(NoProviderError, 'Cannot inject a primitive type of String! ' |
319 '(resolving StringDependency -> String)')); | 389 '(resolving StringDependency -> String)')); |
320 }); | 390 }); |
321 | 391 |
322 | 392 |
323 it('should throw an exception when circular dependency', () { | 393 it('should throw an exception when circular dependency', () { |
324 var injector = injectorFactory([new Module()..type(CircularA)..type(Circul
arB)]); | 394 var injector = injectorFactory([new Module()..type(CircularA) |
| 395 ..type(CircularB)]); |
325 | 396 |
326 expect(() { | 397 expect(() { |
327 injector.get(CircularA); | 398 injector.get(CircularA); |
328 }, toThrow(CircularDependencyError, 'Cannot resolve a circular dependency!
' | 399 }, toThrow(CircularDependencyError, 'Cannot resolve a circular ' |
329 '(resolving CircularA -> ' | 400 'dependency! (resolving CircularA -> CircularB -> CircularA')); |
330 'CircularB -> CircularA)')); | 401 }); |
| 402 |
| 403 it('should throw an exception when circular dependency in factory', () { |
| 404 var injector = injectorFactory([new Module() |
| 405 ..factory(CircularA, (i) => i.get(CircularA)) |
| 406 ]); |
| 407 |
| 408 expect(() { |
| 409 injector.get(CircularA); |
| 410 }, toThrow(CircularDependencyError, 'Cannot resolve a ' |
| 411 'circular dependency! (resolving CircularA -> CircularA')); |
331 }); | 412 }); |
332 | 413 |
333 | 414 |
| 415 it('should recover from errors', () { |
| 416 var injector = injectorFactory([new Module()..type(ThrowOnce)]); |
| 417 throwOnceShouldThrow = true; |
| 418 |
| 419 var caught = false; |
| 420 try { |
| 421 injector.get(ThrowOnce); |
| 422 } catch (e, s) { |
| 423 caught = true; |
| 424 expect(injector.get(ThrowOnce), not(toEqual(null))); |
| 425 } |
| 426 expect(caught, toEqual(true)); |
| 427 }); |
| 428 |
| 429 |
334 it('should provide the injector as Injector', () { | 430 it('should provide the injector as Injector', () { |
335 var injector = injectorFactory([]); | 431 var injector = injectorFactory([]); |
336 | 432 |
337 expect(injector.get(Injector), toBe(injector)); | 433 expect(injector.get(Injector), toBe(injector)); |
338 }); | 434 }); |
339 | 435 |
340 | 436 |
341 it('should inject a typedef', () { | 437 it('should inject a typedef', () { |
342 var module = new Module()..value(CompareInt, compareIntAsc); | 438 var module = new Module()..value(CompareInt, compareIntAsc); |
343 | 439 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 | 472 |
377 expect(abcFromParent.id, toEqual('v8-id')); | 473 expect(abcFromParent.id, toEqual('v8-id')); |
378 expect(abcFromChild.id, toEqual('mock-id')); | 474 expect(abcFromChild.id, toEqual('mock-id')); |
379 }); | 475 }); |
380 | 476 |
381 | 477 |
382 it('should enumerate across children', () { | 478 it('should enumerate across children', () { |
383 var parent = injectorFactory([new Module()..type(Engine)]); | 479 var parent = injectorFactory([new Module()..type(Engine)]); |
384 var child = parent.createChild([new Module()..type(MockEngine)]); | 480 var child = parent.createChild([new Module()..type(MockEngine)]); |
385 | 481 |
386 expect(parent.types, unorderedEquals(new Set.from([Engine, Injector]))); | 482 expect(parent.types, unorderedEquals(new Set.from( |
387 expect(child.types, unorderedEquals(new Set.from([Engine, MockEngine, Inje
ctor]))); | 483 [Engine, Injector]))); |
| 484 expect(child.types, unorderedEquals(new Set.from( |
| 485 [Engine, MockEngine, Injector]))); |
388 }); | 486 }); |
389 | 487 |
390 | 488 |
391 it('should inject instance from parent if not provided in child', () { | 489 it('should inject instance from parent if not provided in child', () { |
392 var module = new Module()..type(Car); | 490 var module = new Module()..type(Car); |
393 | 491 |
394 var parent = injectorFactory([new Module()..type(Car)..type(Engine)]); | 492 var parent = injectorFactory([new Module()..type(Car)..type(Engine)]); |
395 var child = parent.createChild([module]); | 493 var child = parent.createChild([module]); |
396 | 494 |
397 var complexFromParent = parent.get(Car); | 495 var complexFromParent = parent.get(Car); |
(...skipping 20 matching lines...) Expand all Loading... |
418 expect(complexFromChild, toBe(complexFromParent)); | 516 expect(complexFromChild, toBe(complexFromParent)); |
419 expect(complexFromChild.engine, toBe(abcFromParent)); | 517 expect(complexFromChild.engine, toBe(abcFromParent)); |
420 expect(complexFromChild.engine, not(toBe(abcFromChild))); | 518 expect(complexFromChild.engine, not(toBe(abcFromChild))); |
421 }); | 519 }); |
422 | 520 |
423 | 521 |
424 it('should force new instance in child even if already instantiated in paren
t', () { | 522 it('should force new instance in child even if already instantiated in paren
t', () { |
425 var parent = injectorFactory([new Module()..type(Engine)]); | 523 var parent = injectorFactory([new Module()..type(Engine)]); |
426 var abcAlreadyInParent = parent.get(Engine); | 524 var abcAlreadyInParent = parent.get(Engine); |
427 | 525 |
428 var child = parent.createChild([], forceNewInstances: [Engine]); | 526 var child = parent.createChild([], forceNewInstances: [new Key(Engine)]); |
429 var abcFromChild = child.get(Engine); | 527 var abcFromChild = child.get(Engine); |
430 | 528 |
431 expect(abcFromChild, not(toBe(abcAlreadyInParent))); | 529 expect(abcFromChild, not(toBe(abcAlreadyInParent))); |
432 }); | 530 }); |
433 | 531 |
434 | 532 |
435 it('should force new instance in child using provider from grand parent', ()
{ | 533 it('should force new instance in child using provider from grand parent', ()
{ |
436 var module = new Module()..type(Engine, implementedBy: MockEngine); | 534 var module = new Module()..type(Engine, implementedBy: MockEngine); |
437 | 535 |
438 var grandParent = injectorFactory([module]); | 536 var grandParent = injectorFactory([module]); |
439 var parent = grandParent.createChild([]); | 537 var parent = grandParent.createChild([]); |
440 var child = parent.createChild([], forceNewInstances: [Engine]); | 538 var child = parent.createChild([], forceNewInstances: [new Key(Engine)]); |
441 | 539 |
442 var abcFromGrandParent = grandParent.get(Engine); | 540 var abcFromGrandParent = grandParent.get(Engine); |
443 var abcFromChild = child.get(Engine); | 541 var abcFromChild = child.get(Engine); |
444 | 542 |
445 expect(abcFromChild.id, toEqual(('mock-id'))); | 543 expect(abcFromChild.id, toEqual(('mock-id'))); |
446 expect(abcFromChild, not(toBe(abcFromGrandParent))); | 544 expect(abcFromChild, not(toBe(abcFromGrandParent))); |
447 }); | 545 }); |
448 | 546 |
449 | 547 |
450 it('should provide child injector as Injector', () { | 548 it('should provide child injector as Injector', () { |
(...skipping 11 matching lines...) Expand all Loading... |
462 | 560 |
463 | 561 |
464 it('should set the child injector name', () { | 562 it('should set the child injector name', () { |
465 var injector = injectorFactory([], 'foo'); | 563 var injector = injectorFactory([], 'foo'); |
466 var childInjector = injector.createChild(null, name: 'bar'); | 564 var childInjector = injector.createChild(null, name: 'bar'); |
467 expect(childInjector.name, 'bar'); | 565 expect(childInjector.name, 'bar'); |
468 }); | 566 }); |
469 | 567 |
470 | 568 |
471 it('should instantiate class only once (Issue #18)', () { | 569 it('should instantiate class only once (Issue #18)', () { |
472 var injector = injectorFactory([ | 570 var rootInjector = injectorFactory([]); |
| 571 var injector = rootInjector.createChild([ |
473 new Module() | 572 new Module() |
474 ..type(Log) | 573 ..type(Log) |
475 ..type(ClassOne) | 574 ..type(ClassOne) |
476 ..factory(InterfaceOne, (i) => i.get(ClassOne)) | 575 ..factory(InterfaceOne, (i) => i.get(ClassOne)) |
477 ]); | 576 ]); |
478 | 577 |
479 expect(injector.get(InterfaceOne), same(injector.get(ClassOne))); | 578 expect(injector.get(InterfaceOne), same(injector.get(ClassOne))); |
480 expect(injector.get(Log).log.join(' '), 'ClassOne'); | 579 expect(injector.get(Log).log.join(' '), 'ClassOne'); |
481 }); | 580 }); |
482 | 581 |
483 | 582 |
484 describe('creation strategy', () { | |
485 | |
486 it('should get called for instance creation', () { | |
487 | |
488 List creationLog = []; | |
489 dynamic creation(Injector requesting, Injector defining, factory) { | |
490 creationLog.add([requesting, defining]); | |
491 return factory(); | |
492 } | |
493 | |
494 var parentModule = new Module() | |
495 ..type(Engine, implementedBy: MockEngine, creation: creation) | |
496 ..type(Car, creation: creation); | |
497 | |
498 var parentInjector = injectorFactory([parentModule]); | |
499 var childInjector = parentInjector.createChild([]); | |
500 childInjector.get(Car); | |
501 expect(creationLog, [ | |
502 [childInjector, parentInjector], | |
503 [childInjector, parentInjector] | |
504 ]); | |
505 }); | |
506 | |
507 it('should be able to prevent instantiation', () { | |
508 | |
509 List creationLog = []; | |
510 dynamic creation(Injector requesting, Injector defining, factory) { | |
511 throw 'not allowing'; | |
512 } | |
513 | |
514 var module = new Module() | |
515 ..type(Engine, implementedBy: MockEngine, creation: creation); | |
516 var injector = injectorFactory([module]); | |
517 expect(() { | |
518 injector.get(Engine); | |
519 }, throwsA('not allowing')); | |
520 }); | |
521 }); | |
522 | |
523 | |
524 describe('visiblity', () { | 583 describe('visiblity', () { |
525 | 584 |
526 it('should hide instances', () { | 585 it('should hide instances', () { |
527 | 586 |
528 var rootMock = new MockEngine(); | 587 var rootMock = new MockEngine(); |
529 var childMock = new MockEngine(); | 588 var childMock = new MockEngine(); |
530 | 589 |
531 var parentModule = new Module() | 590 var parentModule = new Module() |
532 ..value(Engine, rootMock); | 591 ..value(Engine, rootMock); |
533 var childModule = new Module() | 592 var childModule = new Module() |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
577 var module = new Module()..type(HiddenConstructor); | 636 var module = new Module()..type(HiddenConstructor); |
578 var injector = new DynamicInjector(modules: [module]); | 637 var injector = new DynamicInjector(modules: [module]); |
579 | 638 |
580 expect(() { | 639 expect(() { |
581 injector.get(HiddenConstructor); | 640 injector.get(HiddenConstructor); |
582 }, toThrow(NoProviderError, startsWith('Unable to find default ' | 641 }, toThrow(NoProviderError, startsWith('Unable to find default ' |
583 'constructor for HiddenConstructor. Make sure class has a ' | 642 'constructor for HiddenConstructor. Make sure class has a ' |
584 'default constructor.'))); | 643 'default constructor.'))); |
585 }); | 644 }); |
586 | 645 |
| 646 it('should inject parameters into function and invoke it', () { |
| 647 var module = new Module() |
| 648 ..type(Engine); |
| 649 var id; |
| 650 var injector = new DynamicInjector(modules: [module]); |
| 651 injector.invoke((Engine e) => id = e.id); |
| 652 expect(id, equals('v8-id')); |
| 653 }); |
| 654 |
| 655 it('should inject annotated parameters into function and invoke it', () { |
| 656 var module = new Module() |
| 657 ..type(Engine, withAnnotation: Turbo, implementedBy: TurboEngine); |
| 658 var id; |
| 659 var injector = new DynamicInjector(modules: [module]); |
| 660 injector.invoke((@Turbo() Engine e) => id = e.id); |
| 661 expect(id, equals('turbo-engine-id')); |
| 662 }); |
| 663 |
587 }); | 664 }); |
588 } | 665 } |
589 | 666 |
590 void staticInjectorTest() { | 667 void staticInjectorTest() { |
591 describe('StaticInjector', () { | 668 describe('StaticInjector', () { |
592 | 669 |
593 it('should use type factories passed in the constructor', () { | 670 it('should use type factories passed in the constructor', () { |
594 var module = new Module() | 671 var module = new Module() |
595 ..type(Engine); | 672 ..type(Engine); |
596 var injector = new StaticInjector(modules: [module], typeFactories: { | 673 var injector = new StaticInjector(modules: [module], typeFactories: { |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 | 760 |
684 var engine; | 761 var engine; |
685 expect(() { | 762 expect(() { |
686 engine = childInjector.get(Car); | 763 engine = childInjector.get(Car); |
687 }, isNot(throws)); | 764 }, isNot(throws)); |
688 expect(engine, new isInstanceOf<Car>()); | 765 expect(engine, new isInstanceOf<Car>()); |
689 }); | 766 }); |
690 | 767 |
691 }); | 768 }); |
692 } | 769 } |
| 770 |
| 771 createKeySpec() { |
| 772 describe('Key', () { |
| 773 it('should be equal to another key if type is the same', () { |
| 774 Key k1 = new Key(Car); |
| 775 Key k2 = new Key(Car); |
| 776 expect(k1, equals(k2)); |
| 777 expect(k1.hashCode, equals(k2.hashCode)); |
| 778 }); |
| 779 |
| 780 it('should be equal to another key if type and annotation are the same', ()
{ |
| 781 Key k1 = new Key(Car, Turbo); |
| 782 Key k2 = new Key(Car, Turbo); |
| 783 expect(k1, equals(k2)); |
| 784 expect(k1.hashCode, equals(k2.hashCode)); |
| 785 }); |
| 786 |
| 787 it('should not be equal to another key if types are different', () { |
| 788 Key k1 = new Key(Car); |
| 789 Key k2 = new Key(Porsche); |
| 790 expect(k1, not(equals(k2))); |
| 791 expect(k1.hashCode, not(equals(k2.hashCode))); |
| 792 }); |
| 793 |
| 794 it('should not be equal to another key if annotations are different', () { |
| 795 Key k1 = new Key(Car, Turbo); |
| 796 Key k2 = new Key(Car, Old); |
| 797 expect(k1, not(equals(k2))); |
| 798 expect(k1.hashCode, not(equals(k2.hashCode))); |
| 799 }); |
| 800 |
| 801 it('should not be equal to another key if type is different and annotation' |
| 802 ' is same', () { |
| 803 Key k1 = new Key(Engine, Old); |
| 804 Key k2 = new Key(Car, Old); |
| 805 expect(k1, not(equals(k2))); |
| 806 expect(k1.hashCode, not(equals(k2.hashCode))); |
| 807 }); |
| 808 }); |
| 809 } |
OLD | NEW |