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 }