asunit4 4.2.1.pre
Sign up to get free protection for your applications and to get access to all the features.
- 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,24 @@
|
|
1
|
+
package asunit.framework {
|
2
|
+
|
3
|
+
/**
|
4
|
+
* MessageBridge is a marker interface that is used
|
5
|
+
* by AsUnit core in order to support custom messaging
|
6
|
+
* schemes between TestObservers and IRunners.
|
7
|
+
*
|
8
|
+
* The idea is that you [Inject] one or more entities
|
9
|
+
* into your concrete IRunner and related TestObservers.
|
10
|
+
*
|
11
|
+
* The contract is between the concrete MessageBridge,
|
12
|
+
* and the other actors that [Inject] it into.
|
13
|
+
*
|
14
|
+
* This implementation gives AsUnit the ability to support
|
15
|
+
* a variety of messaging protocols including native
|
16
|
+
* Flash EventDispatchers, callbacks, and even progressive
|
17
|
+
* systems like AS3Signals. The decision as to which
|
18
|
+
* messaging system to use is made by the person creating
|
19
|
+
* the concrete Runner and Observer.
|
20
|
+
*/
|
21
|
+
public interface MessageBridge {
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
@@ -0,0 +1,80 @@
|
|
1
|
+
package asunit.framework {
|
2
|
+
|
3
|
+
import p2.reflect.Reflection;
|
4
|
+
import p2.reflect.ReflectionMethod;
|
5
|
+
import p2.reflect.ReflectionMetaData;
|
6
|
+
|
7
|
+
public class Method {
|
8
|
+
|
9
|
+
private var _scopeName:String;
|
10
|
+
|
11
|
+
public var expects:String;
|
12
|
+
public var ignore:Boolean;
|
13
|
+
public var ignoreDescription:String;
|
14
|
+
public var metadata:ReflectionMetaData;
|
15
|
+
public var name:String;
|
16
|
+
public var order:int = 0;
|
17
|
+
public var scope:Object;
|
18
|
+
public var timeout:int = -1;
|
19
|
+
public var value:Function;
|
20
|
+
|
21
|
+
public function Method(scope:Object, reflection:ReflectionMethod) {
|
22
|
+
this.scope = scope;
|
23
|
+
this.name = reflection.name;
|
24
|
+
this.value = scope[reflection.name];
|
25
|
+
|
26
|
+
metadata = reflection.getMetaDataByName('Test');
|
27
|
+
|
28
|
+
if(metadata != null) {
|
29
|
+
var ignoreReflection:ReflectionMetaData = reflection.getMetaDataByName('Ignore');
|
30
|
+
if(ignoreReflection) {
|
31
|
+
ignore = true;
|
32
|
+
ignoreDescription = ignoreReflection.getValueFor('description');
|
33
|
+
}
|
34
|
+
|
35
|
+
handleTimeoutMetaData();
|
36
|
+
applyMetaData('expects');
|
37
|
+
applyMetaData('order');
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
public function get scopeName():String {
|
42
|
+
return _scopeName ||= Reflection.create(scope).name
|
43
|
+
}
|
44
|
+
|
45
|
+
private function handleTimeoutMetaData():void {
|
46
|
+
var value:* = metadata.getValueFor('timeout');
|
47
|
+
if(value != null) {
|
48
|
+
var message:String = "It seems you're using [Test(timeout=n)] for " + name + ", but this has been deprecated.\n";
|
49
|
+
message += "If you'd like to set a different timeout value, please send it to your Async instance methods like: async.add(null, timeoutInMilliseconds)";
|
50
|
+
trace("[DEPRECATION WARNING] " + message);
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
// The null response for timeout was updating the
|
55
|
+
// int field to zero when it needs to be -1...
|
56
|
+
private function applyMetaData(name:String):void {
|
57
|
+
var value:* = metadata.getValueFor(name);
|
58
|
+
if(value != null) {
|
59
|
+
this[name] = value;
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
public function execute():void {
|
64
|
+
value.call(scope);
|
65
|
+
}
|
66
|
+
|
67
|
+
public function get isTest():Boolean {
|
68
|
+
return (metadata != null || isLegacyTest);
|
69
|
+
}
|
70
|
+
|
71
|
+
public function get isLegacyTest():Boolean {
|
72
|
+
return (metadata == null && name.match(/^test/));
|
73
|
+
}
|
74
|
+
|
75
|
+
public function toString():String {
|
76
|
+
return name;
|
77
|
+
}
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
@@ -0,0 +1,181 @@
|
|
1
|
+
package asunit.framework {
|
2
|
+
|
3
|
+
import asunit.errors.UsageError;
|
4
|
+
import asunit.framework.ITestFailure;
|
5
|
+
|
6
|
+
import flash.events.EventDispatcher;
|
7
|
+
import flash.utils.Dictionary;
|
8
|
+
|
9
|
+
/**
|
10
|
+
* A <code>Result</code> collects the results of executing
|
11
|
+
* a test case. It is an instance of the Collecting Parameter pattern.
|
12
|
+
* The test framework distinguishes between <i>failures</i> and <i>errors</i>.
|
13
|
+
* A failure is anticipated and checked for with assertions. Errors are
|
14
|
+
* unanticipated problems like an <code>ArrayIndexOutOfBoundsException</code>.
|
15
|
+
*
|
16
|
+
* @see Test
|
17
|
+
*/
|
18
|
+
public class Result extends EventDispatcher implements IResult {
|
19
|
+
|
20
|
+
protected var _runCount:uint = 0;
|
21
|
+
protected var _runTime:Number;
|
22
|
+
protected var _errors:Array;
|
23
|
+
protected var _failures:Array;
|
24
|
+
protected var _ignoredTests:Array;
|
25
|
+
protected var _successes:Array;
|
26
|
+
protected var _warnings:Array;
|
27
|
+
|
28
|
+
protected var listeners:Array;
|
29
|
+
protected var runComplete:Boolean;
|
30
|
+
protected var knownTests:Dictionary;
|
31
|
+
|
32
|
+
public function Result() {
|
33
|
+
_errors = [];
|
34
|
+
_failures = [];
|
35
|
+
_ignoredTests = [];
|
36
|
+
_successes = [];
|
37
|
+
_warnings = [];
|
38
|
+
listeners = [];
|
39
|
+
knownTests = new Dictionary();
|
40
|
+
}
|
41
|
+
|
42
|
+
public function get errors():Array { return _errors; }
|
43
|
+
|
44
|
+
/**
|
45
|
+
* Gets the number of detected errors.
|
46
|
+
*/
|
47
|
+
public function get errorCount():uint { return _errors.length; }
|
48
|
+
|
49
|
+
/**
|
50
|
+
*
|
51
|
+
*/
|
52
|
+
public function get failures():Array { return _failures; }
|
53
|
+
|
54
|
+
/**
|
55
|
+
* Gets the number of detected failures.
|
56
|
+
*/
|
57
|
+
public function get failureCount():uint { return _failures.length; }
|
58
|
+
|
59
|
+
public function get successes():Array { return _successes; }
|
60
|
+
|
61
|
+
public function get successCount():uint { return _successes.length; }
|
62
|
+
|
63
|
+
public function get warnings():Array { return _warnings; }
|
64
|
+
|
65
|
+
public function get ignoredTests():Array { return _ignoredTests; }
|
66
|
+
|
67
|
+
public function get ignoredTestCount():uint { return _ignoredTests.length; }
|
68
|
+
|
69
|
+
public function get runCount():uint {
|
70
|
+
return errorCount + failureCount + successCount;
|
71
|
+
}
|
72
|
+
|
73
|
+
public function get runTime():Number { return _runTime; }
|
74
|
+
public function set runTime(value:Number):void { _runTime = value; }
|
75
|
+
|
76
|
+
public function shouldRunTest(testClass:Class):Boolean {
|
77
|
+
if(!knownTests[testClass]) {
|
78
|
+
knownTests[testClass] = testClass;
|
79
|
+
return true;
|
80
|
+
}
|
81
|
+
return false;
|
82
|
+
}
|
83
|
+
|
84
|
+
public function addObserver(observer:TestObserver):void {
|
85
|
+
if(!(observer is IRunListener)) {
|
86
|
+
throw new UsageError("Result.addObserver called with an instance that wasn't an IRunListener. This should work soon, but doesn't yet...");
|
87
|
+
}
|
88
|
+
addListener(IRunListener(observer));
|
89
|
+
}
|
90
|
+
|
91
|
+
public function addListener(listener:IRunListener):void {
|
92
|
+
if (listeners.indexOf(listener) >= 0) return;
|
93
|
+
listeners.push(listener);
|
94
|
+
}
|
95
|
+
|
96
|
+
public function removeListener(listener:IRunListener):void {
|
97
|
+
listeners.splice(listeners.indexOf(listener), 1);
|
98
|
+
}
|
99
|
+
|
100
|
+
public function onRunStarted():void {
|
101
|
+
for each (var listener:IRunListener in listeners) {
|
102
|
+
listener.onRunStarted();
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
public function onRunCompleted(result:IResult):void {
|
107
|
+
runComplete = true;
|
108
|
+
for each (var listener:IRunListener in listeners) {
|
109
|
+
listener.onRunCompleted(this);
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
public function onTestStarted(test:Object):void {
|
114
|
+
for each (var listener:IRunListener in listeners) {
|
115
|
+
listener.onTestStarted(test);
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|
119
|
+
public function onTestCompleted(test:Object):void {
|
120
|
+
for each (var listener:IRunListener in listeners) {
|
121
|
+
listener.onTestCompleted(test);
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
/**
|
126
|
+
* Adds a failure to the list of failures. The passed in exception
|
127
|
+
* caused the failure.
|
128
|
+
*/
|
129
|
+
public function onTestFailure(failure:ITestFailure):void {
|
130
|
+
if (failure.isFailure)
|
131
|
+
_failures.push(failure);
|
132
|
+
else
|
133
|
+
_errors.push(failure);
|
134
|
+
|
135
|
+
for each (var listener:IRunListener in listeners) {
|
136
|
+
listener.onTestFailure(failure);
|
137
|
+
}
|
138
|
+
}
|
139
|
+
|
140
|
+
public function onTestSuccess(success:ITestSuccess):void {
|
141
|
+
_successes.push(success);
|
142
|
+
|
143
|
+
for each (var listener:IRunListener in listeners) {
|
144
|
+
listener.onTestSuccess(success);
|
145
|
+
}
|
146
|
+
}
|
147
|
+
|
148
|
+
public function onTestIgnored(method:Method):void {
|
149
|
+
_ignoredTests.push(method);
|
150
|
+
|
151
|
+
for each (var listener:IRunListener in listeners) {
|
152
|
+
listener.onTestIgnored(method);
|
153
|
+
}
|
154
|
+
}
|
155
|
+
|
156
|
+
public function onWarning(warning:ITestWarning):void {
|
157
|
+
_warnings.push(warning);
|
158
|
+
|
159
|
+
for each (var listener:IRunListener in listeners) {
|
160
|
+
listener.onWarning(warning);
|
161
|
+
}
|
162
|
+
}
|
163
|
+
|
164
|
+
/**
|
165
|
+
* Returns whether or not we have yet encountered a failure or error.
|
166
|
+
* Will be accurate when checked at any time during test run.
|
167
|
+
*/
|
168
|
+
public function get failureEncountered():Boolean {
|
169
|
+
return (failureCount > 0 || errorCount > 0);
|
170
|
+
}
|
171
|
+
|
172
|
+
/**
|
173
|
+
* Returns whether or not the entire test was successful.
|
174
|
+
* Will only return true after +onRunCompleted+ called.
|
175
|
+
*/
|
176
|
+
public function get wasSuccessful():Boolean {
|
177
|
+
return (runComplete && !failureEncountered);
|
178
|
+
}
|
179
|
+
|
180
|
+
}
|
181
|
+
}
|
@@ -0,0 +1,179 @@
|
|
1
|
+
package asunit.framework {
|
2
|
+
|
3
|
+
import asunit.errors.UsageError;
|
4
|
+
import asunit.runners.LegacyRunner;
|
5
|
+
import asunit.runners.TestRunner;
|
6
|
+
import asunit.runners.SuiteRunner;
|
7
|
+
|
8
|
+
import flash.utils.getDefinitionByName;
|
9
|
+
|
10
|
+
import p2.reflect.Reflection;
|
11
|
+
import p2.reflect.ReflectionMetaData;
|
12
|
+
import asunit.framework.InjectionDelegate;
|
13
|
+
|
14
|
+
public class RunnerFactory implements IRunnerFactory {
|
15
|
+
|
16
|
+
public static var DEFAULT_SUITE_RUNNER:Class = SuiteRunner;
|
17
|
+
public static var DEFAULT_TEST_RUNNER:Class = TestRunner;
|
18
|
+
|
19
|
+
/**
|
20
|
+
* The DefaultTestRunner will be updated whenever
|
21
|
+
* a TestSuite is encountered that has a [RunWith]
|
22
|
+
* declaration.
|
23
|
+
*
|
24
|
+
* All subsequent create calls for a Test that
|
25
|
+
* don't have a RunWith will use the IRunner that
|
26
|
+
* was defined on the Suite.
|
27
|
+
*
|
28
|
+
*/
|
29
|
+
public var DefaultTestRunner:Class;
|
30
|
+
|
31
|
+
/**
|
32
|
+
* The DefaultSuiteRunner is what
|
33
|
+
* we use for all TestSuites
|
34
|
+
*/
|
35
|
+
public var DefaultSuiteRunner:Class;
|
36
|
+
|
37
|
+
public function RunnerFactory() {
|
38
|
+
DefaultSuiteRunner = DEFAULT_SUITE_RUNNER;
|
39
|
+
DefaultTestRunner = DEFAULT_TEST_RUNNER;
|
40
|
+
injector = new InjectionDelegate();
|
41
|
+
}
|
42
|
+
|
43
|
+
private var _injector:InjectionDelegate;
|
44
|
+
|
45
|
+
public function get injector():InjectionDelegate
|
46
|
+
{
|
47
|
+
return _injector;
|
48
|
+
}
|
49
|
+
|
50
|
+
public function set injector(value:InjectionDelegate):void
|
51
|
+
{
|
52
|
+
_injector = value;
|
53
|
+
}
|
54
|
+
|
55
|
+
/**
|
56
|
+
* runnerFor is the primary inerface to the RunnerFactory
|
57
|
+
*/
|
58
|
+
public function runnerFor(testOrSuite:Class):IRunner {
|
59
|
+
//trace(">> runnerFor: " + testOrSuite + " with current default of: " + DefaultTestRunner);
|
60
|
+
validate(testOrSuite);
|
61
|
+
return getRunnerForTestOrSuite(testOrSuite);
|
62
|
+
}
|
63
|
+
|
64
|
+
protected function validate(testOrSuite:Class):void {
|
65
|
+
if(testOrSuite == null) {
|
66
|
+
throw new UsageError("RunnerFactory.runnerFor must be provided with a known test or suite class");
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
protected function getRunnerForTestOrSuite(testOrSuite:Class):IRunner {
|
71
|
+
var reflection:Reflection = Reflection.create(testOrSuite);
|
72
|
+
if(RunnerFactory.isSuite(reflection)) {
|
73
|
+
return getRunnerForSuite(reflection);
|
74
|
+
}
|
75
|
+
else if(RunnerFactory.isLegacyTest(reflection)) {
|
76
|
+
return getLegacyRunnerForTest(reflection);
|
77
|
+
}
|
78
|
+
else if(RunnerFactory.isTest(reflection)) {
|
79
|
+
return getRunnerForTest(reflection);
|
80
|
+
}
|
81
|
+
|
82
|
+
throw new UsageError("RunnerFactory was asked for a Runner, but was not able to identify: " + reflection.name + " as a LegacyTest, Test or Suite.");
|
83
|
+
return null;
|
84
|
+
}
|
85
|
+
|
86
|
+
protected function getRunnerForSuite(reflection:Reflection):IRunner {
|
87
|
+
// First update the DefaultTestRunner with the provided RunWith
|
88
|
+
// if necessary...
|
89
|
+
var Constructor:Class = getRunWithConstructor(reflection);
|
90
|
+
if(Constructor) {
|
91
|
+
DefaultTestRunner = Constructor;
|
92
|
+
}
|
93
|
+
// Always return the default Suite Runner:
|
94
|
+
var runner:IRunner = new DefaultSuiteRunner();
|
95
|
+
configureRunner(runner);
|
96
|
+
return runner;
|
97
|
+
}
|
98
|
+
|
99
|
+
protected function getLegacyRunnerForTest(reflection:Reflection):IRunner {
|
100
|
+
var runner:IRunner = new LegacyRunner();
|
101
|
+
configureRunner(runner);
|
102
|
+
return runner;
|
103
|
+
}
|
104
|
+
|
105
|
+
protected function getRunnerForTest(reflection:Reflection):IRunner {
|
106
|
+
// Use the provided RunWith class, or the DefaultTestRunner (this may
|
107
|
+
// have been overridden by a parent Suite
|
108
|
+
var Constructor:Class = getRunWithConstructor(reflection) || DefaultTestRunner;
|
109
|
+
//FIXME: This will choke if given a class with constructor arguments!
|
110
|
+
var runner:IRunner = new Constructor();
|
111
|
+
configureRunner(runner);
|
112
|
+
return runner;
|
113
|
+
}
|
114
|
+
|
115
|
+
protected function getRunWithConstructor(reflection:Reflection):Class {
|
116
|
+
var runWith:ReflectionMetaData = getRunWithDeclaration(reflection);
|
117
|
+
|
118
|
+
if(runWith) {
|
119
|
+
if(runWith.args.length == 0) {
|
120
|
+
throw new UsageError("Encountered [RunWith] declaration that's missing the class argument. Try [RunWith(my.class.Name)] instead.");
|
121
|
+
}
|
122
|
+
try {
|
123
|
+
var className:String = runWith.args[0];
|
124
|
+
return getDefinitionByName(className) as Class;
|
125
|
+
}
|
126
|
+
catch(e:ReferenceError) {
|
127
|
+
var message:String = "Encountered [RunWith] declaration but cannot instantiate the provided runner. " + className + ". ";
|
128
|
+
message += "Is there an actual reference to this class somewhere in your project?";
|
129
|
+
throw new UsageError(message);
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
133
|
+
return null;
|
134
|
+
}
|
135
|
+
|
136
|
+
protected function getRunWithDeclaration(reflection:Reflection):ReflectionMetaData {
|
137
|
+
var result:ReflectionMetaData = reflection.getMetaDataByName('RunWith');
|
138
|
+
if(result) {
|
139
|
+
return result;
|
140
|
+
}
|
141
|
+
|
142
|
+
var baseClass:*;
|
143
|
+
var baseClassReflection:Reflection;
|
144
|
+
var len:int = reflection.extendedClasses.length;
|
145
|
+
for(var i:int; i < len; i++) {
|
146
|
+
baseClass = getDefinitionByName(reflection.extendedClasses[i]);
|
147
|
+
baseClassReflection = Reflection.create(baseClass);
|
148
|
+
result = baseClassReflection.getMetaDataByName('RunWith');
|
149
|
+
if(result) {
|
150
|
+
return result;
|
151
|
+
}
|
152
|
+
}
|
153
|
+
return null;
|
154
|
+
}
|
155
|
+
|
156
|
+
/**
|
157
|
+
* @private
|
158
|
+
*/
|
159
|
+
protected function configureRunner(runner:IRunner):void
|
160
|
+
{
|
161
|
+
runner.factory = this;
|
162
|
+
injector.updateInjectionPoints(runner, InjectionDelegate.THROW_ERROR_ON_MISSING_INJECTION_POINT);
|
163
|
+
}
|
164
|
+
|
165
|
+
public static function isSuite(reflection:Reflection):Boolean {
|
166
|
+
return (reflection.getMetaDataByName('Suite') != null);
|
167
|
+
}
|
168
|
+
|
169
|
+
public static function isLegacyTest(reflection:Reflection):Boolean {
|
170
|
+
return reflection.isA('asunit.framework.TestCase');
|
171
|
+
}
|
172
|
+
|
173
|
+
public static function isTest(reflection:Reflection):Boolean {
|
174
|
+
var testMethods:Array = reflection.getMethodsByMetaData('Test');
|
175
|
+
var runWith:ReflectionMetaData = reflection.getMetaDataByName('RunWith');
|
176
|
+
return (runWith != null || testMethods.length > 0);
|
177
|
+
}
|
178
|
+
}
|
179
|
+
}
|
@@ -0,0 +1,71 @@
|
|
1
|
+
package asunit.framework {
|
2
|
+
|
3
|
+
import asunit.util.Iterator;
|
4
|
+
|
5
|
+
import flash.utils.getDefinitionByName;
|
6
|
+
|
7
|
+
import p2.reflect.Reflection;
|
8
|
+
import p2.reflect.ReflectionVariable;
|
9
|
+
import p2.reflect.ReflectionMetaData;
|
10
|
+
|
11
|
+
public class SuiteIterator implements Iterator {
|
12
|
+
|
13
|
+
protected var index:int;
|
14
|
+
protected var list:Array;
|
15
|
+
|
16
|
+
public function SuiteIterator(Suite:Class, bridge:CallbackBridge=null) {
|
17
|
+
list = getTestClasses(Suite, bridge);
|
18
|
+
}
|
19
|
+
|
20
|
+
private function getTestClasses(Suite:Class, bridge:CallbackBridge=null):Array {
|
21
|
+
if(bridge == null) bridge = new CallbackBridge();
|
22
|
+
|
23
|
+
var reflection:Reflection = Reflection.create(Suite);
|
24
|
+
|
25
|
+
if(!isSuite(reflection) && isTest(reflection)) {
|
26
|
+
return [Suite];
|
27
|
+
}
|
28
|
+
|
29
|
+
var variable:ReflectionVariable;
|
30
|
+
var TestConstructor:Class;
|
31
|
+
var response:Array = [];
|
32
|
+
for each(variable in reflection.variables) {
|
33
|
+
TestConstructor = Class(getDefinitionByName(variable.type));
|
34
|
+
if(isSuite(Reflection.create(TestConstructor))) {
|
35
|
+
response = response.concat( getTestClasses(TestConstructor, bridge) );
|
36
|
+
}
|
37
|
+
else if(bridge.shouldRunTest(TestConstructor)) {
|
38
|
+
response.push(TestConstructor);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
response.sort();
|
42
|
+
return response;
|
43
|
+
}
|
44
|
+
|
45
|
+
public function get length():uint {
|
46
|
+
return list.length;
|
47
|
+
}
|
48
|
+
|
49
|
+
private function isSuite(reflection:Reflection):Boolean {
|
50
|
+
return RunnerFactory.isSuite(reflection);
|
51
|
+
}
|
52
|
+
|
53
|
+
private function isTest(reflection:Reflection):Boolean {
|
54
|
+
return RunnerFactory.isTest(reflection);
|
55
|
+
}
|
56
|
+
|
57
|
+
public function hasNext():Boolean {
|
58
|
+
return list[index] != null;
|
59
|
+
}
|
60
|
+
|
61
|
+
// Returns a Class reference:
|
62
|
+
public function next():* {
|
63
|
+
return list[index++];
|
64
|
+
}
|
65
|
+
|
66
|
+
public function reset():void {
|
67
|
+
index = 0;
|
68
|
+
}
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
@@ -0,0 +1,106 @@
|
|
1
|
+
package asunit.framework {
|
2
|
+
|
3
|
+
import asunit.framework.Assert;
|
4
|
+
import asunit.framework.IAsync;
|
5
|
+
|
6
|
+
import flash.display.DisplayObject;
|
7
|
+
import flash.display.DisplayObjectContainer;
|
8
|
+
import flash.display.Sprite;
|
9
|
+
|
10
|
+
[RunWith("asunit.runners.LegacyRunner")]
|
11
|
+
public class TestCase {
|
12
|
+
|
13
|
+
public function TestCase(testMethod:String=null) {
|
14
|
+
}
|
15
|
+
|
16
|
+
[Inject]
|
17
|
+
public var asyncDelegate:IAsync;
|
18
|
+
|
19
|
+
[Inject]
|
20
|
+
public var context:Sprite;
|
21
|
+
|
22
|
+
[Before]
|
23
|
+
public function callSetUp():void {
|
24
|
+
setUp();
|
25
|
+
}
|
26
|
+
|
27
|
+
protected function setUp():void {
|
28
|
+
}
|
29
|
+
|
30
|
+
[After]
|
31
|
+
public function callTearDown():void {
|
32
|
+
tearDown();
|
33
|
+
}
|
34
|
+
|
35
|
+
protected function tearDown():void {
|
36
|
+
}
|
37
|
+
|
38
|
+
protected function addAsync(handler:Function, timeout:int=-1):Function {
|
39
|
+
return asyncDelegate.add(handler, timeout);
|
40
|
+
}
|
41
|
+
|
42
|
+
protected function getContext():DisplayObjectContainer {
|
43
|
+
return context;
|
44
|
+
}
|
45
|
+
|
46
|
+
protected function addChild(child:DisplayObject):DisplayObject {
|
47
|
+
context.addChild(child);
|
48
|
+
return child;
|
49
|
+
}
|
50
|
+
|
51
|
+
protected function removeChild(child:DisplayObject):DisplayObject {
|
52
|
+
if(child && child.parent === context) {
|
53
|
+
context.removeChild(child);
|
54
|
+
}
|
55
|
+
return child;
|
56
|
+
}
|
57
|
+
|
58
|
+
protected function assertTrue(...args:Array):void {
|
59
|
+
Assert.assertTrue.apply(null, args);
|
60
|
+
}
|
61
|
+
|
62
|
+
public function assertFalse(...args:Array):void {
|
63
|
+
Assert.assertFalse.apply(null, args);
|
64
|
+
}
|
65
|
+
|
66
|
+
protected function fail(message:String):void {
|
67
|
+
Assert.fail(message);
|
68
|
+
}
|
69
|
+
|
70
|
+
protected function assertThrows(errorType:Class, block:Function):void {
|
71
|
+
Assert.assertThrows(errorType, block);
|
72
|
+
}
|
73
|
+
|
74
|
+
protected function assertEquals(...args:Array):void {
|
75
|
+
Assert.assertEquals.apply(null, args);
|
76
|
+
}
|
77
|
+
|
78
|
+
protected function assertNotNull(...args:Array):void {
|
79
|
+
Assert.assertNotNull.apply(null, args);
|
80
|
+
}
|
81
|
+
|
82
|
+
protected function assertNull(...args:Array):void {
|
83
|
+
Assert.assertNull.apply(null, args);
|
84
|
+
}
|
85
|
+
|
86
|
+
protected function assertSame(...args:Array):void {
|
87
|
+
Assert.assertSame.apply(null, args);
|
88
|
+
}
|
89
|
+
|
90
|
+
protected function assertNotSame(...args:Array):void {
|
91
|
+
Assert.assertNotSame.apply(null, args);
|
92
|
+
}
|
93
|
+
|
94
|
+
protected function assertEqualsFloat(...args:Array):void {
|
95
|
+
Assert.assertEquals.apply(null, args);
|
96
|
+
}
|
97
|
+
|
98
|
+
protected function assertEqualsArrays(...args:Array):void {
|
99
|
+
Assert.assertEqualsArrays.apply(null, args);
|
100
|
+
}
|
101
|
+
|
102
|
+
protected function assertEqualsArraysIgnoringOrder(...args:Array):void {
|
103
|
+
Assert.assertEqualsArraysIgnoringOrder.apply(null, args);
|
104
|
+
}
|
105
|
+
}
|
106
|
+
}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
package asunit.framework {
|
2
|
+
import asunit.errors.AssertionFailedError;
|
3
|
+
import flash.utils.getQualifiedClassName;
|
4
|
+
import asunit.framework.ITestFailure;
|
5
|
+
|
6
|
+
/**
|
7
|
+
* A <code>TestFailure</code> collects a failed test together with
|
8
|
+
* the caught exception.
|
9
|
+
* @see Result
|
10
|
+
*/
|
11
|
+
public class TestFailure implements ITestFailure {
|
12
|
+
protected var _failedTest:Object;
|
13
|
+
protected var _failedMethod:String;
|
14
|
+
protected var _thrownException:Error;
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Constructs a TestFailure with the given test and exception.
|
18
|
+
*/
|
19
|
+
public function TestFailure(failedTest:Object, methodName:String, thrownException:Error) {
|
20
|
+
_failedTest = failedTest;
|
21
|
+
_failedMethod = methodName;
|
22
|
+
_thrownException = thrownException;
|
23
|
+
}
|
24
|
+
|
25
|
+
public function get failedFeature():String {
|
26
|
+
return getQualifiedClassName(_failedTest) + '.' + _failedMethod;
|
27
|
+
}
|
28
|
+
|
29
|
+
public function get failedMethod():String {
|
30
|
+
return _failedMethod;
|
31
|
+
}
|
32
|
+
|
33
|
+
public function set failedMethod(value:String):void {
|
34
|
+
_failedMethod = value;
|
35
|
+
}
|
36
|
+
|
37
|
+
/**
|
38
|
+
* Gets the failed test case.
|
39
|
+
*/
|
40
|
+
public function get failedTest():Object {
|
41
|
+
return _failedTest;
|
42
|
+
}
|
43
|
+
/**
|
44
|
+
* Gets the thrown exception.
|
45
|
+
*/
|
46
|
+
public function get thrownException():Error {
|
47
|
+
return _thrownException;
|
48
|
+
}
|
49
|
+
/**
|
50
|
+
* Returns a short description of the failure.
|
51
|
+
*/
|
52
|
+
public function toString():String {
|
53
|
+
return '[TestFailure ' + failedMethod + ']';
|
54
|
+
}
|
55
|
+
|
56
|
+
public function get exceptionMessage():String {
|
57
|
+
return thrownException.message;
|
58
|
+
}
|
59
|
+
|
60
|
+
public function get isFailure():Boolean {
|
61
|
+
return thrownException is AssertionFailedError;
|
62
|
+
}
|
63
|
+
|
64
|
+
}
|
65
|
+
}
|