diff --git a/dub.json b/dub.json index 1df36ba..3bf07c4 100755 --- a/dub.json +++ b/dub.json @@ -17,7 +17,7 @@ }, { "name" : "tests", - "sourcePaths" : ["source\/","tests\/"], + "sourceFiles" : ["tests/tests.d"], "targetType" : "executable", "excludedSourceFiles":[ "source\/win_dll.d" @@ -91,11 +91,11 @@ "dflags": [ "-betterC" ], - "sourceFiles":[ - "tests/runner.d" - ], + "sourcePaths": ["source/","tests/"], + "mainSourceFile":"tests/runner.d", "excludedSourceFiles":[ - "source\/win_dll.d" + "source\/win_dll.d", + "tests/tests.d" ] } diff --git a/source/ecs/id_manager.d b/source/ecs/id_manager.d index 475eb94..4f5a949 100644 --- a/source/ecs/id_manager.d +++ b/source/ecs/id_manager.d @@ -253,35 +253,3 @@ private: align(64) shared uint m_last_id = 0; align(64) shared int m_stack_top = -1; } - -unittest -{ - IDManager manager; - manager.initialize(); - EntityID id1 = manager.getNewID(); - EntityID id2 = manager.getNewID(); - EntityID id3 = manager.getNewID(); - - assert(id1 == EntityID(1, 0)); - assert(id2 == EntityID(2, 0)); - assert(id3 == EntityID(3, 0)); - - manager.optimize(); - manager.releaseID(id2); - manager.releaseID(id1); - - id2 = manager.getNewID(); - id1 = manager.getNewID(); - - Entity e; - e.id = id3; - manager.update(e); - - assert(id1 == EntityID(2, 1)); - assert(id2 == EntityID(1, 1)); - assert(id3 == EntityID(3, 0)); - assert(manager.isExist(id3)); - assert(!manager.isExist(EntityID(1, 0))); - assert(!manager.isExist(EntityID(0, 0))); - manager.deinitialize(); -} diff --git a/tests/basic.d b/tests/basic.d new file mode 100644 index 0000000..c359fe3 --- /dev/null +++ b/tests/basic.d @@ -0,0 +1,2 @@ +module tests.basic; + diff --git a/tests/id_manager.d b/tests/id_manager.d new file mode 100644 index 0000000..6601582 --- /dev/null +++ b/tests/id_manager.d @@ -0,0 +1,36 @@ +module tests.id_manager; + +import ecs.id_manager; +import ecs.entity; + +unittest +{ + IDManager manager; + manager.initialize(); + EntityID id1 = manager.getNewID(); + EntityID id2 = manager.getNewID(); + EntityID id3 = manager.getNewID(); + + assert(id1 == EntityID(1, 0)); + assert(id2 == EntityID(2, 0)); + assert(id3 == EntityID(3, 0)); + + manager.optimize(); + manager.releaseID(id2); + manager.releaseID(id1); + + id2 = manager.getNewID(); + id1 = manager.getNewID(); + + Entity e; + e.id = id3; + manager.update(e); + + assert(id1 == EntityID(2, 1)); + assert(id2 == EntityID(1, 1)); + assert(id3 == EntityID(3, 0)); + assert(manager.isExist(id3)); + assert(!manager.isExist(EntityID(1, 0))); + assert(!manager.isExist(EntityID(0, 0))); + manager.deinitialize(); +} \ No newline at end of file diff --git a/tests/runner.d b/tests/runner.d index 2b8597f..9271d7c 100644 --- a/tests/runner.d +++ b/tests/runner.d @@ -16,9 +16,9 @@ unittest enum int ASSERTED = 123; enum string OUT_FILE = "test_report.xml"; -__gshared jmp_buf gEnvBuffer; -__gshared TestSuite[2] gSuites; -__gshared AssertInfo gAssertInfo; +static jmp_buf gEnvBuffer; +//__gshared TestSuite[4] gSuites; +static AssertInfo gAssertInfo; struct AssertInfo { @@ -47,6 +47,8 @@ struct Test struct TestSuite { string name; + uint passed = 0; + uint failed = 0; Vector!Test tests; } @@ -193,15 +195,89 @@ void addTestSuite(alias testModule)(ref TestSuite suite) } } -void main() +struct TestRunner(Args...) { - addTestSuite!(tests.runner)(gSuites[0]); - addTestSuite!(ecs.id_manager)(gSuites[1]); + TestSuite[Args.length] suites; + uint passed = 0; + uint failed = 0; - writeTests(gSuites); // Save results in case that there are no tests + void runTests() + { + foreach(i, module_; Args) + { + TestSuite* suite = &suites[i]; + suite.name = module_.stringof; + foreach (index, unittest_; __traits(getUnitTests, module_)) + { + enum attributes = __traits(getAttributes, unittest_); + Test test; - runTestSuite!(tests.runner)(gSuites[0]); - runTestSuite!(ecs.id_manager)(gSuites[1]); + static if (attributes.length == 0)test.name = "None"; + else test.name = attributes[0]; - writeTests(gSuites); // Save result of last test + // Save calling environment for longjmp + int jmpRet = setjmp(gEnvBuffer); + + if (jmpRet == ASSERTED) + { + passed = false; + test.passed = false; + test.file = copyString(gAssertInfo.file); + test.fileLine = gAssertInfo.line; + test.msg = copyString(gAssertInfo.msg); + } + else + { + unittest_(); + test.passed = true; + } + + if(test.passed)suite.passed++; + else suite.failed++; + suite.tests ~= test; + } + passed += suite.passed; + failed += suite.failed; + } + } + + void writeFile() + { + writeTests(suites); + } + + void writeOutput() + { + import core.stdc.stdio; + foreach(ref TestSuite suite; suites) + { + printf("Suite: \"%s\" Passed: %u/%u\n", suite.name.ptr, suite.passed, suite.passed + suite.failed); + foreach(ref Test test;suite.tests) + { + if(!test.passed) + { + printf("\tTest: \"%s\" Failed! Line: %u Message: %s\n",test.name.ptr, test.fileLine, test.msg.ptr); + } + } + } + printf("Passed: %u/%u tests.\n", passed, passed+failed); + } +} + +int main() +{ + import tests.vector; + import tests.id_manager; + import tests.basic; + + TestRunner!(tests.runner, tests.id_manager, tests.vector, tests.basic) runner; + + runner.runTests(); + + runner.writeFile(); + + runner.writeOutput(); + + if(!runner.failed)return 0; + else return 1; } diff --git a/tests/vector.d b/tests/vector.d new file mode 100644 index 0000000..9b76d0b --- /dev/null +++ b/tests/vector.d @@ -0,0 +1,18 @@ +module tests.vector; + +import ecs.simple_vector; +//import ecs.vector; + +unittest +{ + SimpleVector vector; + vector.add(cast(ubyte[])"a"); + vector.add(cast(ubyte[])"bsdf"); + assert(vector[0..5] == cast(ubyte[])"absdf"); + assert(vector[4] == 'f'); + assert(vector[] == cast(ubyte[])"absdf"); + assert(vector[$ - 1] == 'f'); + + vector.clear(); + assert(vector.length == 0); +} \ No newline at end of file