/**
Contains functions that are used while running unittests.
*/
module declui.testing;

import declui.backend;
import declui.components;

import std.format;
import std.traits;
import std.typecons;

/**
A backend that automatically stubs out every instantiation method.
*/
class TestingBackend : ToolkitBackend
{
	override void run(string[] args, IWindow window)
	{
		assert(0, "Run is not supported during testing");
	}

	static foreach (member; __traits(derivedMembers, ToolkitBackend))
	{
		static if (member != "run")
		{
			mixin(format!`
				%s %s()
				{
					return createMockInstance!(%s);
				}
				`(
				fullyQualifiedName!(ReturnType!(__traits(getMember, ToolkitBackend, member))),
				member,
				fullyQualifiedName!(ReturnType!(__traits(getMember, ToolkitBackend, member))))
			);
		}
	}
}

private abstract class AutoMock(Type) : Type
{
	override IComponent getInternal() pure
	{
		return this;
	}
}

private Type createMockInstance(Type)()
{
	return new BlackHole!(Type);
}