1 /// Additonal tests, with no global imports.
2 module elemi.tests;
3 
4 // Of course, in practice, you should never mix elemH and elemX in the same document. We do this here to simplify the
5 // tests.
6 
7 pure @safe unittest {
8 
9     import elemi.xml;
10     import elemi.html : elemH, addH;
11 
12     assert(elem!"div/" == "<div/>");
13     assert(elem!"input" == "<input></input>");
14 
15     assert(
16         elem!"meta"
17             .add!"br"("This is not HTML")
18             .addH!"br"
19         == "<meta><br>This is not HTML</br><br/></meta>"
20     );
21 
22 }
23 
24 pure @safe unittest {
25 
26     import elemi.html;
27 
28     assert(
29         elem!"div"(
30             elem!"br",
31             elem!"input",
32         )
33             .add!"br",
34     );
35 
36 }
37 
38 pure @safe unittest {
39 
40     import elemi;
41 
42     assert(
43         elem!"div"(
44             elem!"br",
45             elemX!"br"("I don't care about HTML limitations!"),
46             elemX!"div /",
47         )
48         == "<div><br/><br>I don&#39;t care about HTML limitations!</br><div/></div>"
49     );
50 
51 }
52 
53 // Impure ranges
54 version (unittest) int impure;
55 @safe unittest {
56 
57     import elemi;
58     import std.conv, std.range, std.algorithm;
59 
60     auto range = [1, 2, 3]
61         .tee!(item => impure += item)
62         .map!(item => elem!"number"(item.to!string));
63 
64     assert(elemH!"list"(range) == "<list><number>1</number><number>2</number><number>3</number></list>");
65     assert(elemX!"list"(range) == elemH!"list"(range));
66     assert(impure == 6*3);
67 
68     bool ran;
69 
70     () pure {
71 
72         assert(!__traits(compiles, elem!"list"(range)));
73         assert( __traits(compiles, elem!"list"("1")));
74 
75         assert(!__traits(compiles, elemX!"list"(range)));
76         assert( __traits(compiles, elemX!"list"("1")));
77 
78         ran = true;
79 
80     }();
81 
82     // Just to make sure
83     assert(ran);
84 
85 }
86 
87 // @system ranges
88 @system unittest {
89 
90     import elemi;
91     import std.conv, std.range, std.algorithm;
92 
93     int value;
94 
95     void increment() @system {
96 
97         value++;
98 
99     }
100 
101     auto range = [1, 2, 3]
102         .tee!(item => increment)
103         .map!(item => elem!"number"(item.to!string));
104 
105     assert(elemH!"list"(range) == "<list><number>1</number><number>2</number><number>3</number></list>");
106     assert(elemX!"list"(range) == elemH!"list"(range));
107     assert(value == 3*3);
108 
109     bool ran;
110 
111     () @safe {
112 
113         assert(!__traits(compiles, elem!"list"(range)));
114         assert( __traits(compiles, elem!"list"("1")));
115 
116         assert(!__traits(compiles, elemX!"list"(range)));
117         assert( __traits(compiles, elemX!"list"("1")));
118 
119         ran = true;
120 
121     }();
122 
123     assert(ran);
124 
125 }
126 
127 /// CTFE usage
128 unittest {
129 
130     import elemi;
131 
132     enum document = elem!"p"("<stuff>");
133 
134     assert(cast(string) document == cast(string) elem!"p"("<stuff>"));
135 
136 }