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 ts.addTestSuite(jls.jsunit.TestRunner.getClassname(name)); 42 } 43 return true; 44 }); 45 break; 46 case '-list': 47 jls.lang.System.out.println('Available tests:'); 48 jls.loader.visitPaths(function(name) { 49 if (jls.jsunit.TestRunner.isTest(name)) { 50 jls.lang.System.out.println('\t' + jls.jsunit.TestRunner.getClassname(name)); 51 } 52 return true; 53 }); 54 jls.lang.System.exit(0); 55 break; 56 case '-help': 57 jls.jsunit.TestRunner.printUsage(); 58 jls.lang.Runtime.exit(0); 59 break; 60 case '-gc': 61 tr.setGC(true); 62 break; 63 case '-verbose': 64 tr.setVerbose(true); 65 break; 66 default: 67 ts.addTestSuite(args[i]); 68 break; 69 } 70 } 71 if (ts.testCount() == 0) { 72 jls.jsunit.TestRunner.printUsage(); 73 jls.lang.Runtime.exit(22); 74 } 75 ts.run(tr); 76 //jls.lang.System.out.println(tr.toString()); 77 tr.print(); 78 } 79 }); 80 81 jls.jsunit.TestRunner.TestResultDeco = jls.lang.Class.create(jls.jsunit.TestResult, 82 { 83 initialize : function($super) { 84 $super(); 85 this._verbose = false; 86 this._gc = false; 87 }, 88 setVerbose : function(value) { 89 this._verbose = value; 90 }, 91 setGC : function(value) { 92 this._gc = value; 93 }, 94 startTest : function($super, test) { 95 $super(test); 96 if (this._verbose) { 97 jls.lang.System.out.println('Running: ' + jls.loader.getClassname(test) + '.' + test.getName() + '()'); 98 } 99 }, 100 endTest : function($super, test) { 101 $super(test); 102 if (this._gc) { 103 jls.lang.Runtime.gc(); 104 } 105 }, 106 addFailure : function($super, test, e) { 107 $super(test, e); 108 if (this._verbose) { 109 jls.lang.System.out.println('Test: ' + jls.loader.getClassname(test) + '.' + test.getName() + '() failed due to "' + e.getMessage() + '"'); 110 } 111 }, 112 addError : function($super, test, e) { 113 $super(test, e); 114 if (this._verbose) { 115 jls.lang.System.out.println('Test: ' + jls.loader.getClassname(test) + '.' + test.getName() + '() in error due to:'); 116 jls.lang.Exception.wrap(e).printStackTrace(jls.lang.System.out); 117 } 118 }, 119 print : function(ps) { 120 ps = ps || jls.lang.System.out; 121 ps.println(this.toString()); 122 for (var i = 0; i < this.getErrors().length; i++) { 123 var tf = this.getErrors()[i]; 124 var tfe = tf.thrownException(); 125 ps.println('Test "' + tf.failedTest().getName() + '" in error due to:'); 126 jls.lang.Exception.wrap(tfe).printStackTrace(ps); 127 } 128 for (var i = 0; i < this.getFailures().length; i++) { 129 var tf = this.getFailures()[i]; 130 ps.println('Test "' + tf.failedTest().getName() + '" failed due to "' + tf.thrownException().getMessage() + '"'); 131 } 132 } 133 }); 134 135