| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env dart | |
| 2 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
| 3 // for details. All rights reserved. Use of this source code is governed by a | |
| 4 // BSD-style license that can be found in the LICENSE file. | |
| 5 | |
| 6 library dunit; | |
| 7 | |
| 8 typedef void Test(); | |
| 9 typedef TestResult SynchTest(); | |
| 10 typedef Future<TestResult> AsynchTest(); | |
| 11 | |
| 12 class TestSuite { | |
| 13 TestSuite() : _tests = <SynchTest>[]; | |
| 14 | |
| 15 void registerTestClass(TestClass tests) { | |
| 16 tests.registerTests(this); | |
| 17 } | |
| 18 | |
| 19 void _registerTest(SynchTest test) { | |
| 20 _tests.add(test); | |
| 21 } | |
| 22 | |
| 23 void run() { | |
| 24 reportResults(runTests()); | |
| 25 } | |
| 26 | |
| 27 List<TestResult> runTests() { | |
| 28 List<TestResult> results = <TestResult>[]; | |
| 29 for(Function test in _tests) { | |
| 30 results.add(test()); | |
| 31 } | |
| 32 return results; | |
| 33 } | |
| 34 | |
| 35 void reportResults(List<TestResult> results) { | |
| 36 if(results.every((TestResult r) => r is PassedTest)) { | |
| 37 print("OK -- ALL TESTS PASS (${results.length} run)"); | |
| 38 } else { | |
| 39 for(TestResult r in | |
| 40 results.where((TestResult r) => !(r is PassedTest))) { | |
| 41 print(r); | |
| 42 } | |
| 43 int passedTests = | |
| 44 results.where((TestResult r) => r is PassedTest).length; | |
| 45 int failures = | |
| 46 results.where((TestResult r) => r is FailedTest).length; | |
| 47 int errors = | |
| 48 results.where((TestResult r) => r is TestError).length; | |
| 49 print("FAIL -- TESTS RUN: ${results.length}"); | |
| 50 print(" PASSED: ${passedTests}"); | |
| 51 print(" FAILED: ${failures}"); | |
| 52 print(" ERRORS: ${errors}"); | |
| 53 } | |
| 54 } | |
| 55 | |
| 56 List<SynchTest> _tests; | |
| 57 } | |
| 58 | |
| 59 abstract class TestResult { | |
| 60 String get testDescription; | |
| 61 } | |
| 62 | |
| 63 class PassedTest implements TestResult { | |
| 64 const PassedTest(String this._testDescription); | |
| 65 String get testDescription => _testDescription; | |
| 66 final String _testDescription; | |
| 67 String toString() => _testDescription; | |
| 68 } | |
| 69 | |
| 70 class _ExceptionResult { | |
| 71 const _ExceptionResult(String this._testDescription, var this._exception); | |
| 72 | |
| 73 String get testDescription => _testDescription; | |
| 74 final String _testDescription; | |
| 75 | |
| 76 Object get exception => _exception; | |
| 77 final _exception; | |
| 78 } | |
| 79 | |
| 80 class FailedTest extends _ExceptionResult implements TestResult { | |
| 81 FailedTest(String testDescription, var exception) : | |
| 82 super(testDescription, exception); | |
| 83 | |
| 84 String toString() => ">>> Test failure in ${_testDescription} " + | |
| 85 "with:\n${exception}\n"; | |
| 86 } | |
| 87 | |
| 88 class TestError extends _ExceptionResult implements TestResult { | |
| 89 TestError(String testDescription, var exception, var this.stacktrace) : | |
| 90 super(testDescription, exception); | |
| 91 | |
| 92 String toString() => ">>> Test error caught in " + | |
| 93 "${_testDescription} with:\n${exception}\n$stacktrace\n"; | |
| 94 | |
| 95 var stacktrace; | |
| 96 } | |
| 97 | |
| 98 class TestClass { | |
| 99 void register(String description, Function test, TestSuite suite) { | |
| 100 suite._registerTest(() { | |
| 101 setUp(); | |
| 102 try { | |
| 103 test(); | |
| 104 tearDown(); | |
| 105 return new PassedTest(description); | |
| 106 } on ExpectException catch (x) { | |
| 107 tearDown(); | |
| 108 return new FailedTest(description, x); | |
| 109 } catch (x, stacktrace) { | |
| 110 tearDown(); | |
| 111 return new TestError(description, x, stacktrace); | |
| 112 } | |
| 113 }); | |
| 114 } | |
| 115 | |
| 116 void registerTests(TestSuite suite); | |
| 117 void setUp() {} | |
| 118 void tearDown() {} | |
| 119 } | |
| OLD | NEW |