forked from dolphin-emu/dolphin
		
	git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4 8ced0084-cf51-0410-be5f-012b33b47a6e
		
			
				
	
	
		
			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
 |