1 module tests.template_register;
2 
3 import std.stdio;
4 import std.array;
5 import unit_threaded;
6 
7 import tests.utils;
8 import endovena;
9 
10 interface IQueue(T) {
11    void enqueue(T value);
12    T dequeue();
13 }
14 
15 class Queue(T): IQueue!(T) {
16    private T[] data;
17 
18    void enqueue(T value) {
19       this.data ~= value;
20    }
21 
22    T dequeue() {
23       T x = this.data.front();
24       this.data.popFront();
25       return x;
26    }
27 }
28 
29 interface IQueueClient(T) {
30    @property IQueue!T service();
31 }
32 
33 class QueueClient(T): IQueueClient!T {
34    public this(IQueue!T service) {
35       _service = service;
36    }
37    private IQueue!T _service;
38    @property IQueue!T service() { return _service; }
39 }
40 
41 
42 @UnitTest
43 void register_as_types() {
44    Container container = new Container;
45 
46    container.register!(IQueue!int, Queue!int)();
47    container.register!(IQueueClient!int, QueueClient!int)();
48 
49    auto q = container.get!(IQueue!int)();
50    q.instanceof!(Queue!int).shouldBeTrue;
51 
52    auto client = container.get!(IQueueClient!int)();
53    client.shouldNotBeNull;
54    client
55       .instanceof!(QueueClient!int)
56       .shouldBeTrue;
57 
58    client.service
59       .instanceof!(Queue!int)
60       .shouldBeTrue;
61 }
62 /*
63 template Foo(bool numeric) {
64    static if (numeric) {
65       alias Type = int;
66    } else {
67       alias Type = string;
68    }
69    //enum x = Concat();
70 
71    class Concat {
72       string con(Type a) {
73          return a.stringof;
74       }
75    }
76 }
77 
78 @UnitTest
79 void register_template() {
80    auto c = new Foo!(true).Concat;
81    c.con(3).shouldEqual("int");
82    //Container container = new Container;
83    //container.register!(IQueue!int, Queue!int)();
84 } 
85 */