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,282 @@
|
|
1
|
+
package asunit.framework {
|
2
|
+
|
3
|
+
import asunit.errors.UsageError;
|
4
|
+
import asunit.util.ArrayIterator;
|
5
|
+
import asunit.util.Iterator;
|
6
|
+
|
7
|
+
import p2.reflect.Reflection;
|
8
|
+
import p2.reflect.ReflectionMethod;
|
9
|
+
|
10
|
+
public class TestIterator implements Iterator {
|
11
|
+
|
12
|
+
private var _readyToTearDown:Boolean;
|
13
|
+
|
14
|
+
private var afterClassMethods:Iterator;
|
15
|
+
private var afterMethods:Iterator;
|
16
|
+
private var beforeClassMethods:Iterator;
|
17
|
+
private var beforeMethods:Iterator;
|
18
|
+
private var beforeMethodRanLastCycle:Boolean;
|
19
|
+
private var ignoredMethods:Iterator;
|
20
|
+
private var testMethodNameReceived:Boolean;
|
21
|
+
private var setUpHasRunThisCycle:Boolean;
|
22
|
+
private var testMethodHasRunThisCycle:Boolean;
|
23
|
+
private var testMethods:Iterator;
|
24
|
+
|
25
|
+
public function TestIterator(test:Object, testMethodName:String = "") {
|
26
|
+
if(test is Class) throw new ArgumentError("test argument cannot be a Class");
|
27
|
+
|
28
|
+
var testMethodsArray:Array = getTestMethods(test);
|
29
|
+
if(!testMethodsArray.length) {
|
30
|
+
setUpNullIterators();
|
31
|
+
return;
|
32
|
+
}
|
33
|
+
|
34
|
+
if(testMethodName) {
|
35
|
+
testMethodNameReceived = true;
|
36
|
+
testMethodsArray = testMethodsArray.filter(
|
37
|
+
function(item:Object, index:int, array:Array):Boolean {
|
38
|
+
return (item.name == testMethodName);
|
39
|
+
}
|
40
|
+
);
|
41
|
+
if(testMethodsArray.length == 0) {
|
42
|
+
var message:String = "Provided test method name (" + testMethodName + ") not found on provided class (" + Reflection.create(test).name + ")";
|
43
|
+
throw new UsageError(message);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
testMethods = new ArrayIterator(testMethodsArray);
|
48
|
+
setUpIterators(test);
|
49
|
+
}
|
50
|
+
|
51
|
+
public function get readyToSetUp():Boolean {
|
52
|
+
return !setUpHasRunThisCycle || (!afterMethods.hasNext() && testMethodHasRunThisCycle && testMethods.hasNext());
|
53
|
+
}
|
54
|
+
|
55
|
+
public function get readyToTearDown():Boolean {
|
56
|
+
return _readyToTearDown;
|
57
|
+
}
|
58
|
+
|
59
|
+
protected function setUpNullIterators():void {
|
60
|
+
// Set up null iterators for access to length
|
61
|
+
// and other properties...
|
62
|
+
testMethods = new ArrayIterator();
|
63
|
+
beforeClassMethods = new ArrayIterator();
|
64
|
+
beforeMethods = new ArrayIterator();
|
65
|
+
afterMethods = new ArrayIterator();
|
66
|
+
afterClassMethods = new ArrayIterator();
|
67
|
+
ignoredMethods = new ArrayIterator();
|
68
|
+
}
|
69
|
+
|
70
|
+
protected function setUpIterators(test:Object):void {
|
71
|
+
if(!testMethodNameReceived) {
|
72
|
+
afterClassMethods = new ArrayIterator(getAfterClassMethods(test));
|
73
|
+
afterMethods = new ArrayIterator(getAfterMethods(test));
|
74
|
+
}
|
75
|
+
else {
|
76
|
+
afterClassMethods = new ArrayIterator([]);
|
77
|
+
afterMethods = new ArrayIterator([]);
|
78
|
+
}
|
79
|
+
beforeClassMethods = new ArrayIterator(getBeforeClassMethods(test));
|
80
|
+
beforeMethods = new ArrayIterator(getBeforeMethods(test));
|
81
|
+
ignoredMethods = new ArrayIterator(getIgnoredMethods(test));
|
82
|
+
}
|
83
|
+
|
84
|
+
public function get beforeClassIterator():Iterator {
|
85
|
+
return beforeClassMethods;
|
86
|
+
}
|
87
|
+
|
88
|
+
public function get beforeIterator():Iterator {
|
89
|
+
return beforeMethods;
|
90
|
+
}
|
91
|
+
|
92
|
+
public function get testMethodsIterator():Iterator {
|
93
|
+
return testMethods;
|
94
|
+
}
|
95
|
+
|
96
|
+
public function get afterIterator():Iterator {
|
97
|
+
return afterMethods;
|
98
|
+
}
|
99
|
+
|
100
|
+
public function get afterClassIterator():Iterator {
|
101
|
+
return afterClassMethods;
|
102
|
+
}
|
103
|
+
|
104
|
+
public function get ignoredIterator():Iterator {
|
105
|
+
return ignoredMethods;
|
106
|
+
}
|
107
|
+
|
108
|
+
/**
|
109
|
+
*
|
110
|
+
* @param test An instance of a class with methods that have [Before] metadata.
|
111
|
+
* @return An array of Method instances.
|
112
|
+
*/
|
113
|
+
protected function getBeforeClassMethods(test:Object):Array {
|
114
|
+
return getMethodsWithMetadata(test["constructor"], "BeforeClass", true);
|
115
|
+
}
|
116
|
+
|
117
|
+
/**
|
118
|
+
*
|
119
|
+
* @param test An instance of a class with methods that have [Before] metadata.
|
120
|
+
* @return An array of Method instances.
|
121
|
+
*/
|
122
|
+
protected function getBeforeMethods(test:Object):Array {
|
123
|
+
return getMethodsWithMetadata(test, "Before");
|
124
|
+
}
|
125
|
+
|
126
|
+
/**
|
127
|
+
*
|
128
|
+
* @param test An instance of a class with methods that have [Test] metadata,
|
129
|
+
* or have a methods that begin with 'test'.
|
130
|
+
* @return An array of Method instances.
|
131
|
+
*/
|
132
|
+
protected function getTestMethods(test:Object):Array {
|
133
|
+
return getMethodsWithMetadata(test, "Test");
|
134
|
+
}
|
135
|
+
|
136
|
+
/**
|
137
|
+
*
|
138
|
+
* @param test An instance of a class with methods that have [After] metadata.
|
139
|
+
* @return An array of Method instances.
|
140
|
+
*/
|
141
|
+
protected function getAfterMethods(test:Object):Array {
|
142
|
+
return getMethodsWithMetadata(test, "After");
|
143
|
+
}
|
144
|
+
|
145
|
+
/**
|
146
|
+
*
|
147
|
+
* @param test An instance of a class with methods that have [After] metadata.
|
148
|
+
* @return An array of Method instances.
|
149
|
+
*/
|
150
|
+
protected function getIgnoredMethods(test:Object):Array {
|
151
|
+
return getMethodsWithMetadata(test, "Ignore");
|
152
|
+
}
|
153
|
+
|
154
|
+
/**
|
155
|
+
*
|
156
|
+
* @param test An instance of a class with methods that have [Before] metadata.
|
157
|
+
* @return An array of Method instances.
|
158
|
+
*/
|
159
|
+
protected function getAfterClassMethods(test:Object):Array {
|
160
|
+
return getMethodsWithMetadata(test["constructor"], "AfterClass", true);
|
161
|
+
}
|
162
|
+
|
163
|
+
protected function getMethodsWithMetadata(instance:Object, metaDataName:String, useStatic:Boolean = false):Array {
|
164
|
+
var reflection:Reflection = Reflection.create(instance);
|
165
|
+
var methodReflections:Array = reflection.getMembersByMetaData(metaDataName);
|
166
|
+
|
167
|
+
var methods:Array = [];
|
168
|
+
var methodReflection:ReflectionMethod;
|
169
|
+
for each(methodReflection in methodReflections) {
|
170
|
+
methods.push( new Method(instance, methodReflection) );
|
171
|
+
}
|
172
|
+
methods.sortOn('name');
|
173
|
+
methods.sortOn('order');
|
174
|
+
return methods;
|
175
|
+
}
|
176
|
+
|
177
|
+
protected function countTestMethods(test:Object):uint {
|
178
|
+
return getTestMethods(test).length;
|
179
|
+
}
|
180
|
+
|
181
|
+
public function hasNext():Boolean {
|
182
|
+
if(!testMethods) return false;
|
183
|
+
return testMethods.hasNext()
|
184
|
+
|| beforeMethods.hasNext()
|
185
|
+
|| afterMethods.hasNext()
|
186
|
+
|| beforeClassMethods.hasNext()
|
187
|
+
|| afterClassMethods.hasNext();
|
188
|
+
}
|
189
|
+
|
190
|
+
public function get length():uint {
|
191
|
+
var testMethodCount:int = testMethods.length - ignoredMethods.length;
|
192
|
+
var classHelperCount:int = beforeClassMethods.length + afterClassMethods.length;
|
193
|
+
var methodHelperCount:int = beforeMethods.length + afterMethods.length;
|
194
|
+
|
195
|
+
if(methodHelperCount > 0) {
|
196
|
+
return (testMethodCount * methodHelperCount) + testMethodCount + classHelperCount;
|
197
|
+
}
|
198
|
+
else {
|
199
|
+
return testMethodCount + classHelperCount;
|
200
|
+
}
|
201
|
+
}
|
202
|
+
|
203
|
+
public function next():* {
|
204
|
+
if(!testMethods) return null;
|
205
|
+
|
206
|
+
var value:*;
|
207
|
+
|
208
|
+
_readyToTearDown = false;
|
209
|
+
beforeMethodRanLastCycle = false;
|
210
|
+
setUpHasRunThisCycle = true;
|
211
|
+
|
212
|
+
if(beforeClassMethods.hasNext()) {
|
213
|
+
value = beforeClassMethods.next();
|
214
|
+
//updateReadyToSetUp();
|
215
|
+
return value;
|
216
|
+
}
|
217
|
+
|
218
|
+
|
219
|
+
if(beforeMethods.hasNext()) {
|
220
|
+
value = beforeMethods.next();
|
221
|
+
beforeMethodRanLastCycle = true;
|
222
|
+
//updateReadyToSetUp();
|
223
|
+
return value;
|
224
|
+
}
|
225
|
+
|
226
|
+
//updateReadyToSetUp();
|
227
|
+
|
228
|
+
if(!testMethodHasRunThisCycle && testMethods.hasNext()) {
|
229
|
+
testMethodHasRunThisCycle = true;
|
230
|
+
value = testMethods.next();
|
231
|
+
updateReadyToTearDown();
|
232
|
+
return value;
|
233
|
+
}
|
234
|
+
|
235
|
+
if(afterMethods.hasNext()) {
|
236
|
+
value = afterMethods.next();
|
237
|
+
//updateReadyToSetUp();
|
238
|
+
updateReadyToTearDown();
|
239
|
+
return value;
|
240
|
+
}
|
241
|
+
|
242
|
+
if(!testMethods.hasNext()) {
|
243
|
+
if(afterClassMethods.hasNext()) {
|
244
|
+
return afterClassMethods.next();
|
245
|
+
}
|
246
|
+
return null;
|
247
|
+
}
|
248
|
+
|
249
|
+
beforeMethods.reset();
|
250
|
+
afterMethods.reset();
|
251
|
+
testMethodHasRunThisCycle = false;
|
252
|
+
setUpHasRunThisCycle = false;
|
253
|
+
return next();
|
254
|
+
}
|
255
|
+
|
256
|
+
protected function updateReadyToTearDown():void {
|
257
|
+
// Used by TestRunner to remove visual
|
258
|
+
// entities:
|
259
|
+
if(!beforeClassMethods.hasNext() &&
|
260
|
+
!beforeMethods.hasNext() &&
|
261
|
+
testMethodHasRunThisCycle &&
|
262
|
+
!afterMethods.hasNext()) {
|
263
|
+
_readyToTearDown = true;
|
264
|
+
}
|
265
|
+
}
|
266
|
+
|
267
|
+
public function reset():void {
|
268
|
+
if(!testMethods) return;
|
269
|
+
|
270
|
+
beforeClassMethods.reset();
|
271
|
+
beforeMethods.reset();
|
272
|
+
testMethods.reset();
|
273
|
+
afterMethods.reset();
|
274
|
+
afterClassMethods.reset();
|
275
|
+
|
276
|
+
_readyToTearDown = false;
|
277
|
+
setUpHasRunThisCycle = false;
|
278
|
+
testMethodHasRunThisCycle = false;
|
279
|
+
}
|
280
|
+
}
|
281
|
+
}
|
282
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
package asunit.framework {
|
2
|
+
|
3
|
+
/**
|
4
|
+
* TestObserver is a marker interface that usually
|
5
|
+
* indicates that a given class will have at least
|
6
|
+
* one [Inject] annotation above a public instance
|
7
|
+
* variable that implements MessageBridge.
|
8
|
+
*/
|
9
|
+
public interface TestObserver {
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
package asunit.framework {
|
2
|
+
import flash.utils.getQualifiedClassName;
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @see Result
|
6
|
+
*/
|
7
|
+
public class TestSuccess implements ITestSuccess {
|
8
|
+
protected var _test:Object;
|
9
|
+
protected var _method:String;
|
10
|
+
|
11
|
+
/**
|
12
|
+
* Constructs a TestFailure with the given test and exception.
|
13
|
+
*/
|
14
|
+
public function TestSuccess(test:Object, method:String) {
|
15
|
+
_test = test;
|
16
|
+
_method = method;
|
17
|
+
}
|
18
|
+
|
19
|
+
public function get feature():String {
|
20
|
+
return getQualifiedClassName(_test) + '.' + _method;
|
21
|
+
}
|
22
|
+
|
23
|
+
public function get test():Object {
|
24
|
+
return _test;
|
25
|
+
}
|
26
|
+
|
27
|
+
public function get method():String {
|
28
|
+
return _method;
|
29
|
+
}
|
30
|
+
|
31
|
+
/**
|
32
|
+
* Returns a short description of the success.
|
33
|
+
*/
|
34
|
+
public function toString():String {
|
35
|
+
return "[TestSuccess " + method + "]";
|
36
|
+
}
|
37
|
+
}
|
38
|
+
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
package asunit.framework {
|
2
|
+
|
3
|
+
public class TestWarning implements ITestWarning {
|
4
|
+
|
5
|
+
private var _message:String;
|
6
|
+
private var _method:Method;
|
7
|
+
|
8
|
+
public function TestWarning(message:String, method:Method=null) {
|
9
|
+
_message = message;
|
10
|
+
_method = method;
|
11
|
+
}
|
12
|
+
|
13
|
+
public function set message(message:String):void {
|
14
|
+
_message = message;
|
15
|
+
}
|
16
|
+
|
17
|
+
public function get message():String {
|
18
|
+
return _message;
|
19
|
+
}
|
20
|
+
|
21
|
+
public function set method(method:Method):void {
|
22
|
+
_method = method;
|
23
|
+
}
|
24
|
+
|
25
|
+
public function get method():Method {
|
26
|
+
return _method;
|
27
|
+
}
|
28
|
+
|
29
|
+
public function toString():String {
|
30
|
+
if(method) {
|
31
|
+
return "[WARNING] " + method + " : " + message;
|
32
|
+
}
|
33
|
+
else {
|
34
|
+
return "[WARNING] " + message;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
|
@@ -0,0 +1,103 @@
|
|
1
|
+
package asunit.framework {
|
2
|
+
|
3
|
+
import asunit.framework.Command;
|
4
|
+
import asunit.events.TimeoutCommandEvent;
|
5
|
+
|
6
|
+
import flash.events.Event;
|
7
|
+
import flash.events.EventDispatcher;
|
8
|
+
import flash.events.TimerEvent;
|
9
|
+
import flash.utils.Timer;
|
10
|
+
|
11
|
+
[Event(name="called", type="flash.events.TimeoutCommandEvent")]
|
12
|
+
[Event(name="timedOut", type="flash.events.TimeoutCommandEvent")]
|
13
|
+
public class TimeoutCommand extends EventDispatcher implements Command {
|
14
|
+
|
15
|
+
public var scope:Object;
|
16
|
+
public var handler:Function;
|
17
|
+
public var duration:Number;
|
18
|
+
|
19
|
+
protected var params:Array;
|
20
|
+
protected var timeout:Timer;
|
21
|
+
protected var failureHandler:Function;
|
22
|
+
|
23
|
+
public function TimeoutCommand(scope:Object, handler:Function=null, duration:int=0, failureHandler:Function=null) {
|
24
|
+
this.scope = scope;
|
25
|
+
this.handler = handler || function(...args):* {};
|
26
|
+
this.duration = duration;
|
27
|
+
this.failureHandler = failureHandler;
|
28
|
+
|
29
|
+
//if (duration < 0) return;
|
30
|
+
timeout = new Timer(duration, 1);
|
31
|
+
timeout.addEventListener(TimerEvent.TIMER_COMPLETE, onTimeoutComplete);
|
32
|
+
timeout.start();
|
33
|
+
}
|
34
|
+
|
35
|
+
/**
|
36
|
+
* Called by TestRunner when the TimeoutCommandEvent.CALLED event is thrown.
|
37
|
+
*
|
38
|
+
* This needs to be triggered from the Runner so that the runner can handle
|
39
|
+
* any exceptions or errors appropriately.
|
40
|
+
*
|
41
|
+
* This should NOT actually call the provided handler if the timeout has
|
42
|
+
* already been exceeded.
|
43
|
+
*/
|
44
|
+
public function execute():* {
|
45
|
+
return handler.apply(scope, params);
|
46
|
+
}
|
47
|
+
|
48
|
+
/**
|
49
|
+
* Return the function handler that will be called when the Asynchronous
|
50
|
+
* feature works properly.
|
51
|
+
*/
|
52
|
+
public function getCallback():Function {
|
53
|
+
return wrapHandlerWithCorrectNumberOfArgs();
|
54
|
+
}
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Stop waiting for the timeout event, and don't call anything.
|
58
|
+
*/
|
59
|
+
public function cancel():void {
|
60
|
+
if (timeout) timeout.stop();
|
61
|
+
}
|
62
|
+
|
63
|
+
/**
|
64
|
+
* Called by the returned closure, and dispatches the CALLED event so that
|
65
|
+
* a client (TestRunner) can call execute().
|
66
|
+
*/
|
67
|
+
protected function callback(...args):* {
|
68
|
+
if (timeout) timeout.stop();
|
69
|
+
this.params = args;
|
70
|
+
var event:Event = new TimeoutCommandEvent(TimeoutCommandEvent.CALLED, this);
|
71
|
+
dispatchEvent(event);
|
72
|
+
}
|
73
|
+
|
74
|
+
protected function onTimeoutComplete(timerEvent:TimerEvent):void {
|
75
|
+
// Clobber handler so that original can no longer be called:
|
76
|
+
handler = function(...args):void {};
|
77
|
+
// Notify subscribers of the timeout:
|
78
|
+
var event:TimeoutCommandEvent = new TimeoutCommandEvent(TimeoutCommandEvent.TIMED_OUT, this);
|
79
|
+
dispatchEvent(event);
|
80
|
+
if (failureHandler != null) failureHandler(event);
|
81
|
+
}
|
82
|
+
|
83
|
+
protected function wrapHandlerWithCorrectNumberOfArgs():Function {
|
84
|
+
switch (handler.length) {
|
85
|
+
case 0: return function():* { return callback(); };
|
86
|
+
case 1: return function(a:*=null):* { return callback(a); };
|
87
|
+
case 2: return function(a:*=null, b:*=null):* { return callback(a, b); };
|
88
|
+
case 3: return function(a:*=null, b:*=null, c:*=null):* { return callback(a, b, c); };
|
89
|
+
case 4: return function(a:*=null, b:*=null, c:*=null, d:*=null):* { return callback(a, b, c, d); };
|
90
|
+
case 5: return function(a:*=null, b:*=null, c:*=null, d:*=null, e:*=null):* { return callback(a, b, c, d, e); };
|
91
|
+
case 6: return function(a:*=null, b:*=null, c:*=null, d:*=null, e:*=null, f:*=null):* { return callback(a, b, c, d, e, f); };
|
92
|
+
case 7: return function(a:*=null, b:*=null, c:*=null, d:*=null, e:*=null, f:*=null, g:*=null):* { return callback(a, b, c, d, e, f, g); };
|
93
|
+
case 8: return function(a:*=null, b:*=null, c:*=null, d:*=null, e:*=null, f:*=null, g:*=null, h:*=null):* { return callback(a, b, c, d, e, f, g, h); };
|
94
|
+
case 9: return function(a:*=null, b:*=null, c:*=null, d:*=null, e:*=null, f:*=null, g:*=null, h:*=null, i:*=null):* { return callback(a, b, c, d, e, f, g, h, i); };
|
95
|
+
}
|
96
|
+
return callback;
|
97
|
+
}
|
98
|
+
|
99
|
+
override public function toString():String {
|
100
|
+
return '[TimeoutCommand scope=' + scope + ']';;
|
101
|
+
}
|
102
|
+
}
|
103
|
+
}
|
@@ -0,0 +1,134 @@
|
|
1
|
+
package asunit.printers {
|
2
|
+
import asunit.framework.ITestFailure;
|
3
|
+
import asunit.framework.ITestWarning;
|
4
|
+
|
5
|
+
import asunit.framework.IResult;
|
6
|
+
import asunit.framework.IRunListener;
|
7
|
+
import asunit.framework.ITestSuccess;
|
8
|
+
import asunit.framework.Method;
|
9
|
+
import asunit.framework.TestObserver;
|
10
|
+
|
11
|
+
import flash.events.Event;
|
12
|
+
import flash.events.IOErrorEvent;
|
13
|
+
import flash.events.SecurityErrorEvent;
|
14
|
+
import flash.net.XMLSocket;
|
15
|
+
import flash.utils.getQualifiedClassName;
|
16
|
+
|
17
|
+
public class FlashBuilderPrinter implements IRunListener, TestObserver {
|
18
|
+
protected var projectName:String;
|
19
|
+
protected var contextName:String;
|
20
|
+
protected var messageQueue:Array;
|
21
|
+
protected var socket:XMLSocket;
|
22
|
+
|
23
|
+
public function FlashBuilderPrinter(projectName:String = '', contextName:String = '') {
|
24
|
+
this.projectName = projectName;
|
25
|
+
this.contextName = contextName;
|
26
|
+
messageQueue = [];
|
27
|
+
socket = new XMLSocket();
|
28
|
+
socket.addEventListener(Event.CONNECT, onConnect);
|
29
|
+
socket.addEventListener(IOErrorEvent.IO_ERROR, onErrorEvent);
|
30
|
+
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onErrorEvent);
|
31
|
+
socket.addEventListener(Event.CLOSE, onErrorEvent);
|
32
|
+
connect();
|
33
|
+
}
|
34
|
+
|
35
|
+
public function onRunStarted():void {
|
36
|
+
sendMessage("<startTestRun totalTestCount='0' projectName='" + projectName
|
37
|
+
+ "' contextName='" + contextName +"' />");
|
38
|
+
}
|
39
|
+
|
40
|
+
public function onTestStarted(test:Object):void {
|
41
|
+
}
|
42
|
+
|
43
|
+
public function onTestCompleted(test:Object):void {
|
44
|
+
}
|
45
|
+
|
46
|
+
// works for both errors and failures
|
47
|
+
public function onTestFailure(failure:ITestFailure):void {
|
48
|
+
sendMessage(getFailureMessage(failure));
|
49
|
+
}
|
50
|
+
|
51
|
+
public function onTestSuccess(success:ITestSuccess):void {
|
52
|
+
var xmlMessageSuccess:String = "<testCase name='" + success.method
|
53
|
+
+ "' testSuite='" + getQualifiedClassName(success.test) + "' status='success'/>";
|
54
|
+
sendMessage(xmlMessageSuccess);
|
55
|
+
}
|
56
|
+
|
57
|
+
public function onTestIgnored(method:Method):void {
|
58
|
+
var xmlMessageIgnore:String = "<testCase name='" + method.name
|
59
|
+
+ "' testSuite='" + getQualifiedClassName(method.scope) + "' status='ignore'/>";
|
60
|
+
sendMessage(xmlMessageIgnore);
|
61
|
+
}
|
62
|
+
|
63
|
+
public function onWarning(warning:ITestWarning):void {
|
64
|
+
//TODO: is there any way to send a warning to Flash Builder?
|
65
|
+
}
|
66
|
+
|
67
|
+
public function onRunCompleted(result:IResult):void {
|
68
|
+
sendMessage('<endOfTestRun/>');
|
69
|
+
socket.close();
|
70
|
+
}
|
71
|
+
|
72
|
+
protected function connect(ip:String = '127.0.0.1', port:uint = 8765):void {
|
73
|
+
try {
|
74
|
+
socket.connect(ip, port);
|
75
|
+
}
|
76
|
+
catch (e:Error) {
|
77
|
+
trace('## Error connecting to Flash Builder socket: ' + e.message);
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
protected function onConnect(event:Event):void {
|
82
|
+
sendQueuedMessages();
|
83
|
+
}
|
84
|
+
|
85
|
+
protected function sendQueuedMessages():void {
|
86
|
+
while (messageQueue.length) {
|
87
|
+
sendMessage(messageQueue.shift());
|
88
|
+
}
|
89
|
+
}
|
90
|
+
|
91
|
+
protected function sendMessage(message:String):void {
|
92
|
+
if (!socket.connected) {
|
93
|
+
messageQueue.push(message);
|
94
|
+
return;
|
95
|
+
}
|
96
|
+
socket.send(message);
|
97
|
+
//trace('+++++++++ sendMessage() - \n' + message + '\n');
|
98
|
+
}
|
99
|
+
|
100
|
+
protected function getFailureMessage(failure:ITestFailure):String {
|
101
|
+
var status:String = failure.isFailure ? 'failure' : 'error';
|
102
|
+
var xml:String =
|
103
|
+
"<testCase name='" + failure.failedMethod
|
104
|
+
+ "' testSuite='" + getQualifiedClassName(failure.failedTest)
|
105
|
+
+ "' status='" + status + "'>"
|
106
|
+
+ "<failure type='" + getQualifiedClassName(failure.thrownException) + "' >"
|
107
|
+
|
108
|
+
+ "<messageInfo>" + xmlEscapeMessage(failure.exceptionMessage)
|
109
|
+
+ "</messageInfo>"
|
110
|
+
|
111
|
+
+ "<stackTraceInfo>" + xmlEscapeMessage(failure.thrownException.getStackTrace())
|
112
|
+
+ "</stackTraceInfo>"
|
113
|
+
|
114
|
+
+ "</failure>"
|
115
|
+
+ "</testCase>";
|
116
|
+
|
117
|
+
return xml;
|
118
|
+
}
|
119
|
+
|
120
|
+
protected function onErrorEvent(event:Event):void {
|
121
|
+
trace('FlashBuilderPrinter::onErrorEvent() - event: ' + event);
|
122
|
+
//throw new Error('FlashBuilderPrinter::onErrorEvent() - event: ' + event);
|
123
|
+
}
|
124
|
+
|
125
|
+
protected static function xmlEscapeMessage(message:String):String {
|
126
|
+
if (!message) return '';
|
127
|
+
|
128
|
+
var escape:XML = <escape/>;
|
129
|
+
escape.setChildren( message );
|
130
|
+
return escape.children()[0].toXMLString();
|
131
|
+
}
|
132
|
+
|
133
|
+
}
|
134
|
+
}
|
@@ -0,0 +1,81 @@
|
|
1
|
+
package asunit.printers {
|
2
|
+
|
3
|
+
import asunit.framework.ITestFailure;
|
4
|
+
import asunit.framework.ITestWarning;
|
5
|
+
import asunit.framework.IResult;
|
6
|
+
import asunit.framework.IRunListener;
|
7
|
+
import asunit.framework.ITestSuccess;
|
8
|
+
import asunit.framework.Method;
|
9
|
+
import asunit.framework.TestObserver;
|
10
|
+
|
11
|
+
public class FlashDevelopPrinter implements IRunListener, TestObserver {
|
12
|
+
protected static const localPathPattern:RegExp =
|
13
|
+
/([A-Z]:\\[^\/:\*\?<>\|]+\.\w{2,6})|(\\{2}[^\/:\*\?<>\|]+\.\w{2,6})/g;
|
14
|
+
|
15
|
+
protected static const lineNumberPattern:RegExp = /:[0-9]*\]/;
|
16
|
+
|
17
|
+
public function FlashDevelopPrinter() {
|
18
|
+
}
|
19
|
+
|
20
|
+
public function onRunStarted():void {
|
21
|
+
}
|
22
|
+
|
23
|
+
public function onTestStarted(test:Object):void {
|
24
|
+
}
|
25
|
+
|
26
|
+
public function onTestCompleted(test:Object):void {
|
27
|
+
}
|
28
|
+
|
29
|
+
// works for both errors and failures
|
30
|
+
public function onTestFailure(failure:ITestFailure):void {
|
31
|
+
sendMessage(getFailureMessage(failure));
|
32
|
+
}
|
33
|
+
|
34
|
+
public function onTestSuccess(success:ITestSuccess):void {
|
35
|
+
// don't send success to FlashDevelop Panel
|
36
|
+
}
|
37
|
+
|
38
|
+
public function onTestIgnored(method:Method):void {
|
39
|
+
// don't send ignored test to FlashDevelop Panel
|
40
|
+
}
|
41
|
+
|
42
|
+
public function onWarning(warning:ITestWarning):void {
|
43
|
+
//TODO: send warning to FlashDevelop Panel?
|
44
|
+
}
|
45
|
+
|
46
|
+
public function onRunCompleted(result:IResult):void {
|
47
|
+
}
|
48
|
+
|
49
|
+
protected function sendMessage(message:String):void {
|
50
|
+
trace(message);
|
51
|
+
}
|
52
|
+
|
53
|
+
protected function getFailureMessage(failure:ITestFailure):String {
|
54
|
+
var status:String = (failure.isFailure) ? 'F' : 'E';
|
55
|
+
var stack:String = failure.thrownException.getStackTrace();
|
56
|
+
var lines:Array = stack.split('\n');
|
57
|
+
var methodPattern:RegExp = new RegExp(failure.failedMethod);
|
58
|
+
|
59
|
+
var lineWithMethod:String = '';
|
60
|
+
for each (var line:String in lines) {
|
61
|
+
if (line.match(methodPattern)) {
|
62
|
+
lineWithMethod = line;
|
63
|
+
break;
|
64
|
+
}
|
65
|
+
}
|
66
|
+
//trace('\n' + lineWithMethod + '\n');
|
67
|
+
|
68
|
+
var filePath:String = String(lineWithMethod.match(localPathPattern)[0]);
|
69
|
+
// Find the line number between : and ], e.g. :25].
|
70
|
+
var matches:Array = lineWithMethod.match(lineNumberPattern);
|
71
|
+
var lineNumberRaw:String = matches ? matches[0] : '';
|
72
|
+
// Take off the colon and bracket (I need to get better at regex).
|
73
|
+
var lineNumber:String = lineNumberRaw.slice(1, -1);
|
74
|
+
|
75
|
+
var message:String = filePath + ':'+lineNumber+': ' + status + ' '
|
76
|
+
+ (failure.failedMethod + '(): ' + failure.exceptionMessage);
|
77
|
+
|
78
|
+
return message;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}
|