1 /* 2 * Hunt - A refined core library for D programming language. 3 * 4 * Copyright (C) 2018-2019 HuntLabs 5 * 6 * Website: https://www.huntlabs.net/ 7 * 8 * Licensed under the Apache-2.0 License. 9 * 10 */ 11 12 module hunt.util.UnitTest; 13 14 void testUnits(T)() { 15 enum v = generateUnitTests!T; 16 // pragma(msg, v); 17 mixin(v); 18 } 19 20 string generateUnitTests(T)() { 21 import std.string; 22 import std.algorithm; 23 import std.traits; 24 25 enum fullTypeName = fullyQualifiedName!(T); 26 enum memberModuleName = moduleName!(T); 27 28 string str; 29 str ~= `import std.stdio; 30 writeln("================================="); 31 writeln("testing ` ~ fullTypeName ~ ` "); 32 writeln("================================="); 33 34 `; 35 str ~= "import " ~ memberModuleName ~ ";\n"; 36 str ~= "auto t = new " ~ T.stringof ~ "();\n"; 37 38 foreach (memberName; __traits(derivedMembers, T)) { 39 // pragma(msg, "member: " ~ memberName); 40 enum memberProtection = __traits(getProtection, __traits(getMember, T, memberName)); 41 static if (memberProtection == "private" 42 || memberProtection == "protected" 43 || memberProtection == "export") { 44 // version (HUNT_DEBUG) pragma(msg, "skip private member: " ~ memberName); 45 } else { 46 import std.meta : Alias; 47 alias currentMember = Alias!(__traits(getMember, T, memberName)); 48 static if (memberName.startsWith("test") 49 || memberName.endsWith("Test") 50 || hasUDA!(currentMember, Test)) { 51 alias memberType = typeof(currentMember); 52 static if (is(memberType == function)) { 53 str ~= `writeln("\n========> running: ` ~ memberName ~ "\");\n"; 54 str ~= "t." ~ memberName ~ "();\n"; 55 } 56 } 57 } 58 } 59 return str; 60 } 61 62 /** 63 */ 64 struct Test { 65 TypeInfo expected; 66 }