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