Better assertion infos and formatted code
This commit is contained in:
parent
0670aed506
commit
14839b3765
6 changed files with 163 additions and 109 deletions
161
tests/runner.d
161
tests/runner.d
|
|
@ -15,7 +15,9 @@ enum string OUT_FILE = "test_report.xml";
|
|||
static jmp_buf gEnvBuffer;
|
||||
static AssertInfo gAssertInfo;
|
||||
|
||||
version(D_BetterC){}
|
||||
version (D_BetterC)
|
||||
{
|
||||
}
|
||||
else version = notBetterC;
|
||||
|
||||
struct AssertInfo
|
||||
|
|
@ -70,7 +72,7 @@ struct TestRunner(Args...)
|
|||
write(failed);
|
||||
write("\">\n");
|
||||
|
||||
foreach(ref TestSuite suite; suites)
|
||||
foreach (ref TestSuite suite; suites)
|
||||
{
|
||||
write("\t<testsuite name=\"");
|
||||
write(suite.name);
|
||||
|
|
@ -82,14 +84,14 @@ struct TestRunner(Args...)
|
|||
write(suite.skipped);
|
||||
write("\">\n");
|
||||
|
||||
foreach(ref Test test; suite.tests)
|
||||
foreach (ref Test test; suite.tests)
|
||||
{
|
||||
write("\t\t<testcase name=\"");
|
||||
write(test.name);
|
||||
write("\" classname=\"");
|
||||
write(suite.name);
|
||||
write("\">\n");
|
||||
if(test.msg)
|
||||
if (test.msg)
|
||||
{
|
||||
write("\t\t\t<failure type=\"Fail\" message=\"");
|
||||
write(test.msg[0 .. $ - 1]);
|
||||
|
|
@ -106,14 +108,14 @@ struct TestRunner(Args...)
|
|||
}
|
||||
|
||||
write("\t</testsuite>\n");
|
||||
}
|
||||
}
|
||||
|
||||
write("</testsuites>");
|
||||
}
|
||||
|
||||
void runTests(string[] include = null, string[] exclude = null)
|
||||
{
|
||||
foreach(i, module_; Args)
|
||||
foreach (i, module_; Args)
|
||||
{
|
||||
TestSuite* suite = &suites[i];
|
||||
suite.name = module_.stringof;
|
||||
|
|
@ -122,35 +124,35 @@ struct TestRunner(Args...)
|
|||
enum attributes = __traits(getAttributes, unittest_);
|
||||
static if (attributes.length != 0)
|
||||
{
|
||||
if(include.length > 0)
|
||||
if (include.length > 0)
|
||||
{
|
||||
bool matched = false;
|
||||
foreach(str; include)
|
||||
foreach (str; include)
|
||||
{
|
||||
if(match(str, attributes[0]))
|
||||
if (match(str, attributes[0]))
|
||||
{
|
||||
matched = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
foreach(str; exclude)
|
||||
foreach (str; exclude)
|
||||
{
|
||||
if(match(str, attributes[0]))
|
||||
if (match(str, attributes[0]))
|
||||
{
|
||||
matched = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(!matched)
|
||||
if (!matched)
|
||||
{
|
||||
suite.skipped++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(include.length > 0)
|
||||
else if (include.length > 0)
|
||||
{
|
||||
suite.skipped++;
|
||||
continue;
|
||||
|
|
@ -158,11 +160,13 @@ struct TestRunner(Args...)
|
|||
|
||||
Test test;
|
||||
|
||||
static if (attributes.length == 0)test.name = "None";
|
||||
else test.name = attributes[0];
|
||||
static if (attributes.length == 0)
|
||||
test.name = "None";
|
||||
else
|
||||
test.name = attributes[0];
|
||||
|
||||
|
||||
static if(__traits(hasMember, module_, "beforeEveryTest"))module_.beforeEveryTest();
|
||||
static if (__traits(hasMember, module_, "beforeEveryTest"))
|
||||
module_.beforeEveryTest();
|
||||
|
||||
// Save calling environment for longjmp
|
||||
int jmp_ret = setjmp(gEnvBuffer);
|
||||
|
|
@ -181,10 +185,13 @@ struct TestRunner(Args...)
|
|||
test.passed = true;
|
||||
}
|
||||
|
||||
if(test.passed)suite.passed++;
|
||||
else suite.failed++;
|
||||
if (test.passed)
|
||||
suite.passed++;
|
||||
else
|
||||
suite.failed++;
|
||||
suite.tests ~= test;
|
||||
static if(__traits(hasMember, module_, "afterEveryTest"))module_.afterEveryTest();
|
||||
static if (__traits(hasMember, module_, "afterEveryTest"))
|
||||
module_.afterEveryTest();
|
||||
}
|
||||
passed += suite.passed;
|
||||
failed += suite.failed;
|
||||
|
|
@ -194,43 +201,51 @@ struct TestRunner(Args...)
|
|||
|
||||
void writeFile()
|
||||
{
|
||||
if(junit.length == 0)generateJUnit();
|
||||
if (junit.length == 0)
|
||||
generateJUnit();
|
||||
auto file = fopen(OUT_FILE, "w");
|
||||
fwrite(junit.data.ptr,junit.length,1,file);
|
||||
fwrite(junit.data.ptr, junit.length, 1, file);
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
void writeOutput()
|
||||
{
|
||||
foreach(ref TestSuite suite; suites)
|
||||
foreach (ref TestSuite suite; suites)
|
||||
{
|
||||
printf("Suite: \"%s\" Passed: %u/%u Skipped: %u\n", suite.name.ptr, suite.passed, suite.passed + suite.failed, suite.skipped);
|
||||
foreach(ref Test test;suite.tests)
|
||||
printf("Suite: \"%s\" Passed: %u/%u Skipped: %u\n", suite.name.ptr,
|
||||
suite.passed, suite.passed + suite.failed, suite.skipped);
|
||||
foreach (ref Test test; suite.tests)
|
||||
{
|
||||
if(!test.passed)
|
||||
if (!test.passed)
|
||||
{
|
||||
printf("\tTest: \"%s\" Failed! Line: %u Message: %s\n",test.name.ptr, test.file_line, test.msg.ptr);
|
||||
printf("\tTest: \"%s\" Failed! Line: %u Message: %s\n",
|
||||
test.name.ptr, test.file_line, test.msg.ptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("Passed %u/%u tests. Skipped: %u.\n", passed, passed+failed, skipped);
|
||||
printf("Passed %u/%u tests. Skipped: %u.\n", passed, passed + failed, skipped);
|
||||
}
|
||||
|
||||
bool match(string a, string b)
|
||||
{
|
||||
uint i = 0;
|
||||
foreach(char c; b)
|
||||
foreach (char c; b)
|
||||
{
|
||||
if(i > a.length)return false;
|
||||
if(a[i] == c)i++;
|
||||
else
|
||||
if (i > a.length)
|
||||
return false;
|
||||
if (a[i] == c)
|
||||
i++;
|
||||
else
|
||||
{
|
||||
if(a[i] == '*')
|
||||
if (a[i] == '*')
|
||||
{
|
||||
if(i+1 >= a.length)return true;
|
||||
else if(a[i + 1] == c)i += 2;
|
||||
if (i + 1 >= a.length)
|
||||
return true;
|
||||
else if (a[i + 1] == c)
|
||||
i += 2;
|
||||
}
|
||||
else return false;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return i == a.length;
|
||||
|
|
@ -245,8 +260,8 @@ struct TestRunner(Args...)
|
|||
{
|
||||
ubyte[20] buffer;
|
||||
int len;
|
||||
len = sprintf(cast(char*)buffer.ptr, "%u", num);
|
||||
junit.add(buffer[0..len]);
|
||||
len = sprintf(cast(char*) buffer.ptr, "%u", num);
|
||||
junit.add(buffer[0 .. len]);
|
||||
}
|
||||
|
||||
TestSuite[Args.length] suites;
|
||||
|
|
@ -257,70 +272,75 @@ struct TestRunner(Args...)
|
|||
SimpleVector junit;
|
||||
}
|
||||
|
||||
version(notBetterC)
|
||||
version (notBetterC)
|
||||
{
|
||||
extern(C) int rt_init();
|
||||
extern(C) int rt_term();
|
||||
version(D_Coverage) extern (C) void dmd_coverDestPath(string path);
|
||||
extern (C) int rt_init();
|
||||
extern (C) int rt_term();
|
||||
version (D_Coverage) extern (C) void dmd_coverDestPath(string path);
|
||||
}
|
||||
|
||||
void extractStrings(ref Vector!string container, string str)
|
||||
{
|
||||
uint s = 0;
|
||||
foreach(j, char c; str)
|
||||
foreach (j, char c; str)
|
||||
{
|
||||
if(c == ',')
|
||||
if (c == ',')
|
||||
{
|
||||
if(s < j)
|
||||
if (s < j)
|
||||
{
|
||||
container.add(str[s .. j]);
|
||||
}
|
||||
s = cast(uint)j+1;
|
||||
s = cast(uint) j + 1;
|
||||
}
|
||||
}
|
||||
if(s < str.length)
|
||||
if (s < str.length)
|
||||
{
|
||||
container.add(str[s .. $]);
|
||||
}
|
||||
}
|
||||
|
||||
extern(C) int main(int argc, char** args)
|
||||
extern (C) int main(int argc, char** args)
|
||||
{
|
||||
Vector!string include;
|
||||
Vector!string exclude;
|
||||
|
||||
version(notBetterC)
|
||||
version (notBetterC)
|
||||
{
|
||||
rt_init();
|
||||
version(D_Coverage) dmd_coverDestPath("reports");
|
||||
version (D_Coverage)
|
||||
dmd_coverDestPath("reports");
|
||||
}
|
||||
|
||||
for(int i=1;i<argc;i++)
|
||||
for (int i = 1; i < argc; i++)
|
||||
{
|
||||
string arg = cast(string)args[i][0..strlen(args[i])];
|
||||
if(arg.length < 2)continue;
|
||||
else if(arg == "-i")
|
||||
string arg = cast(string) args[i][0 .. strlen(args[i])];
|
||||
if (arg.length < 2)
|
||||
continue;
|
||||
else if (arg == "-i")
|
||||
{
|
||||
if(i + 1 >= argc)break;
|
||||
if (i + 1 >= argc)
|
||||
break;
|
||||
i++;
|
||||
arg = cast(string)args[i][0..strlen(args[i])];
|
||||
arg = cast(string) args[i][0 .. strlen(args[i])];
|
||||
extractStrings(include, arg);
|
||||
}
|
||||
else if(arg =="-e")
|
||||
else if (arg == "-e")
|
||||
{
|
||||
if(i + 1 >= argc)break;
|
||||
if (i + 1 >= argc)
|
||||
break;
|
||||
i++;
|
||||
arg = cast(string)args[i][0..strlen(args[i])];
|
||||
arg = cast(string) args[i][0 .. strlen(args[i])];
|
||||
extractStrings(exclude, arg);
|
||||
}
|
||||
else if(arg.length < 10)continue;
|
||||
else if(arg[0..10] == "--include=")
|
||||
else if (arg.length < 10)
|
||||
continue;
|
||||
else if (arg[0 .. 10] == "--include=")
|
||||
{
|
||||
extractStrings(include, arg[10..$]);
|
||||
extractStrings(include, arg[10 .. $]);
|
||||
}
|
||||
else if(arg[0..10] == "--exclude=")
|
||||
else if (arg[0 .. 10] == "--exclude=")
|
||||
{
|
||||
extractStrings(exclude, arg[10..$]);
|
||||
extractStrings(exclude, arg[10 .. $]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -332,8 +352,11 @@ extern(C) int main(int argc, char** args)
|
|||
|
||||
runner.writeOutput();
|
||||
|
||||
version(notBetterC)rt_term();
|
||||
|
||||
if(!runner.failed)return 0;
|
||||
else return 1;
|
||||
}
|
||||
version (notBetterC)
|
||||
rt_term();
|
||||
|
||||
if (!runner.failed)
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue