module feature_test.shoulds.core;

debug (featureTest) {
	import std.string;
	import feature_test.exceptions;

	template should(alias operation, string description) {
		bool should(E)(lazy E expression, string name="Value", string file = __FILE__, typeof(__LINE__) line = __LINE__) {
			auto eValue = expression;
			if (operation(eValue)) return true;
			throw new FeatureTestException(format("%s should %s, but it was %s", name, description, eValue), file, line);
		}
	}
	
	template shouldValue(alias operation, string description) {
		bool shouldValue(E, V)(lazy E expression, V value, string name="Value", string file = __FILE__, typeof(__LINE__) line = __LINE__) {
			auto eValue = expression;
			if (operation(eValue, value)) return true;
			throw new FeatureTestException(format("%s should %s %s, but was actually %s", name, description, value, eValue), file, line);
		}
	}
	
	alias shouldBeTrue = should!((e) => e ? true : false, "be true");
	alias shouldBeFalse = should!((e) => e ? false : true, "be false");
	alias shouldEqual = shouldValue!((e, v) => e == v, "equal");
	alias shouldBeGreaterThan = shouldValue!((e, v) => e > v, "be greater than");
	alias shouldBeLessThan = shouldValue!((e, v) => e < v, "be less than");
	alias shouldNotBeEmpty = should!((e) => e.length ? true : false, "not be empty");
}