asunit4 4.2.1.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +5 -0
- data/MIT-LICENSE.txt +22 -0
- data/README.textile +6 -0
- data/air/AIR2Runner.mxml +22 -0
- data/air/AIR2RunnerDescriptor.xml +38 -0
- data/asunit4.gemspec +20 -0
- data/asunit4.rb +16 -0
- data/bin/AsUnit-4.1.pre.swc +0 -0
- data/bin/AsUnitRunner.swf +0 -0
- data/build.xml +46 -0
- data/lib/Reflection.swc +0 -0
- data/rakefile.rb +169 -0
- data/script/generate +21 -0
- data/src/asunit/asserts/assertEquals.as +5 -0
- data/src/asunit/asserts/assertEqualsArrays.as +5 -0
- data/src/asunit/asserts/assertEqualsArraysIgnoringOrder.as +5 -0
- data/src/asunit/asserts/assertEqualsFloat.as +5 -0
- data/src/asunit/asserts/assertFalse.as +5 -0
- data/src/asunit/asserts/assertNotNull.as +5 -0
- data/src/asunit/asserts/assertNotSame.as +5 -0
- data/src/asunit/asserts/assertNull.as +5 -0
- data/src/asunit/asserts/assertSame.as +5 -0
- data/src/asunit/asserts/assertThrows.as +5 -0
- data/src/asunit/asserts/assertTrue.as +5 -0
- data/src/asunit/asserts/fail.as +5 -0
- data/src/asunit/core/AsUnitCore.as +177 -0
- data/src/asunit/core/FlashBuilderCore.as +22 -0
- data/src/asunit/core/FlashDevelopCore.as +21 -0
- data/src/asunit/core/TextCore.as +54 -0
- data/src/asunit/errors/AbstractError.as +10 -0
- data/src/asunit/errors/AssertionFailedError.as +10 -0
- data/src/asunit/errors/ClassNotFoundError.as +11 -0
- data/src/asunit/errors/InstanceNotFoundError.as +10 -0
- data/src/asunit/errors/UnimplementedFeatureError.as +10 -0
- data/src/asunit/errors/UsageError.as +11 -0
- data/src/asunit/events/TimeoutCommandEvent.as +27 -0
- data/src/asunit/framework/Assert.as +408 -0
- data/src/asunit/framework/Async.as +138 -0
- data/src/asunit/framework/CallbackBridge.as +175 -0
- data/src/asunit/framework/Command.as +6 -0
- data/src/asunit/framework/ErrorEvent.as +20 -0
- data/src/asunit/framework/IAsync.as +21 -0
- data/src/asunit/framework/IResult.as +36 -0
- data/src/asunit/framework/IRunListener.as +11 -0
- data/src/asunit/framework/IRunner.as +15 -0
- data/src/asunit/framework/IRunnerFactory.as +9 -0
- data/src/asunit/framework/ITestFailure.as +32 -0
- data/src/asunit/framework/ITestListener.as +15 -0
- data/src/asunit/framework/ITestResult.as +21 -0
- data/src/asunit/framework/ITestSuccess.as +22 -0
- data/src/asunit/framework/ITestWarning.as +14 -0
- data/src/asunit/framework/InjectionDelegate.as +96 -0
- data/src/asunit/framework/LegacyTestIterator.as +40 -0
- data/src/asunit/framework/MessageBridge.as +24 -0
- data/src/asunit/framework/Method.as +80 -0
- data/src/asunit/framework/Result.as +181 -0
- data/src/asunit/framework/RunnerFactory.as +179 -0
- data/src/asunit/framework/SuiteIterator.as +71 -0
- data/src/asunit/framework/TestCase.as +106 -0
- data/src/asunit/framework/TestFailure.as +65 -0
- data/src/asunit/framework/TestIterator.as +282 -0
- data/src/asunit/framework/TestObserver.as +12 -0
- data/src/asunit/framework/TestSuccess.as +38 -0
- data/src/asunit/framework/TestWarning.as +40 -0
- data/src/asunit/framework/TimeoutCommand.as +103 -0
- data/src/asunit/printers/FlashBuilderPrinter.as +134 -0
- data/src/asunit/printers/FlashDevelopPrinter.as +81 -0
- data/src/asunit/printers/TextPrinter.as +324 -0
- data/src/asunit/runners/LegacyRunner.as +13 -0
- data/src/asunit/runners/SuiteRunner.as +125 -0
- data/src/asunit/runners/TestRunner.as +403 -0
- data/src/asunit/util/ArrayIterator.as +30 -0
- data/src/asunit/util/Iterator.as +10 -0
- data/test/AllTests.as +73 -0
- data/test/AsUnitRunner.as +15 -0
- data/test/Flex3Runner.mxml +24 -0
- data/test/Flex4Runner.mxml +27 -0
- data/test/asunit/core/AsUnitCoreTest.as +97 -0
- data/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as +88 -0
- data/test/asunit/framework/AssertEqualsArraysTest.as +102 -0
- data/test/asunit/framework/AssertTest.as +184 -0
- data/test/asunit/framework/AssertThrowsTest.as +42 -0
- data/test/asunit/framework/AsyncMethodTest.as +69 -0
- data/test/asunit/framework/AsyncTest.as +104 -0
- data/test/asunit/framework/CallbackBridgeTest.as +73 -0
- data/test/asunit/framework/InjectionDelegateTest.as +79 -0
- data/test/asunit/framework/MockData.xml +8 -0
- data/test/asunit/framework/NestedSuiteIteratorTest.as +59 -0
- data/test/asunit/framework/ProceedOnEventTest.as +109 -0
- data/test/asunit/framework/ResultTest.as +92 -0
- data/test/asunit/framework/RunnerFactoryTest.as +54 -0
- data/test/asunit/framework/SuiteIteratorTest.as +67 -0
- data/test/asunit/framework/TestCaseMock.as +24 -0
- data/test/asunit/framework/TestIteratorIgnoredMethodTest.as +62 -0
- data/test/asunit/framework/TestIteratorMethodByNameTest.as +50 -0
- data/test/asunit/framework/TestIteratorMultiMethodTest.as +186 -0
- data/test/asunit/framework/TestIteratorOrderedTestMethodTest.as +57 -0
- data/test/asunit/framework/TestIteratorSingleMethodTest.as +56 -0
- data/test/asunit/framework/VisualTestCaseTest.as +43 -0
- data/test/asunit/framework/assertAssertionFailed.as +19 -0
- data/test/asunit/printers/TextPrinterTest.as +122 -0
- data/test/asunit/runners/LegacyRunnerTest.as +40 -0
- data/test/asunit/runners/SuiteRunnerTest.as +40 -0
- data/test/asunit/runners/TestRunnerAsyncMethodTest.as +107 -0
- data/test/asunit/runners/TestRunnerErrorMethodTest.as +56 -0
- data/test/asunit/runners/TestRunnerExpectsErrorTest.as +98 -0
- data/test/asunit/runners/TestRunnerIgnoredMethodTest.as +42 -0
- data/test/asunit/runners/TestRunnerTest.as +171 -0
- data/test/asunit/support/AnnotatedSubClass.as +18 -0
- data/test/asunit/support/AnnotatedSuperClass.as +15 -0
- data/test/asunit/support/CustomParameters.as +13 -0
- data/test/asunit/support/CustomTestRunner.as +22 -0
- data/test/asunit/support/DoubleFailSuite.as +8 -0
- data/test/asunit/support/DoubleNestedSuite.as +14 -0
- data/test/asunit/support/ErrorInMethod.as +11 -0
- data/test/asunit/support/FailAssertEquals.as +29 -0
- data/test/asunit/support/FailAssertTrue.as +28 -0
- data/test/asunit/support/FakeObserver.as +42 -0
- data/test/asunit/support/FakeRunner.as +32 -0
- data/test/asunit/support/IgnoredMethod.as +26 -0
- data/test/asunit/support/InjectTimeoutOnAsync.as +14 -0
- data/test/asunit/support/InjectionFailure.as +18 -0
- data/test/asunit/support/InjectionVerification.as +69 -0
- data/test/asunit/support/LegacyTestCase.as +38 -0
- data/test/asunit/support/MultiMethod.as +77 -0
- data/test/asunit/support/OrderedTestMethod.as +36 -0
- data/test/asunit/support/RunWithButNoType.as +14 -0
- data/test/asunit/support/RunWithSuiteButNoType.as +11 -0
- data/test/asunit/support/SingleErrorSuite.as +7 -0
- data/test/asunit/support/SingleSuccessSuite.as +7 -0
- data/test/asunit/support/SucceedAssertTrue.as +31 -0
- data/test/asunit/support/SuiteOfTwoSuites.as +8 -0
- data/test/asunit/support/SuiteWithCustomRunner.as +12 -0
- data/test/asunit/support/SuiteWithOneCustomChildSuite.as +10 -0
- data/test/asunit/support/TestForFakeRunner.as +14 -0
- data/test/asunit/util/ArrayIteratorTest.as +65 -0
- data/vendor/as3reflection/README +7 -0
- data/vendor/as3reflection/p2/reflect/Reflection.as +417 -0
- data/vendor/as3reflection/p2/reflect/ReflectionAccessor.as +14 -0
- data/vendor/as3reflection/p2/reflect/ReflectionBase.as +52 -0
- data/vendor/as3reflection/p2/reflect/ReflectionMember.as +16 -0
- data/vendor/as3reflection/p2/reflect/ReflectionMetaData.as +69 -0
- data/vendor/as3reflection/p2/reflect/ReflectionMethod.as +36 -0
- data/vendor/as3reflection/p2/reflect/ReflectionMethodParameter.as +19 -0
- data/vendor/as3reflection/p2/reflect/ReflectionVariable.as +15 -0
- data/vendor/as3reflection/p2/reflect/findFirst.as +14 -0
- data/vendor/generators/suite/USAGE +0 -0
- data/vendor/generators/suite/suite_generator.rb +17 -0
- data/vendor/generators/suite/templates/TestSuite.as +17 -0
- metadata +216 -0
@@ -0,0 +1,324 @@
|
|
1
|
+
package asunit.printers {
|
2
|
+
|
3
|
+
import asunit.framework.IResult;
|
4
|
+
import asunit.framework.IRunListener;
|
5
|
+
import asunit.framework.ITestFailure;
|
6
|
+
import asunit.framework.ITestSuccess;
|
7
|
+
import asunit.framework.ITestWarning;
|
8
|
+
import asunit.framework.Method;
|
9
|
+
|
10
|
+
import flash.display.Shape;
|
11
|
+
import flash.display.Sprite;
|
12
|
+
import flash.display.StageAlign;
|
13
|
+
import flash.display.StageScaleMode;
|
14
|
+
import flash.events.Event;
|
15
|
+
import flash.system.Capabilities;
|
16
|
+
import flash.text.TextField;
|
17
|
+
import flash.text.TextFormat;
|
18
|
+
import flash.utils.getQualifiedClassName;
|
19
|
+
import flash.utils.getTimer;
|
20
|
+
import asunit.framework.CallbackBridge;
|
21
|
+
|
22
|
+
public class TextPrinter extends Sprite implements IRunListener {
|
23
|
+
public static var LOCAL_PATH_PATTERN:RegExp = /([A-Z]:\\[^\/:\*\?<>\|]+\.\w{2,6})|(\\{2}[^\/:\*\?<>\|]+\.\w{2,6})/g;
|
24
|
+
public static var BACKGROUND_COLOR:uint = 0x333333;
|
25
|
+
public static var DEFAULT_HEADER:String = "AsUnit 4.0 by Luke Bayes, Ali Mills and Robert Penner\n\nFlash Player version: " + Capabilities.version
|
26
|
+
public static var FONT_SIZE:int = 12;
|
27
|
+
public static var TEXT_COLOR:uint = 0xffffff;
|
28
|
+
|
29
|
+
public var backgroundColor:uint = BACKGROUND_COLOR;
|
30
|
+
public var displayPerformanceDetails:Boolean = true;
|
31
|
+
public var localPathPattern:RegExp;
|
32
|
+
public var textColor:uint = TEXT_COLOR;
|
33
|
+
public var traceOnComplete:Boolean = true;
|
34
|
+
|
35
|
+
protected var textDisplay:TextField;
|
36
|
+
|
37
|
+
private var backgroundFill:Shape;
|
38
|
+
private var dots:Array;
|
39
|
+
private var failures:Array;
|
40
|
+
private var footer:String;
|
41
|
+
private var header:String;
|
42
|
+
private var ignores:Array;
|
43
|
+
private var resultBar:Shape;
|
44
|
+
private var resultBarHeight:uint = 3;
|
45
|
+
private var runCompleted:Boolean;
|
46
|
+
private var startTime:Number;
|
47
|
+
private var successes:Array;
|
48
|
+
private var testTimes:Array;
|
49
|
+
private var warnings:Array;
|
50
|
+
|
51
|
+
/**
|
52
|
+
* The bridge provides the connection between the printer
|
53
|
+
* and the Runner(s) that it's interested in.
|
54
|
+
*
|
55
|
+
* Generally, a bridge can observe Runners, and build up
|
56
|
+
* state over the course of a test run.
|
57
|
+
*
|
58
|
+
* If you create a custom Runner, Printer and Bridge,
|
59
|
+
* you can decide to manage notifications however you wish.
|
60
|
+
*
|
61
|
+
*/
|
62
|
+
private var _bridge:CallbackBridge;
|
63
|
+
|
64
|
+
[Inject]
|
65
|
+
public function set bridge(value:CallbackBridge):void
|
66
|
+
{
|
67
|
+
if (value !== _bridge)
|
68
|
+
{
|
69
|
+
_bridge = value;
|
70
|
+
_bridge.addObserver(this);
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
public function get bridge():CallbackBridge
|
75
|
+
{
|
76
|
+
return _bridge;
|
77
|
+
}
|
78
|
+
|
79
|
+
public function TextPrinter() {
|
80
|
+
initialize();
|
81
|
+
}
|
82
|
+
|
83
|
+
private function initialize():void {
|
84
|
+
dots = [];
|
85
|
+
failures = [];
|
86
|
+
ignores = [];
|
87
|
+
successes = [];
|
88
|
+
testTimes = [];
|
89
|
+
warnings = [];
|
90
|
+
|
91
|
+
footer = '';
|
92
|
+
header = DEFAULT_HEADER;
|
93
|
+
localPathPattern = LOCAL_PATH_PATTERN;
|
94
|
+
|
95
|
+
if(stage) {
|
96
|
+
initializeDisplay();
|
97
|
+
} else {
|
98
|
+
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
|
99
|
+
}
|
100
|
+
}
|
101
|
+
|
102
|
+
public function onRunStarted():void {
|
103
|
+
updateTextDisplay();
|
104
|
+
}
|
105
|
+
|
106
|
+
public function onTestFailure(failure:ITestFailure):void {
|
107
|
+
var s:String = '';
|
108
|
+
s += getQualifiedClassName(failure.failedTest);
|
109
|
+
s += '.' + failure.failedMethod + ' : ';
|
110
|
+
s += getFailureStackTrace(failure);
|
111
|
+
|
112
|
+
failures.push(s);
|
113
|
+
dots.push(failure.isFailure ? 'F' : 'E');
|
114
|
+
updateTextDisplay();
|
115
|
+
}
|
116
|
+
|
117
|
+
private function getFailureStackTrace(failure:ITestFailure):String {
|
118
|
+
var stack:String = "";
|
119
|
+
stack = failure.thrownException.getStackTrace();
|
120
|
+
//stack = stack.replace(localPathPattern, '');
|
121
|
+
stack = stack.replace(/AssertionFailedError: /, '');
|
122
|
+
stack += "\n\n";
|
123
|
+
return stack;
|
124
|
+
}
|
125
|
+
|
126
|
+
public function onTestSuccess(success:ITestSuccess):void {
|
127
|
+
dots.push('.');
|
128
|
+
updateTextDisplay();
|
129
|
+
}
|
130
|
+
|
131
|
+
public function onTestIgnored(method:Method):void {
|
132
|
+
dots.push('I');
|
133
|
+
ignores.push(getIgnoreFromMethod(method));
|
134
|
+
updateTextDisplay();
|
135
|
+
}
|
136
|
+
|
137
|
+
private function getIgnoreFromMethod(method:Method):String {
|
138
|
+
var message:String = "[Ignore] found at: " + method.scopeName + "." + method.toString();
|
139
|
+
if(method.ignoreDescription) {
|
140
|
+
message += " (" + method.ignoreDescription + ")";
|
141
|
+
}
|
142
|
+
return message;
|
143
|
+
}
|
144
|
+
|
145
|
+
public function onWarning(warning:ITestWarning):void {
|
146
|
+
warnings.push(warning.toString());
|
147
|
+
}
|
148
|
+
|
149
|
+
public function onTestStarted(test:Object):void {
|
150
|
+
startTime = getTimer();
|
151
|
+
updateTextDisplay();
|
152
|
+
}
|
153
|
+
|
154
|
+
public function onTestCompleted(test:Object):void {
|
155
|
+
var duration:Number = getTimer() - startTime;
|
156
|
+
testTimes.push({test:test, duration:duration});
|
157
|
+
updateTextDisplay();
|
158
|
+
}
|
159
|
+
|
160
|
+
public function onRunCompleted(result:IResult):void {
|
161
|
+
runCompleted = true;
|
162
|
+
if(result.runCount == 0) {
|
163
|
+
println("[WARNING] No tests were found or executed.");
|
164
|
+
println();
|
165
|
+
return;
|
166
|
+
}
|
167
|
+
|
168
|
+
printTimeSummary();
|
169
|
+
|
170
|
+
if(result.wasSuccessful) {
|
171
|
+
print("OK");
|
172
|
+
println (" (" + result.runCount + " test" + (result.runCount == 1 ? "": "s") + ")");
|
173
|
+
}
|
174
|
+
else {
|
175
|
+
println("FAILURES!!!");
|
176
|
+
println("Tests run: " + result.runCount
|
177
|
+
+ ", Failures: " + result.failureCount
|
178
|
+
+ ", Errors: " + result.errorCount
|
179
|
+
+ ", Ignored: " + result.ignoredTestCount
|
180
|
+
);
|
181
|
+
}
|
182
|
+
if(displayPerformanceDetails) {
|
183
|
+
printPerformanceDetails();
|
184
|
+
}
|
185
|
+
updateTextDisplay();
|
186
|
+
logResult();
|
187
|
+
}
|
188
|
+
|
189
|
+
protected function logResult():void {
|
190
|
+
if(traceOnComplete) {
|
191
|
+
trace(toString());
|
192
|
+
}
|
193
|
+
}
|
194
|
+
|
195
|
+
private function print(str:String):void {
|
196
|
+
footer += str;
|
197
|
+
}
|
198
|
+
|
199
|
+
private function println(str:String = ""):void {
|
200
|
+
print(str + "\n");
|
201
|
+
}
|
202
|
+
|
203
|
+
private function printTimeSummary():void {
|
204
|
+
testTimes.sortOn('duration', Array.NUMERIC | Array.DESCENDING);
|
205
|
+
println();
|
206
|
+
var totalTime:Number = 0;
|
207
|
+
var len:Number = testTimes.length;
|
208
|
+
for(var i:uint; i < len; i++) {
|
209
|
+
totalTime += testTimes[i].duration;
|
210
|
+
}
|
211
|
+
println("Total Time: " + totalTime + ' ms');
|
212
|
+
println();
|
213
|
+
}
|
214
|
+
|
215
|
+
private function printPerformanceDetails():void {
|
216
|
+
testTimes.sortOn('duration', Array.NUMERIC | Array.DESCENDING);
|
217
|
+
println();
|
218
|
+
println();
|
219
|
+
println('Time Summary:');
|
220
|
+
println();
|
221
|
+
var len:Number = testTimes.length;
|
222
|
+
var total:Number = 0;
|
223
|
+
var testTime:Object;
|
224
|
+
for (var i:Number = 0; i < len; i++) {
|
225
|
+
testTime = testTimes[i];
|
226
|
+
println(testTime.duration + ' ms : ' + getQualifiedClassName(testTime.test));
|
227
|
+
}
|
228
|
+
}
|
229
|
+
|
230
|
+
override public function toString():String {
|
231
|
+
var parts:Array = [];
|
232
|
+
parts.push(header);
|
233
|
+
var len:int = dots.length;
|
234
|
+
var str:String = '';
|
235
|
+
for(var i:int; i < len; i++) {
|
236
|
+
str += dots[i];
|
237
|
+
}
|
238
|
+
parts.push(str);
|
239
|
+
|
240
|
+
if(runCompleted) {
|
241
|
+
if(failures.length > 0) {
|
242
|
+
parts = parts.concat(failures);
|
243
|
+
}
|
244
|
+
if(warnings.length > 0) {
|
245
|
+
parts = parts.concat(warnings);
|
246
|
+
}
|
247
|
+
if(ignores.length > 0) {
|
248
|
+
// Tighten up the ignores line breaks:
|
249
|
+
parts.push(ignores.join("\n"));
|
250
|
+
}
|
251
|
+
parts.push(footer);
|
252
|
+
}
|
253
|
+
return parts.join("\n\n") + "\n\n";
|
254
|
+
}
|
255
|
+
|
256
|
+
private function updateTextDisplay():void {
|
257
|
+
if(textDisplay) {
|
258
|
+
textDisplay.text = toString();
|
259
|
+
updateResultBar();
|
260
|
+
}
|
261
|
+
}
|
262
|
+
|
263
|
+
private function updateResultBar():void {
|
264
|
+
if(stage) {
|
265
|
+
var color:uint = (failures.length > 0) ? 0xFF0000 : 0x00FF00;
|
266
|
+
resultBar.graphics.clear();
|
267
|
+
resultBar.graphics.beginFill(color);
|
268
|
+
resultBar.graphics.drawRect(0, 0, stage.stageWidth, resultBarHeight);
|
269
|
+
resultBar.y = stage.stageHeight - resultBarHeight;
|
270
|
+
}
|
271
|
+
}
|
272
|
+
|
273
|
+
private function onAddedToStage(event:Event):void {
|
274
|
+
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
|
275
|
+
addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
|
276
|
+
initializeDisplay();
|
277
|
+
updateTextDisplay();
|
278
|
+
}
|
279
|
+
|
280
|
+
private function onRemovedFromStage(event:Event):void {
|
281
|
+
stage.removeEventListener(Event.RESIZE, onStageResize);
|
282
|
+
}
|
283
|
+
|
284
|
+
private function onStageResize(event:Event):void {
|
285
|
+
backgroundFill.width = stage.stageWidth;
|
286
|
+
backgroundFill.height = stage.stageHeight;
|
287
|
+
textDisplay.width = stage.stageWidth;
|
288
|
+
textDisplay.height = stage.stageHeight;
|
289
|
+
updateResultBar();
|
290
|
+
}
|
291
|
+
|
292
|
+
private function initializeDisplay():void {
|
293
|
+
stage.align = StageAlign.TOP_LEFT;
|
294
|
+
stage.scaleMode = StageScaleMode.NO_SCALE;
|
295
|
+
stage.addEventListener(Event.RESIZE, onStageResize);
|
296
|
+
|
297
|
+
backgroundFill = new Shape();
|
298
|
+
backgroundFill.graphics.beginFill(backgroundColor);
|
299
|
+
backgroundFill.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
|
300
|
+
addChild(backgroundFill);
|
301
|
+
|
302
|
+
textDisplay = new TextField();
|
303
|
+
textDisplay.multiline = true;
|
304
|
+
textDisplay.wordWrap = true;
|
305
|
+
textDisplay.textColor = textColor;
|
306
|
+
textDisplay.x = 0;
|
307
|
+
textDisplay.y = 0;
|
308
|
+
textDisplay.width = stage.stageWidth;
|
309
|
+
textDisplay.height = stage.stageHeight;
|
310
|
+
|
311
|
+
var format:TextFormat = textDisplay.getTextFormat();
|
312
|
+
format.font = '_sans';
|
313
|
+
format.size = FONT_SIZE;
|
314
|
+
format.leftMargin = 5;
|
315
|
+
format.rightMargin = 5;
|
316
|
+
textDisplay.defaultTextFormat = format;
|
317
|
+
|
318
|
+
addChild(textDisplay);
|
319
|
+
|
320
|
+
resultBar = new Shape();
|
321
|
+
addChild(resultBar);
|
322
|
+
}
|
323
|
+
}
|
324
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
package asunit.runners {
|
2
|
+
|
3
|
+
import asunit.framework.LegacyTestIterator;
|
4
|
+
import asunit.framework.TestIterator;
|
5
|
+
|
6
|
+
public class LegacyRunner extends TestRunner {
|
7
|
+
|
8
|
+
override protected function createTestIterator(test:*, testMethodName:String):TestIterator {
|
9
|
+
return new LegacyTestIterator(test, testMethodName);
|
10
|
+
}
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
@@ -0,0 +1,125 @@
|
|
1
|
+
package asunit.runners {
|
2
|
+
|
3
|
+
import asunit.framework.CallbackBridge;
|
4
|
+
import asunit.framework.IResult;
|
5
|
+
import asunit.framework.IRunner;
|
6
|
+
import asunit.framework.IRunnerFactory;
|
7
|
+
import asunit.framework.RunnerFactory;
|
8
|
+
import asunit.util.Iterator;
|
9
|
+
import asunit.framework.SuiteIterator;
|
10
|
+
|
11
|
+
import flash.display.DisplayObjectContainer;
|
12
|
+
import flash.events.Event;
|
13
|
+
import flash.events.EventDispatcher;
|
14
|
+
import flash.events.IEventDispatcher;
|
15
|
+
import flash.events.TimerEvent;
|
16
|
+
import flash.utils.Timer;
|
17
|
+
import flash.utils.getDefinitionByName;
|
18
|
+
|
19
|
+
import p2.reflect.Reflection;
|
20
|
+
import p2.reflect.ReflectionMetaData;
|
21
|
+
|
22
|
+
public class SuiteRunner implements IEventDispatcher, IRunner {
|
23
|
+
|
24
|
+
[Inject]
|
25
|
+
public var bridge:CallbackBridge;
|
26
|
+
|
27
|
+
protected var dispatcher:IEventDispatcher;
|
28
|
+
protected var testClasses:Iterator;
|
29
|
+
protected var timer:Timer;
|
30
|
+
protected var visualContext:DisplayObjectContainer;
|
31
|
+
protected var testMethod:String;
|
32
|
+
|
33
|
+
private var _factory:IRunnerFactory;
|
34
|
+
|
35
|
+
public function SuiteRunner() {
|
36
|
+
timer = new Timer(0, 1);
|
37
|
+
dispatcher = new EventDispatcher();
|
38
|
+
}
|
39
|
+
|
40
|
+
public function run(suite:Class, testMethod:String=null, visualContext:DisplayObjectContainer=null):void {
|
41
|
+
this.visualContext = visualContext;
|
42
|
+
this.testMethod = testMethod;
|
43
|
+
runSuite(suite);
|
44
|
+
}
|
45
|
+
|
46
|
+
public function shouldRunTest(testClass:Class):Boolean {
|
47
|
+
return bridge.shouldRunTest(testClass);
|
48
|
+
}
|
49
|
+
|
50
|
+
public function set factory(factory:IRunnerFactory):void {
|
51
|
+
_factory = factory;
|
52
|
+
}
|
53
|
+
|
54
|
+
public function get factory():IRunnerFactory {
|
55
|
+
return _factory ||= new RunnerFactory();
|
56
|
+
}
|
57
|
+
|
58
|
+
protected function runSuite(suite:*):void {
|
59
|
+
testClasses = new SuiteIterator(suite, bridge);
|
60
|
+
timer.addEventListener(TimerEvent.TIMER, runNextTest);
|
61
|
+
|
62
|
+
runNextTest();
|
63
|
+
}
|
64
|
+
|
65
|
+
protected function runNextTest(e:TimerEvent = null):void{
|
66
|
+
if (!testClasses.hasNext()) {
|
67
|
+
onSuiteCompleted();
|
68
|
+
return;
|
69
|
+
}
|
70
|
+
|
71
|
+
var testClass:Class = testClasses.next();
|
72
|
+
// [luke] TODO: This runnerFor call can throw exceptions,
|
73
|
+
// we need to handle them in some way.
|
74
|
+
var runner:IRunner = factory.runnerFor(testClass);
|
75
|
+
runner.addEventListener(Event.COMPLETE, onTestCompleted);
|
76
|
+
// [luke] TODO: There should be a clear search,
|
77
|
+
// and clear failure when testMethod is provided,
|
78
|
+
// but not found...
|
79
|
+
runner.run(testClass, testMethod, visualContext);
|
80
|
+
}
|
81
|
+
|
82
|
+
protected function onTestCompleted(e:Event):void {
|
83
|
+
e.target.removeEventListener(Event.COMPLETE, onTestCompleted);
|
84
|
+
// Start a new green thread.
|
85
|
+
timer.reset();
|
86
|
+
timer.start();
|
87
|
+
}
|
88
|
+
|
89
|
+
protected function onSuiteCompleted():void {
|
90
|
+
timer.removeEventListener(TimerEvent.TIMER, runNextTest);
|
91
|
+
dispatchEvent(new Event(Event.COMPLETE));
|
92
|
+
}
|
93
|
+
|
94
|
+
/**
|
95
|
+
* Template method that subclasses can override to perform some
|
96
|
+
* operation when the run is complete.
|
97
|
+
*/
|
98
|
+
protected function onRunCompleted():void {
|
99
|
+
}
|
100
|
+
|
101
|
+
// BEGIN: Implement the IEvent Dispatcher Interface:
|
102
|
+
|
103
|
+
public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void {
|
104
|
+
dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
|
105
|
+
}
|
106
|
+
|
107
|
+
public function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void {
|
108
|
+
dispatcher.removeEventListener(type, listener, useCapture);
|
109
|
+
}
|
110
|
+
|
111
|
+
public function dispatchEvent(event:Event):Boolean {
|
112
|
+
return dispatcher.dispatchEvent(event);
|
113
|
+
}
|
114
|
+
|
115
|
+
public function hasEventListener(type:String):Boolean {
|
116
|
+
return dispatcher.hasEventListener(type);
|
117
|
+
}
|
118
|
+
|
119
|
+
public function willTrigger(type:String):Boolean {
|
120
|
+
return dispatcher.willTrigger(type);
|
121
|
+
}
|
122
|
+
|
123
|
+
// END: Implement the IEvent Dispatcher Interface:
|
124
|
+
}
|
125
|
+
}
|