forked from dolphin-emu/dolphin
		
	
		
			
	
	
		
			101 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			101 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | // Stupidly simple automated testing framework
 | ||
|  | // by ector
 | ||
|  | 
 | ||
|  | // licence: Public Domain
 | ||
|  | 
 | ||
|  | // If TESTING_ENABLE is true, all tests across the project will run before main().
 | ||
|  | // If it's false, all tests will be destroyed by the linker, hopefully.
 | ||
|  | 
 | ||
|  | // Unfortunately, MSVC:s library linker seems to kill off unreferenced objects, even if the
 | ||
|  | // initialization has side effects. This makes this framework not work properly :(
 | ||
|  | // TODO(ector): Find solution.
 | ||
|  | 
 | ||
|  | // TODO(ector): make sure tests are destroyed and that things compile without TESTING_ENABLE :P
 | ||
|  | 
 | ||
|  | #define TESTING_ENABLE
 | ||
|  | 
 | ||
|  | #ifndef _TEST_FRAMEWORK_H
 | ||
|  | #define _TEST_FRAMEWORK_H
 | ||
|  | 
 | ||
|  | #include "Common.h"
 | ||
|  | #include <stdio.h>
 | ||
|  | 
 | ||
|  | #ifdef TESTING_ENABLE
 | ||
|  | 
 | ||
|  | namespace __test | ||
|  | { | ||
|  | extern int numTests; | ||
|  | extern int numTestsFailed; | ||
|  | } | ||
|  | 
 | ||
|  | struct TestRunnah | ||
|  | { | ||
|  | 	const char* filename; | ||
|  | 	const char* function; | ||
|  | 	TestRunnah(const char* _filename, const char* _function) | ||
|  | 		: filename(_filename), function(_function) {} | ||
|  | 
 | ||
|  | 
 | ||
|  | 	bool AssertTrue(bool value, int line) | ||
|  | 	{ | ||
|  | 		if (!value) | ||
|  | 		{ | ||
|  | 			char string[256]; | ||
|  | 			sprintf(string, "%s:%s:%i: %s", filename, function, line, "failed"); | ||
|  | 			PanicAlert("Test Results: %s", string); | ||
|  | 			TestFailed(); | ||
|  | 			return(false); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return(true); | ||
|  | 	} | ||
|  | 
 | ||
|  | 
 | ||
|  | 	template<class T> | ||
|  | 	bool AssertEqual(T a, T b, int line) | ||
|  | 	{ | ||
|  | 		if (!(a == b)) | ||
|  | 		{ | ||
|  | 			// TODO(ector) : better output
 | ||
|  | 			char string[256]; | ||
|  | 			sprintf(string, "%s:%s:%i: %s", filename, function, line, "failed"); | ||
|  | 			PanicAlert("Test Results: %s", string); | ||
|  | 			TestFailed(); | ||
|  | 			return(false); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 
 | ||
|  | 	void TestFailed() | ||
|  | 	{ | ||
|  | 		__test::numTestsFailed++; | ||
|  | 	} | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | #define TEST(a)	\
 | ||
|  | 	void TEST_ ## a(TestRunnah * __tr); \ | ||
|  | 	struct DUMMY_ ## a \ | ||
|  | 		: public TestRunnah { \ | ||
|  | 		DUMMY_ ## a() \ | ||
|  | 			: TestRunnah(__FILE__, # a) {\ | ||
|  | 			TEST_ ## a(this); __test::numTests++;} }; \ | ||
|  | 	DUMMY_ ## a ddummy_ ## a; \ | ||
|  | 	void TEST_ ## a(TestRunnah * __tr) | ||
|  | 
 | ||
|  | #else // TESTING_ENABLE
 | ||
|  | 
 | ||
|  | #define TEST(a)	\
 | ||
|  | 	void TEST_ ## a(TestRunnah * __tr) \ | ||
|  | 
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #define CHECK(a) if (!__tr->AssertTrue(a, __LINE__)){return;}
 | ||
|  | #define CHECK_EQ(a, b) if (!__tr->AssertEqual(a, b, __LINE__)){return;}
 | ||
|  | 
 | ||
|  | int GetNumTests(); | ||
|  | int GetNumTestsFailed(); | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif
 |