1 jls.loader.provide('jls.jsunit.TestRunner'); 2 3 jls.loader.require('jls.lang.AssertionError'); 4 jls.loader.require('jls.jsunit.TestCase'); 5 jls.loader.require('jls.jsunit.TestResult'); 6 jls.loader.require('jls.jsunit.TestSuite'); 7 8 jls.jsunit.TestRunner = jls.lang.Class.create({}); 9 10 Object.extend(jls.jsunit.TestRunner, 11 { 12 isTest : function(name) { 13 var found = name.match(/([A-Z][^\/]+Test)\.js$/); 14 return found && found.length > 0; 15 }, 16 getClassname : function(name) { 17 return name.substr(0, name.length - 3).replace(/\//g, '.'); 18 }, 19 printUsage : function() { 20 jls.lang.System.err.println('Usage: jls jls.jsunit.TestRunner [-help|-all|-list|-gc|-verbose] classnames...'); 21 }, 22 main : function(args) { 23 /* 24 * use jls.loader.visitPaths to find test classes 25 * test with jls.test.Struct 26 */ 27 if (args <= 0) { 28 jls.jsunit.TestRunner.printUsage(); 29 jls.lang.Runtime.exit(22); 30 } 31 var tr = new jls.jsunit.TestRunner.TestResultDeco(); 32 var ts = new jls.jsunit.TestSuite(); 33 34 for (var i = 0; i < args.length; i++) { 35 switch (args[i]) { 36 case '-all': 37 // Add all tests 38 //jls.lang.System.out.println('Running all tests...'); 39 jls.loader.visitPaths(function(name) { 40 if (jls.jsunit.TestRunner.isTest(name)) { 41 var classname = jls.jsunit.TestRunner.getClassname(name); 42 //jls.lang.System.out.println('\t' + classname); 43 ts.addTestSuite(classname); 44 } 45 return true; 46 }); 47 break; 48 case '-list': 49 jls.lang.System.out.println('Available tests:'); 50 jls.loader.visitPaths(function(name) { 51 if (jls.jsunit.TestRunner.isTest(name)) { 52 jls.lang.System.out.println('\t' + jls.jsunit.TestRunner.getClassname(name)); 53 } 54 return true; 55 }); 56 jls.lang.System.exit(0); 57 break; 58 case '-help': 59 jls.jsunit.TestRunner.printUsage(); 60 jls.lang.Runtime.exit(0); 61 break; 62 case '-gc': 63 tr.setGC(true); 64 break; 65 case '-verbose': 66 tr.setVerbose(true); 67 break; 68 default: 69 ts.addTestSuite(args[i]); 70 break; 71 } 72 } 73 if (ts.testCount() == 0) { 74 jls.jsunit.TestRunner.printUsage(); 75 jls.lang.Runtime.exit(22); 76 } 77 ts.run(tr); 78 //jls.lang.System.out.println(tr.toString()); 79 tr.print(); 80 } 81 }); 82 83 jls.jsunit.TestRunner.TestResultDeco = jls.lang.Class.create(jls.jsunit.TestResult, 84 { 85 initialize : function($super) { 86 $super(); 87 this._verbose = false; 88 this._gc = false; 89 }, 90 setVerbose : function(value) { 91 this._verbose = value; 92 }, 93 setGC : function(value) { 94 this._gc = value; 95 }, 96 startTest : function($super, test) { 97 $super(test); 98 if (this._verbose) { 99 jls.lang.System.out.println('Running: ' + jls.loader.getClassname(test) + '.' + test.getName() + '()'); 100 } 101 }, 102 endTest : function($super, test) { 103 $super(test); 104 if (this._gc) { 105 jls.lang.Runtime.gc(); 106 } 107 }, 108 addFailure : function($super, test, e) { 109 $super(test, e); 110 if (this._verbose) { 111 jls.lang.System.out.println('Test: ' + jls.loader.getClassname(test) + '.' + test.getName() + '() failed due to "' + e.getMessage() + '"'); 112 } 113 }, 114 addError : function($super, test, e) { 115 $super(test, e); 116 if (this._verbose) { 117 jls.lang.System.out.println('Test: ' + jls.loader.getClassname(test) + '.' + test.getName() + '() in error due to:'); 118 jls.lang.Exception.wrap(e).printStackTrace(jls.lang.System.out); 119 } 120 }, 121 print : function(ps) { 122 ps = ps || jls.lang.System.out; 123 ps.println(this.toString()); 124 for (var i = 0; i < this.getErrors().length; i++) { 125 var tf = this.getErrors()[i]; 126 var tfe = tf.thrownException(); 127 ps.println('Test "' + tf.failedTest().getName() + '" in error due to:'); 128 jls.lang.Exception.wrap(tfe).printStackTrace(ps); 129 } 130 for (var i = 0; i < this.getFailures().length; i++) { 131 var tf = this.getFailures()[i]; 132 ps.println('Test "' + tf.failedTest().getName() + '" failed due to "' + tf.thrownException().getMessage() + '"'); 133 } 134 } 135 }); 136 137