1 /**
2 Contains functions that are used while running unittests.
3 */
4 module declui.testing;
5 
6 import declui.backend;
7 import declui.components;
8 
9 import std.format;
10 import std.traits;
11 import std.typecons;
12 
13 /**
14 A backend that automatically stubs out every instantiation method.
15 */
16 class TestingBackend : ToolkitBackend, ToolkitWidgets
17 {
18 	override void run(string[] args, IWindow window)
19 	{
20 		assert(0, "Run is not supported during testing");
21 	}
22 
23 	override ToolkitWidgets getWidgets()
24 	{
25 		return this;
26 	}
27 
28 	static foreach (member; __traits(derivedMembers, ToolkitWidgets))
29 	{
30 		static if (member != "run")
31 		{
32 			mixin(format!`
33 				%s %s()
34 				{
35 					return createMockInstance!(%s);
36 				}
37 				`(
38 				fullyQualifiedName!(ReturnType!(__traits(getMember, ToolkitWidgets, member))),
39 				member,
40 				fullyQualifiedName!(ReturnType!(__traits(getMember, ToolkitWidgets, member))))
41 			);
42 		}
43 	}
44 }
45 
46 private abstract class AutoMock(Type) : Type
47 {
48 	override IComponent getInternal() pure
49 	{
50 		return this;
51 	}
52 }
53 
54 private Type createMockInstance(Type)()
55 {
56 	return new BlackHole!(Type);
57 }