SHOW:
|
|
- or go back to the newest paste.
| 1 | module opmix.ut; | |
| 2 | ||
| 3 | - | struct UT {}
|
| 3 | + | struct UT { string tag; }
|
| 4 | ||
| 5 | mixin template UTInit(string modname) {
| |
| 6 | version(UT) {
| |
| 7 | import std.traits; | |
| 8 | ||
| 9 | - | template isUnitTest(alias f) {
|
| 9 | + | template unitTestTag(alias f) {
|
| 10 | - | bool helper() {
|
| 10 | + | auto helper() {
|
| 11 | foreach(attr; __traits(getAttributes, f)) | |
| 12 | static if(is(attr == UT)) | |
| 13 | - | return true; |
| 13 | + | return attr.tag; |
| 14 | - | return false; |
| 14 | + | return ""; |
| 15 | } | |
| 16 | - | enum bool isUnitTest = helper; |
| 16 | + | enum string unitTestTag = helper; |
| 17 | } | |
| 18 | ||
| 19 | static this() {
| |
| 20 | import std.typecons; | |
| 21 | import std.typetuple; | |
| 22 | import std.string; | |
| 23 | import std.algorithm; | |
| 24 | import std.traits; | |
| 25 | - | foreach(name; __traits(allMembers, mod)) {
|
| 25 | + | import std.stdio; |
| 26 | ||
| 27 | - | static if (isSomeFunction!symbol) {
|
| 27 | + | |
| 28 | - | static if(name.startsWith("test")) {
|
| 28 | + | alias members = TypeTuple!(__traits(allMembers, mod)); |
| 29 | - | static if(isUnitTest!symbol) {
|
| 29 | + | foreach( member ; members ) {
|
| 30 | - | testFunctions[fullyQualifiedName!symbol] = &symbol; |
| 30 | + | writeln("Member: ", member);
|
| 31 | - | } |
| 31 | + | |
| 32 | - | } |
| 32 | + | |
| 33 | alias tests = TypeTuple!(__traits(getUnitTests, mod)); | |
| 34 | /* | |
| 35 | foreach( test; tests ) {
| |
| 36 | writeln("examining ", name);
| |
| 37 | mixin ("alias symbol = " ~ name ~ ";");
| |
| 38 | testFunctions[fullyQualifiedName!mod ~ "GOO"] = &symbol; | |
| 39 | } | |
| 40 | */ | |
| 41 | } | |
| 42 | } | |
| 43 | } | |
| 44 | ||
| 45 | version(UT) {
| |
| 46 | import std.stdio; | |
| 47 | import std.algorithm; | |
| 48 | import std.regex; | |
| 49 | import std.getopt; | |
| 50 | import core.runtime; | |
| 51 | ||
| 52 | static void function()[string] testFunctions; | |
| 53 | ||
| 54 | bool unitTester() {
| |
| 55 | string[] modules; | |
| 56 | string[] tests; | |
| 57 | string[] args = Runtime.args; | |
| 58 | bool help; | |
| 59 | ||
| 60 | getopt(args, | |
| 61 | "help|h", &help, | |
| 62 | "module_re|m", &modules, | |
| 63 | "test_re|t", &tests); | |
| 64 | ||
| 65 | if(help) {
| |
| 66 | writeln("
| |
| 67 | Test Function based unit tests. | |
| 68 | ||
| 69 | Supported arguments: | |
| 70 | [module_re|m] one or more regexes to match on module names | |
| 71 | [test_re|m] one or more regexes to match on test function names | |
| 72 | "); | |
| 73 | return false; | |
| 74 | } | |
| 75 | ||
| 76 | auto delim = regex(r"\."); | |
| 77 | foreach( funcName, func ; testFunctions ) {
| |
| 78 | auto parts = split(funcName, delim); | |
| 79 | if(modules.length == 0 || any!(re => match(parts[0], re))(modules)) {
| |
| 80 | if(tests.length == 0 || any!(re => match(parts[1], re))(tests)) {
| |
| 81 | writeln("Running ", funcName);
| |
| 82 | func(); | |
| 83 | } | |
| 84 | } | |
| 85 | } | |
| 86 | return true; | |
| 87 | } | |
| 88 | ||
| 89 | static this() {
| |
| 90 | Runtime.moduleUnitTester(&unitTester); | |
| 91 | } | |
| 92 | } |