Panagiotis Christopoulos Charitos 13 years ago
parent
commit
9f851d18b3

+ 0 - 6
CMakeLists.txt

@@ -172,12 +172,6 @@ OPTION(BUILD_TESTS "Build Unit Tests" OFF)
 
 IF(BUILD_TESTS)
 	ENABLE_TESTING()
-	
-	SET(GTEST_INCLUDE_DIR "/usr/include" CACHE PATH "The directory that contains the gtest directory")
-	SET(GTEST_LIBRARY_DIR "/usr/lib" CACHE PATH "The directory that contains the libgtest.so")
-
-	ANKI_ADD_LIB(${GTEST_INCLUDE_DIR} ${GTEST_LIBRARY_DIR} ${GTEST_INCLUDE_DIR}/gtest/gtest.h)
-	
 	ADD_SUBDIRECTORY(tests)
 ENDIF()
 

+ 3 - 3
tests/CMakeLists.txt

@@ -1,7 +1,7 @@
 FILE(GLOB_RECURSE TESTS_SOURCES *.cpp)
 FILE(GLOB_RECURSE TESTS_HEADERS *.h)
 
-ADD_EXECUTABLE(tests ${TESTS_SOURCES} ${TESTS_HEADERS})
-TARGET_LINK_LIBRARIES(tests anki gtest)
+ADD_EXECUTABLE(anki_tests ${TESTS_SOURCES} ${TESTS_HEADERS})
+TARGET_LINK_LIBRARIES(anki_tests anki)
 
-INSTALL(TARGETS tests DESTINATION "${CMAKE_INSTALL_PREFIX}/tests")
+INSTALL(TARGETS anki_tests DESTINATION "${CMAKE_INSTALL_PREFIX}/tests")

+ 3 - 10
tests/Main.cpp

@@ -1,15 +1,8 @@
-#include <gtest/gtest.h>
-#include "App.h"
-#include "MainRenderer.h"
-#include "RendererInitializer.h"
+#include "tests/framework/Framework.h"
 
+using namespace anki;
 
 int main(int argc, char** argv)
 {
-	// Init app
-	//AppSingleton::get().init(0, NULL);
-
-	// Tests
-	::testing::InitGoogleTest(&argc, argv);
-	return RUN_ALL_TESTS();
+	return TesterSingleton::get().runAll();
 }

+ 66 - 0
tests/framework/Framework.cpp

@@ -0,0 +1,66 @@
+#include "tests/framework/Framework.h"
+#include <iostream>
+
+namespace anki {
+
+//==============================================================================
+void Tester::addTest(const char* name, const char* suiteName,
+	TestCallback callback)
+{
+	PtrVector<TestSuite>::iterator it;
+	for(it = suites.begin(); it != suites.end(); it++)
+	{
+		if((*it)->name == suiteName)
+		{
+			break;
+		}
+	}
+
+	// Not found
+	TestSuite* suite = nullptr;
+	if(it == suites.end())
+	{
+		suite = new TestSuite;
+		suite->name = suiteName;
+		suites.push_back(suite);
+	}
+	else
+	{
+		suite = *it;
+	}
+
+	// Sanity check
+	PtrVector<Test>::iterator it1;
+	for(it1 = suite->tests.begin(); it1 != suite->tests.end(); it1++)
+	{
+		if((*it)->name == name)
+		{
+			std::cerr << "Test already exists: " << name << std::endl;
+			return;
+		}
+	}
+
+	// Add the test
+	Test* test = new Test;
+	suite->tests.push_back(test);
+	test->name = name;
+	test->suite = suite;
+	test->callback = callback;
+}
+
+//==============================================================================
+int Tester::runAll()
+{
+	int errors = 0;
+	for(TestSuite* suite : suites)
+	{
+		for(Test* test : suite->tests)
+		{
+			test->callback(*test);
+		}
+	}
+
+	return errors;
+}
+
+} // end namespace anki

+ 60 - 0
tests/framework/Framework.h

@@ -0,0 +1,60 @@
+#ifndef ANKI_TESTS_FRAMEWORK_TESTER_H
+#define ANKI_TESTS_FRAMEWORK_TESTER_H
+
+#include "anki/util/Vector.h"
+#include "anki/util/Singleton.h"
+#include <string>
+#include <iostream>
+
+namespace anki {
+
+class TestSuite;
+class Test;
+class Tester;
+
+typedef void (*TestCallback)(Test&);
+
+struct TestSuite
+{
+	std::string name;
+	PtrVector<Test> tests;
+};
+
+struct Test
+{
+	std::string name;
+	TestSuite* suite = nullptr;
+	TestCallback callback = nullptr;
+};
+
+struct Tester
+{
+	PtrVector<TestSuite> suites;
+
+	void addTest(const char* name, const char* suite, TestCallback callback);
+
+	int runAll();
+};
+
+typedef Singleton<Tester> TesterSingleton;
+
+//==============================================================================
+// Macros
+
+#define ANKI_TEST(suiteName_, name_) \
+	using namespace anki; \
+	void test_##suiteName_##name_(Test&); \
+	\
+	struct Foo##suiteName_##name_ { \
+		Foo##suiteName_##name_() { \
+			TesterSingleton::get().addTest(#suiteName_, #name_, \
+				test_##suiteName_##name_); \
+		} \
+	}; \
+	static Foo##suiteName_##name_ lala; \
+	void test_##suiteName_##name_(Test&)
+
+
+} // end namespace anki
+
+#endif

+ 7 - 3
tests/util/HighRezTimer.ut.cpp → tests/util/HighRezTimer.cpp

