1 module ut.meta.functions; 2 3 4 import ut.meta; 5 import std.meta: AliasSeq; 6 7 8 @("functions.bySymbol") 9 @safe pure unittest { 10 alias mod = Module!("modules.functions"); 11 import modules.functions; 12 13 alias expected = AliasSeq!( 14 FunctionSymbol!(add1, Protection.public_, Linkage.D), 15 FunctionSymbol!(withDefault, Protection.public_, Linkage.D), 16 FunctionSymbol!(storageClasses, Protection.public_, Linkage.D), 17 FunctionSymbol!(exportedFunc, Protection.export_, Linkage.D), 18 FunctionSymbol!(externC, Protection.public_, Linkage.C), 19 FunctionSymbol!(externCpp, Protection.public_, Linkage.Cpp), 20 FunctionSymbol!(identityInt, Protection.public_, Linkage.D, "identityInt", modules.functions), 21 ); 22 23 // pragma(msg, "\n", mod.FunctionsBySymbol.stringof, "\n"); 24 shouldEqual!(mod.FunctionsBySymbol, expected); 25 26 static assert(mod.FunctionsBySymbol[0].overloads.length == 2); // add1 27 static foreach(i; 1..expected.length) 28 static assert(mod.FunctionsBySymbol[i].overloads.length == 1); // everything else 29 } 30 31 32 @("functions.byOverload") 33 @safe pure unittest { 34 alias mod = Module!("modules.functions"); 35 import modules.functions; 36 37 alias add1Int = __traits(getOverloads, modules.functions, "add1")[0]; 38 alias add1Double = __traits(getOverloads, modules.functions, "add1")[1]; 39 40 alias expected = AliasSeq!( 41 FunctionOverload!(add1Int, Protection.public_, Linkage.D), 42 FunctionOverload!(add1Double, Protection.public_, Linkage.D), 43 FunctionOverload!(withDefault, Protection.public_, Linkage.D), 44 FunctionOverload!(storageClasses, Protection.public_, Linkage.D), 45 FunctionOverload!(exportedFunc, Protection.export_, Linkage.D), 46 FunctionOverload!(externC, Protection.public_, Linkage.C), 47 FunctionOverload!(externCpp, Protection.public_, Linkage.Cpp), 48 FunctionOverload!(identityInt, Protection.public_, Linkage.D, "identityInt", modules.functions), 49 ); 50 51 // pragma(msg, "\n", mod.FunctionsByOverload.stringof, "\n"); 52 shouldEqual!(mod.FunctionsByOverload, expected); 53 } 54 55 56 @("problems") 57 @safe pure unittest { 58 alias mod = Module!("modules.problems"); 59 static assert(mod.FunctionsBySymbol.length == 0, mod.FunctionsBySymbol.stringof); 60 } 61 62 63 64 @("parameters.add1.bySymbol") 65 @safe pure unittest { 66 67 alias mod = Module!("modules.functions"); 68 alias add1Int = mod.FunctionsBySymbol[0].overloads[0]; 69 alias add1Double = mod.FunctionsBySymbol[0].overloads[1]; 70 alias withDefaults = mod.FunctionsBySymbol[1].overloads[0]; 71 72 shouldEqual!( 73 add1Int.parameters, 74 AliasSeq!( 75 Parameter!(int, void, "i"), 76 Parameter!(int, void, "j"), 77 ) 78 ); 79 80 shouldEqual!( 81 add1Double.parameters, 82 AliasSeq!( 83 Parameter!(double, void, "d0"), 84 Parameter!(double, void, "d1"), 85 ) 86 ); 87 88 shouldEqual!( 89 withDefaults.parameters, 90 AliasSeq!( 91 Parameter!(double, void, "fst"), 92 Parameter!(double, 33.3, "snd"), 93 ) 94 ); 95 } 96 97 98 @("parameters.add1.byOverload") 99 @safe pure unittest { 100 alias mod = Module!("modules.functions"); 101 alias add1Int = mod.FunctionsByOverload[0]; 102 alias add1Double = mod.FunctionsByOverload[1]; 103 104 shouldEqual!( 105 add1Int.parameters, 106 AliasSeq!( 107 Parameter!(int, void, "i"), 108 Parameter!(int, void, "j"), 109 ) 110 ); 111 112 shouldEqual!( 113 add1Double.parameters, 114 AliasSeq!( 115 Parameter!(double, void, "d0"), 116 Parameter!(double, void, "d1"), 117 ) 118 ); 119 } 120 121 122 123 @("return.bySymbol") 124 @safe pure unittest { 125 import std.meta: staticMap; 126 127 alias mod = Module!("modules.functions"); 128 alias functions = mod.FunctionsBySymbol; 129 130 static assert(is(functions[0].overloads[0].ReturnType == int)); 131 static assert(is(functions[0].overloads[1].ReturnType == double)); 132 static assert(is(functions[1].overloads[0].ReturnType == double)); 133 static assert(is(functions[2].overloads[0].ReturnType == void)); 134 } 135 136 137 @("return.byOverload") 138 @safe pure unittest { 139 import std.meta: staticMap; 140 141 alias mod = Module!("modules.functions"); 142 alias return_(alias F) = F.ReturnType; 143 alias returnTypes = staticMap!(return_, mod.FunctionsByOverload); 144 145 shouldEqual!( 146 returnTypes, 147 AliasSeq!( 148 int, double, double, void, void, void, void, int, 149 ), 150 ); 151 }