1 /** 2 A module for static constructors to avoid cyclic dependencies. 3 */ 4 module unit_threaded.static_; 5 6 version(unitThreadedLight) { 7 8 shared static this() { 9 import std.algorithm: canFind, startsWith; 10 import std.parallelism: parallel; 11 import core.runtime: Runtime; 12 13 Runtime.moduleUnitTester = () { 14 15 // ModuleInfo has opApply, can't use parallel on that so we collect 16 // all the modules with unit tests first 17 ModuleInfo*[] modules; 18 foreach(module_; ModuleInfo) { 19 if(module_ && module_.unitTest) 20 modules ~= module_; 21 } 22 23 version(unitUnthreaded) 24 enum singleThreaded = true; 25 else 26 const singleThreaded = Runtime.args.canFind("-s") || Runtime.args.canFind("--single"); 27 28 void runModuleTests(ModuleInfo* module_) { 29 version(testing_unit_threaded) { 30 const shouldTest = 31 module_.name.startsWith("unit_threaded.ut") && 32 !module_.name.startsWith("unit_threaded.ut.modules"); 33 } else 34 enum shouldTest = true; 35 36 if(shouldTest) 37 module_.unitTest()(); 38 } 39 40 if(singleThreaded) 41 foreach(module_; modules) 42 runModuleTests(module_); 43 else 44 foreach(module_; modules.parallel) 45 runModuleTests(module_); 46 47 return true; 48 }; 49 } 50 } 51 52 static this() { 53 import unit_threaded.io: _useEscCodes, shouldUseEscCodes; 54 version (Posix) { 55 import std.stdio: stdout; 56 import core.sys.posix.unistd: isatty; 57 _useEscCodes = shouldUseEscCodes; 58 } 59 }