@@ -1,8 +1,7 @@
+#include "tests/framework/Framework.h"
 #include "anki/util/HighRezTimer.h"
-#include <gtest/gtest.h>
 
-
-TEST(HighRezTimer, Test)
+/*TEST(HighRezTimer, Test)
 {
 	HighRezTimer t;
 	t.start();
@@ -20,4 +19,9 @@ TEST(HighRezTimer, Test)
 	sleep(1);
 	
 	EXPECT_EQ(t.getElapsedTime(), 4.0);
+}*/
+
+ANKI_TEST(Suite, TestName)
+{
+	std::cout << "asdfffffffffffffffffffffffff" << std::endl;
 }

+ 0 - 9
tests/util/Object.cpp

@@ -1,9 +0,0 @@
-#include <anki/util/Object.h>
-#include <gtest/gtest.h>
-
-
-TEST(Object, All)
-{
-	/// XXX
-}
-

+ 0 - 99
tests/util/Scanner.ut.cpp

@@ -1,99 +0,0 @@
-#include "anki/util/Scanner.h"
-#include <gtest/gtest.h>
-#include <sstream>
-#include <iostream>
-#include <memory>
-
-
-TEST(Scanner, Numbers)
-{
-	std::stringstream ss;	
-	ss << "12345678901234 1.12 0.00000000000001 0.01e1 1e- 10.123e-7 1ab";
-
-	std::auto_ptr<scanner::Scanner> scanner_;
-	const scanner::Token* token;
-	
-	EXPECT_NO_THROW(scanner_.reset(new scanner::Scanner(ss, "numbers")));
-	scanner::Scanner& scanner = *scanner_;
-
-	// 12345678901234
-	EXPECT_NO_THROW(token = &scanner.getNextToken());
-	EXPECT_EQ(token->getCode(), scanner::TC_NUMBER);	
-	EXPECT_EQ(token->getDataType(), scanner::DT_INT);	
-	EXPECT_EQ(token->getValue().getInt(), 12345678901234);
-	
-	// 1.12
-	EXPECT_NO_THROW(token = &scanner.getNextToken());
-	EXPECT_EQ(token->getCode(), scanner::TC_NUMBER);	
-	EXPECT_EQ(token->getDataType(), scanner::DT_FLOAT);	
-	EXPECT_FLOAT_EQ(token->getValue().getFloat(), 1.12);
-	
-	// 0.00000000000001
-	EXPECT_NO_THROW(token = &scanner.getNextToken());
-	EXPECT_EQ(token->getCode(), scanner::TC_NUMBER);	
-	EXPECT_EQ(token->getDataType(), scanner::DT_FLOAT);	
-	EXPECT_FLOAT_EQ(token->getValue().getFloat(), 0.00000000000001);
-	
-	// 0.01e1
-	EXPECT_NO_THROW(token = &scanner.getNextToken());
-	EXPECT_EQ(token->getCode(), scanner::TC_NUMBER);	
-	EXPECT_EQ(token->getDataType(), scanner::DT_FLOAT);	
-	EXPECT_FLOAT_EQ(token->getValue().getFloat(), 0.01e1);
-	
-	// 1e-
-	EXPECT_ANY_THROW(token = &scanner.getNextToken());
-	
-	// 10.123e-7
-	EXPECT_NO_THROW(token = &scanner.getNextToken());
-	EXPECT_EQ(token->getCode(), scanner::TC_NUMBER);	
-	EXPECT_EQ(token->getDataType(), scanner::DT_FLOAT);	
-	EXPECT_FLOAT_EQ(token->getValue().getFloat(), 10.123e-7);
-	
-	// 1ab
-	EXPECT_ANY_THROW(token = &scanner.getNextToken());
-	
-	// EOF
-	EXPECT_NO_THROW(token = &scanner.getNextToken());
-	EXPECT_EQ(token->getCode(), scanner::TC_END);
-}
-
-
-TEST(Scanner, Identifiers)
-{
-	std::stringstream ss;	
-	ss << "1 la0_la ha\n_ha";
-
-	std::auto_ptr<scanner::Scanner> scanner_;
-	const scanner::Token* token;
-	
-	EXPECT_NO_THROW(scanner_.reset(new scanner::Scanner(ss, "identifiers")));
-	scanner::Scanner& scanner = *scanner_;
-	
-	// 1
-	EXPECT_NO_THROW(token = &scanner.getNextToken());
-	EXPECT_NE(token->getCode(), scanner::TC_IDENTIFIER);
-	
-	// la_la
-	EXPECT_NO_THROW(token = &scanner.getNextToken());
-	EXPECT_EQ(token->getCode(), scanner::TC_IDENTIFIER);	
-	EXPECT_EQ(token->getValue().getString(), std::string("la0_la"));
-	
-	// ha
-	EXPECT_NO_THROW(token = &scanner.getNextToken());
-	EXPECT_EQ(token->getCode(), scanner::TC_IDENTIFIER);	
-	EXPECT_EQ(token->getValue().getString(), std::string("ha"));
-	
-	// _ha
-	EXPECT_NO_THROW(token = &scanner.getNextToken());
-	EXPECT_EQ(token->getCode(), scanner::TC_IDENTIFIER);	
-	EXPECT_EQ(token->getValue().getString(), std::string("_ha"));
-	
-	// EOF
-	EXPECT_NO_THROW(token = &scanner.getNextToken());
-	EXPECT_EQ(token->getCode(), scanner::TC_END);
-}
-
-
-
-
-