View difference between Paste ID: g6FWsTkr and tU9BuS3G
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
}