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'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 }