From c075be897aa7acab7527361e8e184f1298c025e2 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Tue, 5 Oct 2010 15:49:31 -0700 Subject: [PATCH 01/54] Removed FakeRunner support class that was out of date (compile errors) and wasn't referenced anywhere. --- asunit-4.0/test/asunit/support/FakeRunner.as | 32 ------------------- .../test/asunit/support/TestForFakeRunner.as | 14 -------- 2 files changed, 46 deletions(-) delete mode 100644 asunit-4.0/test/asunit/support/FakeRunner.as delete mode 100644 asunit-4.0/test/asunit/support/TestForFakeRunner.as diff --git a/asunit-4.0/test/asunit/support/FakeRunner.as b/asunit-4.0/test/asunit/support/FakeRunner.as deleted file mode 100644 index 307ad7b..0000000 --- a/asunit-4.0/test/asunit/support/FakeRunner.as +++ /dev/null @@ -1,32 +0,0 @@ -package asunit.support { - - import asunit.framework.IRunner; - import asunit.framework.IResult; - import asunit.framework.TestSuccess; - import asunit.framework.IRunnerFactory; - - import flash.events.EventDispatcher; - import flash.display.DisplayObjectContainer; - - public class FakeRunner extends EventDispatcher implements IRunner { - - public function run(testOrSuite:Class, result:IResult, testMethod:String=null, visualContext:DisplayObjectContainer=null):void { - var currentTest:TestForFakeRunner = new testOrSuite() as TestForFakeRunner; - - result.onTestStarted(currentTest); - result.onTestSuccess(new TestSuccess(currentTest, 'customTestMethod')); - result.onTestCompleted(currentTest); - } - - public function shouldRunTest(testClass:Class):Boolean { - return true; - } - - public function set factory(factory:IRunnerFactory):void { - } - - public function get factory():IRunnerFactory { - } - } -} - diff --git a/asunit-4.0/test/asunit/support/TestForFakeRunner.as b/asunit-4.0/test/asunit/support/TestForFakeRunner.as deleted file mode 100644 index 2aa6916..0000000 --- a/asunit-4.0/test/asunit/support/TestForFakeRunner.as +++ /dev/null @@ -1,14 +0,0 @@ -package asunit.support { - - // Declare a fully-qualified runner for this test case: - [RunWith("asunit.support::FakeRunner")] - public class TestForFakeRunner { - - private var runnerReference:FakeRunner; - - public function customTestMethod():int { - throw new Error("This method shouldn't really get called"); - } - } -} - From e723245dbf6152ea9e62ffa186cd8c30dd85fd22 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Tue, 5 Oct 2010 15:55:42 -0700 Subject: [PATCH 02/54] Minor tweaks: AsUnitCoreTest typo correction, added [SWF] tag to AsUnitRunner. --- asunit-4.0/test/AsUnitRunner.as | 1 + asunit-4.0/test/asunit/core/AsUnitCoreTest.as | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/asunit-4.0/test/AsUnitRunner.as b/asunit-4.0/test/AsUnitRunner.as index 558889d..512304d 100755 --- a/asunit-4.0/test/AsUnitRunner.as +++ b/asunit-4.0/test/AsUnitRunner.as @@ -3,6 +3,7 @@ package { import asunit.core.TextCore; import flash.display.MovieClip; + [SWF(width="1024", height="640", backgroundColor="#000000", frameRate="61")] public class AsUnitRunner extends MovieClip { private var core:TextCore; diff --git a/asunit-4.0/test/asunit/core/AsUnitCoreTest.as b/asunit-4.0/test/asunit/core/AsUnitCoreTest.as index c60a840..243f23f 100644 --- a/asunit-4.0/test/asunit/core/AsUnitCoreTest.as +++ b/asunit-4.0/test/asunit/core/AsUnitCoreTest.as @@ -66,7 +66,7 @@ package asunit.core { private function verifyRunWithOnASuite(Suite:Class, testCaseCount:int, testMethodCount:int):void { var handler:Function = function(event:Event):void { - var message:String = "CustomRunner.run was NOT called with correct count"; + var message:String = "CustomTestRunner.run was NOT called with correct count"; // This is the number of Tests that will used the custom Runner: assertEquals(message, testCaseCount, CustomTestRunner.runCalledCount); // This is the number of test methods: From 997123b7932df926e467be4e7eef93f5ce06fda5 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Tue, 5 Oct 2010 16:06:51 -0700 Subject: [PATCH 03/54] Removed shouldRunTest(), which was only being used by SuiteIterator to avoid duplicate tests in nested suites. Solved the issue a better way. Now SuiteIterator doesn't have a dependency on the callback bridge, and a number of wrapper methods passing the bridge around are not necessary. --- .../src/asunit/framework/CallbackBridge.as | 10 ++-- asunit-4.0/src/asunit/framework/IResult.as | 1 - asunit-4.0/src/asunit/framework/IRunner.as | 1 - asunit-4.0/src/asunit/framework/Result.as | 8 --- .../src/asunit/framework/SuiteIterator.as | 50 +++++++++++-------- asunit-4.0/src/asunit/runners/SuiteRunner.as | 4 -- asunit-4.0/src/asunit/runners/TestRunner.as | 4 -- 7 files changed, 31 insertions(+), 47 deletions(-) diff --git a/asunit-4.0/src/asunit/framework/CallbackBridge.as b/asunit-4.0/src/asunit/framework/CallbackBridge.as index 272af04..a720767 100644 --- a/asunit-4.0/src/asunit/framework/CallbackBridge.as +++ b/asunit-4.0/src/asunit/framework/CallbackBridge.as @@ -1,8 +1,8 @@ -package asunit.framework { - +package asunit.framework { + public class CallbackBridge implements IResult { - private var listeners:Array; + private var listeners:Array; [Inject] public var model:Result; @@ -167,9 +167,5 @@ package asunit.framework { model.addObserver(observer); } - public function shouldRunTest(testClass:Class):Boolean - { - return model.shouldRunTest(testClass); - } } } \ No newline at end of file diff --git a/asunit-4.0/src/asunit/framework/IResult.as b/asunit-4.0/src/asunit/framework/IResult.as index 82c7e4c..fdb5029 100644 --- a/asunit-4.0/src/asunit/framework/IResult.as +++ b/asunit-4.0/src/asunit/framework/IResult.as @@ -8,7 +8,6 @@ function removeListener(listener:IRunListener):void; function addObserver(observer:TestObserver):void; - function shouldRunTest(testClass:Class):Boolean; function get errors():Array; function get errorCount():uint; diff --git a/asunit-4.0/src/asunit/framework/IRunner.as b/asunit-4.0/src/asunit/framework/IRunner.as index 0db5a2f..75aa406 100644 --- a/asunit-4.0/src/asunit/framework/IRunner.as +++ b/asunit-4.0/src/asunit/framework/IRunner.as @@ -6,7 +6,6 @@ package asunit.framework { public interface IRunner extends IEventDispatcher { function run(testOrSuite:Class, testMethodName:String=null, visualContext:DisplayObjectContainer=null):void; - function shouldRunTest(testClass:Class):Boolean; function set factory(factory:IRunnerFactory):void; function get factory():IRunnerFactory; diff --git a/asunit-4.0/src/asunit/framework/Result.as b/asunit-4.0/src/asunit/framework/Result.as index 0734412..534b575 100644 --- a/asunit-4.0/src/asunit/framework/Result.as +++ b/asunit-4.0/src/asunit/framework/Result.as @@ -72,14 +72,6 @@ package asunit.framework { public function get runTime():Number { return _runTime; } public function set runTime(value:Number):void { _runTime = value; } - - public function shouldRunTest(testClass:Class):Boolean { - if(!knownTests[testClass]) { - knownTests[testClass] = testClass; - return true; - } - return false; - } public function addObserver(observer:TestObserver):void { if(!(observer is IRunListener)) { diff --git a/asunit-4.0/src/asunit/framework/SuiteIterator.as b/asunit-4.0/src/asunit/framework/SuiteIterator.as index 4d34aa5..275bced 100644 --- a/asunit-4.0/src/asunit/framework/SuiteIterator.as +++ b/asunit-4.0/src/asunit/framework/SuiteIterator.as @@ -1,26 +1,22 @@ -package asunit.framework { - - import asunit.util.Iterator; - - import flash.utils.getDefinitionByName; - - import p2.reflect.Reflection; - import p2.reflect.ReflectionVariable; - import p2.reflect.ReflectionMetaData; +package asunit.framework { + import asunit.util.Iterator; + + import p2.reflect.Reflection; + import p2.reflect.ReflectionVariable; + + import flash.utils.getDefinitionByName; public class SuiteIterator implements Iterator { protected var index:int; protected var list:Array; - public function SuiteIterator(Suite:Class, bridge:CallbackBridge=null) { - list = getTestClasses(Suite, bridge); + public function SuiteIterator(Suite:Class) { + list = getTestClasses(Suite); } - private function getTestClasses(Suite:Class, bridge:CallbackBridge=null):Array { - if(bridge == null) bridge = new CallbackBridge(); - - var reflection:Reflection = Reflection.create(Suite); + private function getTestClasses(Suite:Class):Array { + var reflection:Reflection = Reflection.create(Suite); if(!isSuite(reflection) && isTest(reflection)) { return [Suite]; @@ -31,16 +27,24 @@ package asunit.framework { var response:Array = []; for each(variable in reflection.variables) { TestConstructor = Class(getDefinitionByName(variable.type)); - if(isSuite(Reflection.create(TestConstructor))) { - response = response.concat( getTestClasses(TestConstructor, bridge) ); - } - else if(bridge.shouldRunTest(TestConstructor)) { - response.push(TestConstructor); + if(isSuite(Reflection.create(TestConstructor))) { + var testClasses:Array = getTestClasses(TestConstructor); + for each(var testClass:Class in testClasses) { + pushIfNotInArray(testClass, response); + } + } + else { + pushIfNotInArray(TestConstructor, response) } } response.sort(); return response; - } + } + + private function pushIfNotInArray(item:Object, array:Array):void { + if (array.indexOf(item) >= 0) return; + array[array.length] = item; + } public function get length():uint { return list.length; @@ -58,7 +62,9 @@ package asunit.framework { return list[index] != null; } - // Returns a Class reference: + /** + * Returns a test Class. + */ public function next():* { return list[index++]; } diff --git a/asunit-4.0/src/asunit/runners/SuiteRunner.as b/asunit-4.0/src/asunit/runners/SuiteRunner.as index 214f687..8982a92 100644 --- a/asunit-4.0/src/asunit/runners/SuiteRunner.as +++ b/asunit-4.0/src/asunit/runners/SuiteRunner.as @@ -43,10 +43,6 @@ package asunit.runners { runSuite(suite); } - public function shouldRunTest(testClass:Class):Boolean { - return bridge.shouldRunTest(testClass); - } - public function set factory(factory:IRunnerFactory):void { _factory = factory; } diff --git a/asunit-4.0/src/asunit/runners/TestRunner.as b/asunit-4.0/src/asunit/runners/TestRunner.as index d283eba..8cd556e 100644 --- a/asunit-4.0/src/asunit/runners/TestRunner.as +++ b/asunit-4.0/src/asunit/runners/TestRunner.as @@ -82,10 +82,6 @@ package asunit.runners { runMethodByName(testOrSuite, methodName, visualContext); } - public function shouldRunTest(testClass:Class):Boolean { - return bridge.shouldRunTest(testClass); - } - // This class doesn't really use the runner factory, // since it represents a leaf node in the test // hierarchy... From a3a9ad983f23011f4e5f593e8fddb5877096d552 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Tue, 5 Oct 2010 16:14:49 -0700 Subject: [PATCH 04/54] Cleaned up a few stragglers from the last change (removing shouldRunTests). --- asunit-4.0/src/asunit/framework/Result.as | 8 ++--- asunit-4.0/src/asunit/runners/SuiteRunner.as | 35 +++++++++----------- 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/asunit-4.0/src/asunit/framework/Result.as b/asunit-4.0/src/asunit/framework/Result.as index 534b575..cacbd67 100644 --- a/asunit-4.0/src/asunit/framework/Result.as +++ b/asunit-4.0/src/asunit/framework/Result.as @@ -1,10 +1,8 @@ package asunit.framework { - - import asunit.errors.UsageError; - import asunit.framework.ITestFailure; + + import asunit.errors.UsageError; import flash.events.EventDispatcher; - import flash.utils.Dictionary; /** * A Result collects the results of executing @@ -27,7 +25,6 @@ package asunit.framework { protected var listeners:Array; protected var runComplete:Boolean; - protected var knownTests:Dictionary; public function Result() { _errors = []; @@ -36,7 +33,6 @@ package asunit.framework { _successes = []; _warnings = []; listeners = []; - knownTests = new Dictionary(); } public function get errors():Array { return _errors; } diff --git a/asunit-4.0/src/asunit/runners/SuiteRunner.as b/asunit-4.0/src/asunit/runners/SuiteRunner.as index 8982a92..5affc45 100644 --- a/asunit-4.0/src/asunit/runners/SuiteRunner.as +++ b/asunit-4.0/src/asunit/runners/SuiteRunner.as @@ -1,24 +1,19 @@ package asunit.runners { - - import asunit.framework.CallbackBridge; - import asunit.framework.IResult; - import asunit.framework.IRunner; - import asunit.framework.IRunnerFactory; - import asunit.framework.RunnerFactory; - import asunit.util.Iterator; - import asunit.framework.SuiteIterator; - - import flash.display.DisplayObjectContainer; - import flash.events.Event; - import flash.events.EventDispatcher; - import flash.events.IEventDispatcher; - import flash.events.TimerEvent; - import flash.utils.Timer; - import flash.utils.getDefinitionByName; - - import p2.reflect.Reflection; - import p2.reflect.ReflectionMetaData; + + import asunit.framework.CallbackBridge; + import asunit.framework.IRunner; + import asunit.framework.IRunnerFactory; + import asunit.framework.RunnerFactory; + import asunit.framework.SuiteIterator; + import asunit.util.Iterator; + import flash.display.DisplayObjectContainer; + import flash.events.Event; + import flash.events.EventDispatcher; + import flash.events.IEventDispatcher; + import flash.events.TimerEvent; + import flash.utils.Timer; + public class SuiteRunner implements IEventDispatcher, IRunner { [Inject] @@ -52,7 +47,7 @@ package asunit.runners { } protected function runSuite(suite:*):void { - testClasses = new SuiteIterator(suite, bridge); + testClasses = new SuiteIterator(suite); timer.addEventListener(TimerEvent.TIMER, runNextTest); runNextTest(); From 81927429f3ec64ea2a413cd81e7cc82b0e29a632 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Tue, 5 Oct 2010 16:18:47 -0700 Subject: [PATCH 05/54] Removed MessageBridge as it is no longer used. --- asunit-4.0/src/asunit/framework/IResult.as | 2 +- .../src/asunit/framework/MessageBridge.as | 24 ------------------- 2 files changed, 1 insertion(+), 25 deletions(-) delete mode 100644 asunit-4.0/src/asunit/framework/MessageBridge.as diff --git a/asunit-4.0/src/asunit/framework/IResult.as b/asunit-4.0/src/asunit/framework/IResult.as index fdb5029..7c943ee 100644 --- a/asunit-4.0/src/asunit/framework/IResult.as +++ b/asunit-4.0/src/asunit/framework/IResult.as @@ -2,7 +2,7 @@ import asunit.framework.ITestFailure; - public interface IResult extends MessageBridge, IRunListener, ITestListener { + public interface IResult extends IRunListener, ITestListener { function addListener(listener:IRunListener):void; function removeListener(listener:IRunListener):void; diff --git a/asunit-4.0/src/asunit/framework/MessageBridge.as b/asunit-4.0/src/asunit/framework/MessageBridge.as deleted file mode 100644 index e319527..0000000 --- a/asunit-4.0/src/asunit/framework/MessageBridge.as +++ /dev/null @@ -1,24 +0,0 @@ -package asunit.framework { - - /** - * MessageBridge is a marker interface that is used - * by AsUnit core in order to support custom messaging - * schemes between TestObservers and IRunners. - * - * The idea is that you [Inject] one or more entities - * into your concrete IRunner and related TestObservers. - * - * The contract is between the concrete MessageBridge, - * and the other actors that [Inject] it into. - * - * This implementation gives AsUnit the ability to support - * a variety of messaging protocols including native - * Flash EventDispatchers, callbacks, and even progressive - * systems like AS3Signals. The decision as to which - * messaging system to use is made by the person creating - * the concrete Runner and Observer. - */ - public interface MessageBridge { - } -} - From 487c05ec88e857f83c46d22beada07125b519a51 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Tue, 5 Oct 2010 16:26:15 -0700 Subject: [PATCH 06/54] Removed ITestResult as it is no longer used. --- .../src/asunit/framework/ITestResult.as | 21 ------------------- 1 file changed, 21 deletions(-) delete mode 100644 asunit-4.0/src/asunit/framework/ITestResult.as diff --git a/asunit-4.0/src/asunit/framework/ITestResult.as b/asunit-4.0/src/asunit/framework/ITestResult.as deleted file mode 100644 index 68a570e..0000000 --- a/asunit-4.0/src/asunit/framework/ITestResult.as +++ /dev/null @@ -1,21 +0,0 @@ -package asunit.framework { - - public interface ITestResult { - - function addFailure(failure:ITestFailure):void; - - function get errors():Array; - function get errorCount():uint; - - function get failures():Array; - function get failureCount():uint; - - function get runCount():uint; - function set runCount(value:uint):void; - - function get wasSuccessful():Boolean; - - function addListener(listener:ITestListener):void; - function removeListener(listener:ITestListener):void; - } -} From 972bbc4cfd76481210f618ccf6cc20044930389b Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Tue, 5 Oct 2010 16:29:51 -0700 Subject: [PATCH 07/54] Organized imports on several classes. --- asunit-4.0/src/asunit/core/AsUnitCore.as | 29 ++++----- asunit-4.0/src/asunit/core/TextCore.as | 12 ++-- asunit-4.0/src/asunit/framework/IResult.as | 2 - .../src/asunit/framework/IRunListener.as | 3 - asunit-4.0/src/asunit/runners/TestRunner.as | 63 +++++++++---------- 5 files changed, 48 insertions(+), 61 deletions(-) diff --git a/asunit-4.0/src/asunit/core/AsUnitCore.as b/asunit-4.0/src/asunit/core/AsUnitCore.as index dccd7df..78b154f 100644 --- a/asunit-4.0/src/asunit/core/AsUnitCore.as +++ b/asunit-4.0/src/asunit/core/AsUnitCore.as @@ -1,19 +1,16 @@ -package asunit.core { - - import asunit.framework.IResult; - import asunit.framework.IRunListener; - import asunit.framework.IRunner; - import asunit.framework.Result; - import asunit.framework.RunnerFactory; - import asunit.framework.TestObserver; - import asunit.runners.LegacyRunner; - - import flash.display.DisplayObjectContainer; - import flash.events.Event; - import flash.events.EventDispatcher; - import flash.events.IEventDispatcher; - import asunit.framework.InjectionDelegate; - import asunit.framework.CallbackBridge; +package asunit.core { + + import asunit.framework.CallbackBridge; + import asunit.framework.IRunner; + import asunit.framework.InjectionDelegate; + import asunit.framework.RunnerFactory; + import asunit.framework.TestObserver; + import asunit.runners.LegacyRunner; + + import flash.display.DisplayObjectContainer; + import flash.events.Event; + import flash.events.EventDispatcher; + import flash.events.IEventDispatcher; public class AsUnitCore implements IEventDispatcher { diff --git a/asunit-4.0/src/asunit/core/TextCore.as b/asunit-4.0/src/asunit/core/TextCore.as index ab02faa..babdc54 100644 --- a/asunit-4.0/src/asunit/core/TextCore.as +++ b/asunit-4.0/src/asunit/core/TextCore.as @@ -1,9 +1,9 @@ -package asunit.core { - - import asunit.printers.TextPrinter; - - import flash.display.DisplayObjectContainer; - +package asunit.core { + + import asunit.printers.TextPrinter; + + import flash.display.DisplayObjectContainer; + /** * TextCore is just a simple helper class that * configures the base class AsUnitCore to use the diff --git a/asunit-4.0/src/asunit/framework/IResult.as b/asunit-4.0/src/asunit/framework/IResult.as index 7c943ee..a93d29d 100644 --- a/asunit-4.0/src/asunit/framework/IResult.as +++ b/asunit-4.0/src/asunit/framework/IResult.as @@ -1,7 +1,5 @@ package asunit.framework { - import asunit.framework.ITestFailure; - public interface IResult extends IRunListener, ITestListener { function addListener(listener:IRunListener):void; diff --git a/asunit-4.0/src/asunit/framework/IRunListener.as b/asunit-4.0/src/asunit/framework/IRunListener.as index 84ade87..f9c4fde 100644 --- a/asunit-4.0/src/asunit/framework/IRunListener.as +++ b/asunit-4.0/src/asunit/framework/IRunListener.as @@ -1,8 +1,5 @@ package asunit.framework { - import asunit.framework.ITestFailure; - import asunit.framework.IResult; - public interface IRunListener extends ITestListener { function onRunStarted():void; function onRunCompleted(result:IResult):void; diff --git a/asunit-4.0/src/asunit/runners/TestRunner.as b/asunit-4.0/src/asunit/runners/TestRunner.as index 8cd556e..8a08149 100644 --- a/asunit-4.0/src/asunit/runners/TestRunner.as +++ b/asunit-4.0/src/asunit/runners/TestRunner.as @@ -1,37 +1,32 @@ -package asunit.runners { - - import asunit.events.TimeoutCommandEvent; - import asunit.framework.Assert; - import asunit.framework.Async; - import asunit.framework.CallbackBridge; - import asunit.framework.IAsync; - import asunit.framework.IResult; - import asunit.framework.IRunner; - import asunit.framework.IRunnerFactory; - import asunit.framework.Method; - import asunit.framework.TestFailure; - import asunit.framework.TestIterator; - import asunit.framework.TestSuccess; - import asunit.framework.TestWarning; - import asunit.util.ArrayIterator; - import asunit.util.Iterator; - - import flash.display.DisplayObjectContainer; - import flash.errors.IllegalOperationError; - import flash.events.Event; - import flash.events.EventDispatcher; - import flash.events.IEventDispatcher; - import flash.events.TimerEvent; - import flash.utils.Timer; - import flash.utils.clearTimeout; - import flash.utils.getDefinitionByName; - import flash.utils.getTimer; - import flash.utils.setTimeout; - - import p2.reflect.Reflection; - import p2.reflect.ReflectionMember; - import p2.reflect.ReflectionMetaData; - import p2.reflect.ReflectionVariable; +package asunit.runners { + + import asunit.events.TimeoutCommandEvent; + import asunit.framework.Assert; + import asunit.framework.Async; + import asunit.framework.CallbackBridge; + import asunit.framework.IAsync; + import asunit.framework.IRunner; + import asunit.framework.IRunnerFactory; + import asunit.framework.Method; + import asunit.framework.TestFailure; + import asunit.framework.TestIterator; + import asunit.framework.TestSuccess; + import asunit.framework.TestWarning; + import asunit.util.ArrayIterator; + import asunit.util.Iterator; + + import p2.reflect.Reflection; + import p2.reflect.ReflectionMetaData; + import p2.reflect.ReflectionVariable; + + import flash.display.DisplayObjectContainer; + import flash.errors.IllegalOperationError; + import flash.events.Event; + import flash.events.EventDispatcher; + import flash.events.TimerEvent; + import flash.utils.Timer; + import flash.utils.getDefinitionByName; + import flash.utils.getTimer; public class TestRunner extends EventDispatcher implements IRunner { public static var ASYNC_NAME:String = 'asunit.framework::Async'; From 37ed79fbc8f39b692c657b7adc86ab31f37f583e Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Tue, 5 Oct 2010 16:38:56 -0700 Subject: [PATCH 08/54] I suspected CallbackBridge was just duplicating Result so I proved it by "refactoring" CallbackBridge to be practically empty and just extend Result instead of delegating. All tests pass and the AS3Signals test suite runs fine. --- .../src/asunit/framework/CallbackBridge.as | 171 +----------------- 1 file changed, 5 insertions(+), 166 deletions(-) diff --git a/asunit-4.0/src/asunit/framework/CallbackBridge.as b/asunit-4.0/src/asunit/framework/CallbackBridge.as index a720767..942d243 100644 --- a/asunit-4.0/src/asunit/framework/CallbackBridge.as +++ b/asunit-4.0/src/asunit/framework/CallbackBridge.as @@ -1,171 +1,10 @@ package asunit.framework { - public class CallbackBridge implements IResult { + public class CallbackBridge extends Result { + + internal function get numListeners():uint { + return listeners.length; + } - private var listeners:Array; - - [Inject] - public var model:Result; - - public function CallbackBridge() { - initialize(); - } - - protected function initialize():void - { - listeners = []; - model = new Result(); - } - - public function get length():int { - return listeners.length; - } - - public function onRunStarted():void { - model.onRunStarted(); - listeners.forEach(function(listener:IRunListener, index:int, items:Array):void { - listener.onRunStarted(); - }); - } - - public function onRunCompleted(result:IResult):void { - model.onRunCompleted(result); - listeners.forEach(function(listener:IRunListener, index:int, items:Array):void { - listener.onRunCompleted(result); - }); - } - - public function onTestStarted(test:Object):void { - model.onTestStarted(test); - listeners.forEach(function(listener:IRunListener, index:int, items:Array):void { - listener.onTestStarted(test); - }); - } - - public function onTestCompleted(test:Object):void { - model.onTestCompleted(test); - listeners.forEach(function(listener:IRunListener, index:int, items:Array):void { - listener.onTestCompleted(test); - }); - } - - public function onTestFailure(failure:ITestFailure):void { - model.onTestFailure(failure); - listeners.forEach(function(listener:IRunListener, index:int, items:Array):void { - listener.onTestFailure(failure); - }); - } - - public function onTestSuccess(success:ITestSuccess):void { - model.onTestSuccess(success); - listeners.forEach(function(listener:IRunListener, index:int, items:Array):void { - listener.onTestSuccess(success); - }); - } - - public function onTestIgnored(method:Method):void { - model.onTestIgnored(method); - listeners.forEach(function(listener:IRunListener, index:int, items:Array):void { - listener.onTestIgnored(method); - }); - } - - public function onWarning(warning:ITestWarning):void { - model.onWarning(warning); - listeners.forEach(function(listener:IRunListener, index:int, items:Array):void { - listener.onWarning(warning); - }); - } - - //--------------------------------------- - // IResult Implementation - //--------------------------------------- - - public function get errors():Array - { - return model.errors; - } - - public function get errorCount():uint - { - return model.errorCount; - } - - public function get failures():Array - { - return model.failures; - } - - public function get failureCount():uint - { - return model.failureCount; - } - - public function get successes():Array - { - return model.successes; - } - - public function get successCount():uint - { - return model.successCount; - } - - public function get warnings():Array - { - return model.warnings; - } - - public function get ignoredTests():Array - { - return model.ignoredTests; - } - - public function get ignoredTestCount():uint - { - return model.ignoredTestCount; - } - - public function get runCount():uint - { - return model.runCount; - } - - public function get failureEncountered():Boolean - { - return model.failureEncountered; - } - - public function get wasSuccessful():Boolean - { - return model.wasSuccessful; - } - - public function get runTime():Number - { - return model.runTime; - } - - public function set runTime(value:Number):void - { - model.runTime = value; - } - - public function addListener(listener:IRunListener):void - { - model.addListener(listener); - listeners.push(listener); - } - - public function removeListener(listener:IRunListener):void - { - model.removeListener(listener); - } - - public function addObserver(observer:TestObserver):void - { - model.addObserver(observer); - } - } } \ No newline at end of file From d81cbed0a6f7771d92c63ccc84cfbfdfdb4ba03c Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Tue, 5 Oct 2010 23:25:08 -0700 Subject: [PATCH 09/54] Fixed compile error in CallbackBridgeTest from previous change. --- asunit-4.0/test/asunit/framework/CallbackBridgeTest.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asunit-4.0/test/asunit/framework/CallbackBridgeTest.as b/asunit-4.0/test/asunit/framework/CallbackBridgeTest.as index 3dd4579..1103ffe 100644 --- a/asunit-4.0/test/asunit/framework/CallbackBridgeTest.as +++ b/asunit-4.0/test/asunit/framework/CallbackBridgeTest.as @@ -30,7 +30,7 @@ package asunit.framework { [Test] public function addListenerWorked():void { - assertEquals(1, bridge.length); + assertEquals(1, bridge.numListeners); } [Test] From 44d0778f5a01e45171d1c420e37a03e5de59c8b2 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 10 Oct 2010 20:42:49 -0700 Subject: [PATCH 10/54] FIX: AsUnitCore wasn't dispatching itself as the currentTarget for its events. Closes #8. --- asunit-4.0/src/asunit/core/AsUnitCore.as | 26 +++++++++---------- asunit-4.0/test/asunit/core/AsUnitCoreTest.as | 17 ++++++++++++ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/asunit-4.0/src/asunit/core/AsUnitCore.as b/asunit-4.0/src/asunit/core/AsUnitCore.as index 78b154f..85f76d0 100644 --- a/asunit-4.0/src/asunit/core/AsUnitCore.as +++ b/asunit-4.0/src/asunit/core/AsUnitCore.as @@ -1,15 +1,15 @@ -package asunit.core { - - import asunit.framework.CallbackBridge; - import asunit.framework.IRunner; - import asunit.framework.InjectionDelegate; - import asunit.framework.RunnerFactory; - import asunit.framework.TestObserver; - import asunit.runners.LegacyRunner; - - import flash.display.DisplayObjectContainer; - import flash.events.Event; - import flash.events.EventDispatcher; +package asunit.core { + + import asunit.framework.CallbackBridge; + import asunit.framework.IRunner; + import asunit.framework.InjectionDelegate; + import asunit.framework.RunnerFactory; + import asunit.framework.TestObserver; + import asunit.runners.LegacyRunner; + + import flash.display.DisplayObjectContainer; + import flash.events.Event; + import flash.events.EventDispatcher; import flash.events.IEventDispatcher; public class AsUnitCore implements IEventDispatcher { @@ -37,7 +37,7 @@ package asunit.core { } protected function initializeDispatcher():void { - dispatcher = new EventDispatcher(); + dispatcher = new EventDispatcher(this); } /** diff --git a/asunit-4.0/test/asunit/core/AsUnitCoreTest.as b/asunit-4.0/test/asunit/core/AsUnitCoreTest.as index 243f23f..a0f11cd 100644 --- a/asunit-4.0/test/asunit/core/AsUnitCoreTest.as +++ b/asunit-4.0/test/asunit/core/AsUnitCoreTest.as @@ -39,6 +39,23 @@ package asunit.core { public function startShouldWork():void { core.start(SucceedAssertTrue); } + + [Test] + public function shouldDispatchSelfAsCurrentTarget():void { + var handlerCalled:Boolean = false; + var handler:Function = function(event:Event):void { + assertSame("currentTarget should be the core", core, event.currentTarget); + handlerCalled = true; + core.removeEventListener(event.type, arguments.callee); + } + + var eventType:String = "foo"; + core.addEventListener(eventType, handler); + // when + core.dispatchEvent(new Event(eventType)); + // then + assertTrue("handler called", handlerCalled); + } [Test] public function setVisualContextShouldWork():void { From 9e2add0feecf00eebd2b4adab814e38332708bec Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 10 Oct 2010 20:54:01 -0700 Subject: [PATCH 11/54] Gave AsUnitCoreTest a proper [Before] method so the unit under test would be instantiated fresh for each test method. I don't think we should [Inject] the unit under test! The test needs to know how it was created. --- asunit-4.0/test/asunit/core/AsUnitCoreTest.as | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/asunit-4.0/test/asunit/core/AsUnitCoreTest.as b/asunit-4.0/test/asunit/core/AsUnitCoreTest.as index a0f11cd..02aab45 100644 --- a/asunit-4.0/test/asunit/core/AsUnitCoreTest.as +++ b/asunit-4.0/test/asunit/core/AsUnitCoreTest.as @@ -19,11 +19,12 @@ package asunit.core { [Inject] public var async:IAsync; - [Inject] - public var core:AsUnitCore; + private var core:AsUnitCore; - [Inject] - public var context:Sprite; + [Before] + public function setUp():void { + core = new AsUnitCore(); + } [After] public function cleanUpStatics():void { @@ -59,8 +60,9 @@ package asunit.core { [Test] public function setVisualContextShouldWork():void { + var context:Sprite = new Sprite(); core.visualContext = context; - assertEquals(context, core.visualContext); + assertSame(context, core.visualContext); } [Test] From 39f78932d50cbfbe46cafd033a5590c585415544 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 10 Oct 2010 21:57:03 -0700 Subject: [PATCH 12/54] Replaced references to CallbackBridge with Result. Once we get a better injector, we can replace Result with IResult. --- asunit-4.0/src/asunit/core/AsUnitCore.as | 27 +++---- .../src/asunit/framework/RunnerFactory.as | 2 +- asunit-4.0/src/asunit/printers/TextPrinter.as | 15 ++-- asunit-4.0/src/asunit/runners/SuiteRunner.as | 3 - asunit-4.0/src/asunit/runners/TestRunner.as | 72 +++++++++---------- asunit-4.0/test/asunit/core/AsUnitCoreTest.as | 2 +- .../test/asunit/runners/LegacyRunnerTest.as | 4 +- .../runners/TestRunnerAsyncMethodTest.as | 6 +- .../runners/TestRunnerErrorMethodTest.as | 2 +- .../runners/TestRunnerExpectsErrorTest.as | 4 +- .../runners/TestRunnerIgnoredMethodTest.as | 4 +- .../test/asunit/runners/TestRunnerTest.as | 12 ++-- 12 files changed, 76 insertions(+), 77 deletions(-) diff --git a/asunit-4.0/src/asunit/core/AsUnitCore.as b/asunit-4.0/src/asunit/core/AsUnitCore.as index 85f76d0..c704351 100644 --- a/asunit-4.0/src/asunit/core/AsUnitCore.as +++ b/asunit-4.0/src/asunit/core/AsUnitCore.as @@ -1,6 +1,6 @@ package asunit.core { - import asunit.framework.CallbackBridge; + import asunit.framework.Result; import asunit.framework.IRunner; import asunit.framework.InjectionDelegate; import asunit.framework.RunnerFactory; @@ -15,7 +15,7 @@ package asunit.core { public class AsUnitCore implements IEventDispatcher { [Inject] - public var bridge:CallbackBridge; + public var result:Result; protected var bridgeInjector:InjectionDelegate; protected var dispatcher:IEventDispatcher; @@ -117,24 +117,25 @@ package asunit.core { public function start(testOrSuite:Class, testMethodName:String=null, visualContext:DisplayObjectContainer=null):void { // Will instantiate a new CallbackBridge: - // and set it on this instance - but share it - // with any Runners or Observers that also - // use the CallbackBridge. + // and set it on this instance - but share it + // with any Runners or Observers that also + // use the CallbackBridge. bridgeInjector.updateInjectionPoints(this, InjectionDelegate.THROW_ERROR_ON_MISSING_INJECTION_POINT); - // Must use the accessor, not the _ value: - if(visualContext) this.visualContext = visualContext; - var factory:RunnerFactory = new RunnerFactory(); + // Must use the accessor, not the _ value: + if(visualContext) this.visualContext = visualContext; + + var factory:RunnerFactory = new RunnerFactory(); factory.injector = bridgeInjector; - runner = factory.runnerFor(testOrSuite); + runner = factory.runnerFor(testOrSuite); runner.addEventListener(Event.COMPLETE, runCompleteHandler); - bridge.onRunStarted(); - runner.run(testOrSuite, testMethodName, this.visualContext); - } + result.onRunStarted(); + runner.run(testOrSuite, testMethodName, this.visualContext); + } private function runCompleteHandler(event:Event):void { runner.removeEventListener(Event.COMPLETE, onRunCompleted); - bridge.onRunCompleted(bridge); + result.onRunCompleted(result); onRunCompleted(); dispatchEvent(event); } diff --git a/asunit-4.0/src/asunit/framework/RunnerFactory.as b/asunit-4.0/src/asunit/framework/RunnerFactory.as index 198b87b..d0a075e 100644 --- a/asunit-4.0/src/asunit/framework/RunnerFactory.as +++ b/asunit-4.0/src/asunit/framework/RunnerFactory.as @@ -159,7 +159,7 @@ package asunit.framework { protected function configureRunner(runner:IRunner):void { runner.factory = this; - injector.updateInjectionPoints(runner, InjectionDelegate.THROW_ERROR_ON_MISSING_INJECTION_POINT); + injector.updateInjectionPoints(runner, false); } public static function isSuite(reflection:Reflection):Boolean { diff --git a/asunit-4.0/src/asunit/printers/TextPrinter.as b/asunit-4.0/src/asunit/printers/TextPrinter.as index 6661c48..0ebedf5 100644 --- a/asunit-4.0/src/asunit/printers/TextPrinter.as +++ b/asunit-4.0/src/asunit/printers/TextPrinter.as @@ -6,6 +6,7 @@ package asunit.printers { import asunit.framework.ITestSuccess; import asunit.framework.ITestWarning; import asunit.framework.Method; + import asunit.framework.Result; import flash.display.Shape; import flash.display.Sprite; @@ -59,21 +60,21 @@ package asunit.printers { * you can decide to manage notifications however you wish. * */ - private var _bridge:CallbackBridge; + private var _result:Result; [Inject] - public function set bridge(value:CallbackBridge):void + public function set result(value:Result):void { - if (value !== _bridge) + if (value !== _result) { - _bridge = value; - _bridge.addObserver(this); + _result = value; + _result.addObserver(this); } } - public function get bridge():CallbackBridge + public function get result():Result { - return _bridge; + return _result; } public function TextPrinter() { diff --git a/asunit-4.0/src/asunit/runners/SuiteRunner.as b/asunit-4.0/src/asunit/runners/SuiteRunner.as index 5affc45..9048cc3 100644 --- a/asunit-4.0/src/asunit/runners/SuiteRunner.as +++ b/asunit-4.0/src/asunit/runners/SuiteRunner.as @@ -16,9 +16,6 @@ package asunit.runners { public class SuiteRunner implements IEventDispatcher, IRunner { - [Inject] - public var bridge:CallbackBridge; - protected var dispatcher:IEventDispatcher; protected var testClasses:Iterator; protected var timer:Timer; diff --git a/asunit-4.0/src/asunit/runners/TestRunner.as b/asunit-4.0/src/asunit/runners/TestRunner.as index 8a08149..45b09b1 100644 --- a/asunit-4.0/src/asunit/runners/TestRunner.as +++ b/asunit-4.0/src/asunit/runners/TestRunner.as @@ -1,31 +1,31 @@ -package asunit.runners { - - import asunit.events.TimeoutCommandEvent; - import asunit.framework.Assert; - import asunit.framework.Async; - import asunit.framework.CallbackBridge; - import asunit.framework.IAsync; - import asunit.framework.IRunner; - import asunit.framework.IRunnerFactory; - import asunit.framework.Method; - import asunit.framework.TestFailure; - import asunit.framework.TestIterator; - import asunit.framework.TestSuccess; - import asunit.framework.TestWarning; - import asunit.util.ArrayIterator; - import asunit.util.Iterator; - - import p2.reflect.Reflection; - import p2.reflect.ReflectionMetaData; - import p2.reflect.ReflectionVariable; - - import flash.display.DisplayObjectContainer; - import flash.errors.IllegalOperationError; - import flash.events.Event; - import flash.events.EventDispatcher; - import flash.events.TimerEvent; - import flash.utils.Timer; - import flash.utils.getDefinitionByName; +package asunit.runners { + + import asunit.events.TimeoutCommandEvent; + import asunit.framework.Assert; + import asunit.framework.Async; + import asunit.framework.Result; + import asunit.framework.IAsync; + import asunit.framework.IRunner; + import asunit.framework.IRunnerFactory; + import asunit.framework.Method; + import asunit.framework.TestFailure; + import asunit.framework.TestIterator; + import asunit.framework.TestSuccess; + import asunit.framework.TestWarning; + import asunit.util.ArrayIterator; + import asunit.util.Iterator; + + import p2.reflect.Reflection; + import p2.reflect.ReflectionMetaData; + import p2.reflect.ReflectionVariable; + + import flash.display.DisplayObjectContainer; + import flash.errors.IllegalOperationError; + import flash.events.Event; + import flash.events.EventDispatcher; + import flash.events.TimerEvent; + import flash.utils.Timer; + import flash.utils.getDefinitionByName; import flash.utils.getTimer; public class TestRunner extends EventDispatcher implements IRunner { @@ -43,7 +43,7 @@ package asunit.runners { * concrete runner will dispatch. */ [Inject] - public var bridge:CallbackBridge; + public var result:Result; // partially exposed for unit testing internal var currentTest:Object; @@ -67,7 +67,7 @@ package asunit.runners { public function TestRunner() { async = new Async(); - bridge = new CallbackBridge(); + result = new Result(); timer = new Timer(0, 1); timer.addEventListener(TimerEvent.TIMER, runNextMethod); visualInstances = []; @@ -108,7 +108,7 @@ package asunit.runners { async.addEventListener(TimeoutCommandEvent.TIMED_OUT, onAsyncMethodTimedOut); startTime = getTimer(); - bridge.onTestStarted(currentTest); + result.onTestStarted(currentTest); methodsToRun = createTestIterator(currentTest, methodName); @@ -150,7 +150,7 @@ package asunit.runners { methodPassed = true; // innocent until proven guilty by recordFailure() if (currentMethod.ignore) { - bridge.onTestIgnored(currentMethod); + result.onTestIgnored(currentMethod); onMethodCompleted(); return; } @@ -192,7 +192,7 @@ package asunit.runners { async.cancelPending(); if (currentMethod.isTest && methodPassed && !currentMethod.ignore) { - bridge.onTestSuccess(new TestSuccess(currentTest, currentMethod.name)); + result.onTestSuccess(new TestSuccess(currentTest, currentMethod.name)); } // Calling synchronously is faster but keeps adding to the call stack. @@ -222,7 +222,7 @@ package asunit.runners { protected function recordFailure(error:Error):void { methodPassed = false; - bridge.onTestFailure(new TestFailure(currentTest, currentMethod.name, error)); + result.onTestFailure(new TestFailure(currentTest, currentMethod.name, error)); } protected function onAsyncMethodCompleted(event:Event = null):void { @@ -236,7 +236,7 @@ package asunit.runners { async.removeEventListener(TimeoutCommandEvent.TIMED_OUT, onAsyncMethodTimedOut); async.cancelPending(); - bridge.onTestCompleted(currentTest); + result.onTestCompleted(currentTest); dispatchEvent(new Event(Event.COMPLETE)); } @@ -360,7 +360,7 @@ package asunit.runners { } protected function warn(message:String, method:Method=null):void { - bridge.onWarning(new TestWarning(message, method)); + result.onWarning(new TestWarning(message, method)); } protected function getClassReferenceFromReflection(reflection:Reflection):Class { diff --git a/asunit-4.0/test/asunit/core/AsUnitCoreTest.as b/asunit-4.0/test/asunit/core/AsUnitCoreTest.as index 02aab45..ead0845 100644 --- a/asunit-4.0/test/asunit/core/AsUnitCoreTest.as +++ b/asunit-4.0/test/asunit/core/AsUnitCoreTest.as @@ -89,7 +89,7 @@ package asunit.core { // This is the number of Tests that will used the custom Runner: assertEquals(message, testCaseCount, CustomTestRunner.runCalledCount); // This is the number of test methods: - assertEquals("Total Test Count", testMethodCount, core.bridge.runCount); + assertEquals("Total Test Count", testMethodCount, core.result.runCount); } core.addEventListener(Event.COMPLETE, async.add(handler, 200)); diff --git a/asunit-4.0/test/asunit/runners/LegacyRunnerTest.as b/asunit-4.0/test/asunit/runners/LegacyRunnerTest.as index 2639a40..003f7f7 100644 --- a/asunit-4.0/test/asunit/runners/LegacyRunnerTest.as +++ b/asunit-4.0/test/asunit/runners/LegacyRunnerTest.as @@ -30,8 +30,8 @@ package asunit.runners { public function testSimpleSubclass():void { var handler:Function = function(event:Event):void { - assertEquals(0, testRunner.bridge.failureCount); - assertEquals(2, testRunner.bridge.runCount); + assertEquals(0, testRunner.result.failureCount); + assertEquals(2, testRunner.result.runCount); }; testRunner.addEventListener(Event.COMPLETE, addAsync(handler)); testRunner.run(LegacyTestCase); diff --git a/asunit-4.0/test/asunit/runners/TestRunnerAsyncMethodTest.as b/asunit-4.0/test/asunit/runners/TestRunnerAsyncMethodTest.as index aa4c807..d118900 100644 --- a/asunit-4.0/test/asunit/runners/TestRunnerAsyncMethodTest.as +++ b/asunit-4.0/test/asunit/runners/TestRunnerAsyncMethodTest.as @@ -35,7 +35,7 @@ package asunit.runners { } private function ensureRunnerHasNotYetFailed(e:Event):void { - assertFalse('runner result has not failed', runner.bridge.failureEncountered); + assertFalse('runner result has not failed', runner.result.failureEncountered); } [Test] @@ -45,8 +45,8 @@ package asunit.runners { } private function checkResultForIllegalOperationError(e:Event):void { - assertEquals('number of errors', 1, runner.bridge.errors.length); - var failure0:TestFailure = runner.bridge.errors[0] as TestFailure; + assertEquals('number of errors', 1, runner.result.errors.length); + var failure0:TestFailure = runner.result.errors[0] as TestFailure; assertEquals('exception type', 'flash.errors::IllegalOperationError', getQualifiedClassName(failure0.thrownException)); assertEquals('failed method name', 'shouldFailForBeingTooSlow', failure0.failedMethod); } diff --git a/asunit-4.0/test/asunit/runners/TestRunnerErrorMethodTest.as b/asunit-4.0/test/asunit/runners/TestRunnerErrorMethodTest.as index 16b5058..d93ff8a 100644 --- a/asunit-4.0/test/asunit/runners/TestRunnerErrorMethodTest.as +++ b/asunit-4.0/test/asunit/runners/TestRunnerErrorMethodTest.as @@ -40,7 +40,7 @@ package asunit.runners { } private function check_Result_has_one_error(e:Event):void { - var runnerResult:IResult = runner.bridge; + var runnerResult:IResult = runner.result; assertFalse('runnerResult.wasSuccessful', runnerResult.wasSuccessful); assertEquals('one error in testResult', 1, runnerResult.errorCount); diff --git a/asunit-4.0/test/asunit/runners/TestRunnerExpectsErrorTest.as b/asunit-4.0/test/asunit/runners/TestRunnerExpectsErrorTest.as index c4943de..c30cc8d 100644 --- a/asunit-4.0/test/asunit/runners/TestRunnerExpectsErrorTest.as +++ b/asunit-4.0/test/asunit/runners/TestRunnerExpectsErrorTest.as @@ -42,7 +42,7 @@ package asunit.runners { } private function check_Result_has_no_errors(e:Event):void { - var runnerResult:IResult = runner.bridge; + var runnerResult:IResult = runner.result; assertEquals('no errors in testResult', 0, runnerResult.errorCount); assertEquals('no failures in testResult', 0, runnerResult.failureCount); } @@ -53,7 +53,7 @@ package asunit.runners { } private function check_Result_has_one_assertion_failure(e:Event):void { - var runnerResult:IResult = runner.bridge; + var runnerResult:IResult = runner.result; assertFalse(runnerResult.wasSuccessful); assertEquals('one failure in testResult', 1, runnerResult.failureCount); diff --git a/asunit-4.0/test/asunit/runners/TestRunnerIgnoredMethodTest.as b/asunit-4.0/test/asunit/runners/TestRunnerIgnoredMethodTest.as index 038a57d..c374806 100644 --- a/asunit-4.0/test/asunit/runners/TestRunnerIgnoredMethodTest.as +++ b/asunit-4.0/test/asunit/runners/TestRunnerIgnoredMethodTest.as @@ -34,8 +34,8 @@ package asunit.runners { } private function checkResultHasOneIgnoredMethod(e:Event):void { - assertFalse('runnerResult.failureEncountered', runner.bridge.failureEncountered); - assertEquals('one ignored test in result', 1, runner.bridge.ignoredTests.length); + assertFalse('runnerResult.failureEncountered', runner.result.failureEncountered); + assertEquals('one ignored test in result', 1, runner.result.ignoredTests.length); } } } diff --git a/asunit-4.0/test/asunit/runners/TestRunnerTest.as b/asunit-4.0/test/asunit/runners/TestRunnerTest.as index 30b78fc..6ef66c3 100644 --- a/asunit-4.0/test/asunit/runners/TestRunnerTest.as +++ b/asunit-4.0/test/asunit/runners/TestRunnerTest.as @@ -97,10 +97,10 @@ package asunit.runners { } private function checkResultWasNotSuccessful(e:Event):void { - assertTrue(runner.bridge.failureEncountered); - assertFalse(runner.bridge.wasSuccessful); + assertTrue(runner.result.failureEncountered); + assertFalse(runner.result.wasSuccessful); - var failures:Array = runner.bridge.failures; + var failures:Array = runner.result.failures; assertEquals('one failure in testResult', 1, failures.length); var failure0:ITestFailure = failures[0] as TestFailure; @@ -143,13 +143,13 @@ package asunit.runners { [Test] public function shouldInjectTypes():void { runner.run(InjectionVerification, null, context); - assertFalse("Should not have encountered failures: " + runner.bridge.failures.join("\n\n"), runner.bridge.failureEncountered); + assertFalse("Should not have encountered failures: " + runner.result.failures.join("\n\n"), runner.result.failureEncountered); } [Test] public function shouldInjectWithUnknownAttribute():void { runner.run(InjectionFailure); - var warnings:Array = runner.bridge.warnings; + var warnings:Array = runner.result.warnings; assertEquals(1, warnings.length); } @@ -164,7 +164,7 @@ package asunit.runners { [Test] public function annotationsOnSuperClassShouldBeRespected():void { runner.run(AnnotatedSubClass); - assertFalse("Should not have failures: " + runner.bridge.failures.join("\n\n"), runner.bridge.failureEncountered); + assertFalse("Should not have failures: " + runner.result.failures.join("\n\n"), runner.result.failureEncountered); } } } From 492adb659d85feeaf5b48a05877f2b7b63b3703c Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 10 Oct 2010 21:59:20 -0700 Subject: [PATCH 13/54] Removed unused imports of CallbackBridge. --- asunit-4.0/src/asunit/printers/TextPrinter.as | 1 - asunit-4.0/test/asunit/core/AsUnitCoreTest.as | 1 - asunit-4.0/test/asunit/runners/LegacyRunnerTest.as | 1 - asunit-4.0/test/asunit/runners/TestRunnerAsyncMethodTest.as | 1 - 4 files changed, 4 deletions(-) diff --git a/asunit-4.0/src/asunit/printers/TextPrinter.as b/asunit-4.0/src/asunit/printers/TextPrinter.as index 0ebedf5..bfb73b9 100644 --- a/asunit-4.0/src/asunit/printers/TextPrinter.as +++ b/asunit-4.0/src/asunit/printers/TextPrinter.as @@ -18,7 +18,6 @@ package asunit.printers { import flash.text.TextFormat; import flash.utils.getQualifiedClassName; import flash.utils.getTimer; - import asunit.framework.CallbackBridge; public class TextPrinter extends Sprite implements IRunListener { public static var LOCAL_PATH_PATTERN:RegExp = /([A-Z]:\\[^\/:\*\?<>\|]+\.\w{2,6})|(\\{2}[^\/:\*\?<>\|]+\.\w{2,6})/g; diff --git a/asunit-4.0/test/asunit/core/AsUnitCoreTest.as b/asunit-4.0/test/asunit/core/AsUnitCoreTest.as index ead0845..ae6945a 100644 --- a/asunit-4.0/test/asunit/core/AsUnitCoreTest.as +++ b/asunit-4.0/test/asunit/core/AsUnitCoreTest.as @@ -1,7 +1,6 @@ package asunit.core { import asunit.asserts.*; - import asunit.framework.CallbackBridge; import asunit.framework.IAsync; import asunit.framework.IResult; import asunit.framework.Result; diff --git a/asunit-4.0/test/asunit/runners/LegacyRunnerTest.as b/asunit-4.0/test/asunit/runners/LegacyRunnerTest.as index 003f7f7..878796b 100644 --- a/asunit-4.0/test/asunit/runners/LegacyRunnerTest.as +++ b/asunit-4.0/test/asunit/runners/LegacyRunnerTest.as @@ -7,7 +7,6 @@ package asunit.runners { import asunit.support.LegacyTestCase; import flash.events.Event; - import asunit.framework.CallbackBridge; public class LegacyRunnerTest extends TestCase { diff --git a/asunit-4.0/test/asunit/runners/TestRunnerAsyncMethodTest.as b/asunit-4.0/test/asunit/runners/TestRunnerAsyncMethodTest.as index d118900..6700b90 100644 --- a/asunit-4.0/test/asunit/runners/TestRunnerAsyncMethodTest.as +++ b/asunit-4.0/test/asunit/runners/TestRunnerAsyncMethodTest.as @@ -1,7 +1,6 @@ package asunit.runners { import asunit.asserts.*; - import asunit.framework.CallbackBridge; import asunit.framework.TestCase; import asunit.util.Iterator; From 3bb516de43cbcd846e97c57520a7421a8b32181d Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Mon, 11 Oct 2010 01:18:39 -0700 Subject: [PATCH 14/54] Pulled up our ghetto injection pants with SwiftSuspenders. Injection points are now in constructors to avoid race conditions, and they use interfaces (e.g. IResult). Much cleanup. TextPrinter is once again a proper IoC observer; the decision of what it listens to is made by TextCore. --- asunit-4.0/lib/SwiftSuspenders-v1.5.1.swc | Bin 0 -> 14653 bytes asunit-4.0/src/asunit/core/AsUnitCore.as | 32 ++++++------- asunit-4.0/src/asunit/framework/IRunner.as | 2 - .../src/asunit/framework/IRunnerFactory.as | 6 +-- .../src/asunit/framework/RunnerFactory.as | 43 +++++------------- asunit-4.0/src/asunit/printers/TextPrinter.as | 29 ------------ asunit-4.0/src/asunit/runners/LegacyRunner.as | 7 ++- asunit-4.0/src/asunit/runners/SuiteRunner.as | 13 ++---- asunit-4.0/src/asunit/runners/TestRunner.as | 21 ++------- asunit-4.0/test/asunit/core/AsUnitCoreTest.as | 14 +++--- .../asunit/framework/RunnerFactoryTest.as | 6 --- .../runners/TestRunnerIgnoredMethodTest.as | 1 - 12 files changed, 51 insertions(+), 123 deletions(-) create mode 100644 asunit-4.0/lib/SwiftSuspenders-v1.5.1.swc diff --git a/asunit-4.0/lib/SwiftSuspenders-v1.5.1.swc b/asunit-4.0/lib/SwiftSuspenders-v1.5.1.swc new file mode 100644 index 0000000000000000000000000000000000000000..293febf2d6e85cd06bdb2fd55e390a2b6d5a9c65 GIT binary patch literal 14653 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 WD@cQa{U Date: Mon, 11 Oct 2010 01:25:53 -0700 Subject: [PATCH 15/54] Corrected a misunderstanding regarding [RunWith]: the runner class specified in the metadata is applied only to the class to which it's attached. The custom runner is not applied to the children, e.g. the tests in the suite. --- .../{CustomTestRunner.as => CustomSuiteRunner.as} | 9 +++++++-- asunit-4.0/test/asunit/support/SuiteWithCustomRunner.as | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) rename asunit-4.0/test/asunit/support/{CustomTestRunner.as => CustomSuiteRunner.as} (70%) diff --git a/asunit-4.0/test/asunit/support/CustomTestRunner.as b/asunit-4.0/test/asunit/support/CustomSuiteRunner.as similarity index 70% rename from asunit-4.0/test/asunit/support/CustomTestRunner.as rename to asunit-4.0/test/asunit/support/CustomSuiteRunner.as index 96060db..3ffd6e9 100644 --- a/asunit-4.0/test/asunit/support/CustomTestRunner.as +++ b/asunit-4.0/test/asunit/support/CustomSuiteRunner.as @@ -2,16 +2,21 @@ package asunit.support { import asunit.framework.CallbackBridge; import asunit.framework.IResult; - import asunit.runners.TestRunner; + import asunit.framework.IRunnerFactory; + import asunit.runners.SuiteRunner; import flash.display.DisplayObjectContainer; - public class CustomTestRunner extends TestRunner { + public class CustomSuiteRunner extends SuiteRunner { // Used so that test cases can // verify that this custom runner // worked. public static var runCalledCount:int; + + public function CustomSuiteRunner(factory:IRunnerFactory = null) { + super(factory); + } override public function run(testClass:Class, testMethod:String=null, visualContext:DisplayObjectContainer=null):void { runCalledCount++; diff --git a/asunit-4.0/test/asunit/support/SuiteWithCustomRunner.as b/asunit-4.0/test/asunit/support/SuiteWithCustomRunner.as index a20c3fc..52b0e08 100644 --- a/asunit-4.0/test/asunit/support/SuiteWithCustomRunner.as +++ b/asunit-4.0/test/asunit/support/SuiteWithCustomRunner.as @@ -1,7 +1,7 @@ package asunit.support { [Suite] - [RunWith("asunit.support.CustomTestRunner")] + [RunWith("asunit.support.CustomSuiteRunner")] public class SuiteWithCustomRunner { public var succeedAssertTrue:SucceedAssertTrue; From 7b4bedee93874b0d63c2e4b35ca2605efb023b6e Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Mon, 11 Oct 2010 01:27:00 -0700 Subject: [PATCH 16/54] Ant build now uses the SwiftSuspenders SWC. --- asunit-4.0/build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asunit-4.0/build.xml b/asunit-4.0/build.xml index 9edd3ca..febb79c 100644 --- a/asunit-4.0/build.xml +++ b/asunit-4.0/build.xml @@ -29,7 +29,7 @@ - + From 186a03aff814b8d89175296d80946beca9adc377 Mon Sep 17 00:00:00 2001 From: lukebayes Date: Tue, 12 Oct 2010 21:37:52 -0700 Subject: [PATCH 17/54] Updated rakefile to accept SwiftSuspenders changes from Robert Penner --- asunit-4.0/rakefile.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/asunit-4.0/rakefile.rb b/asunit-4.0/rakefile.rb index 1758cce..c3276e8 100644 --- a/asunit-4.0/rakefile.rb +++ b/asunit-4.0/rakefile.rb @@ -41,6 +41,7 @@ def configure_test_task(t) t.default_size = '1000,600' t.source_path << 'src' t.library_path << 'lib/Reflection.swc' + t.library_path << 'lib/SwiftSuspenders-v1.5.1.swc' t.debug = true t.static_link_runtime_shared_libraries = true apply_as3_meta_data_args(t) @@ -133,6 +134,7 @@ def configure_test_task(t) t.include_sources << 'src' t.source_path << 'src' t.library_path << 'lib/Reflection.swc' + t.library_path << 'lib/SwiftSuspenders-v1.5.1.swc' t.static_link_runtime_shared_libraries = true apply_as3_meta_data_args(t) end From 9cbce80e9ebc8a2f88a7a46c4afa25b3d4e3622b Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Wed, 13 Oct 2010 17:21:25 -0700 Subject: [PATCH 18/54] Created branch for continuous integration with Ant using the FlexUnit task. --- asunit-4.0/build.xml | 41 +++- asunit-4.0/lib/flexUnitTasks.jar | Bin 0 -> 572382 bytes asunit-4.0/src/asunit/core/FlexUnitCICore.as | 22 ++ .../src/asunit/printers/FlexUnitCIPrinter.as | 211 ++++++++++++++++++ asunit-4.0/test/AsUnitCIRunner.as | 18 ++ 5 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 asunit-4.0/lib/flexUnitTasks.jar create mode 100644 asunit-4.0/src/asunit/core/FlexUnitCICore.as create mode 100644 asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as create mode 100644 asunit-4.0/test/AsUnitCIRunner.as diff --git a/asunit-4.0/build.xml b/asunit-4.0/build.xml index febb79c..6974506 100644 --- a/asunit-4.0/build.xml +++ b/asunit-4.0/build.xml @@ -14,7 +14,13 @@ - + + + + + + + Using Flex SDK at: ${FLEX_HOME} @@ -42,5 +48,38 @@ + + + [test] Running Unit Tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/asunit-4.0/lib/flexUnitTasks.jar b/asunit-4.0/lib/flexUnitTasks.jar new file mode 100644 index 0000000000000000000000000000000000000000..79c53391d2f3c612e7d30e4a39e87e982ce3248b GIT binary patch literal 572382 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%0AONTt^$2W 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

MeUJ1W1-=Ql{XouiPExMq9E8B7*7jBf1h;pUD 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 z

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

#$J&TzH_EixleV22Q@R+cdpbHTGfh=5 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 lRDBZ" + + "" + + ""; + sendMessage(xmlMessageIgnore); + } + + protected static function xmlEscapeMessage(message:String):String { + if (!message) return ''; + + var escape:XML = ; + escape.setChildren( message ); + return escape.children()[0].toXMLString(); + } + + public function onTestFailure(failure:ITestFailure):void { + sendMessage(getFailureMessage(failure)); + } + + protected function getFailureMessage(failure:ITestFailure):String { + var status:String = failure.isFailure ? FAILURE : ERROR; +// var stackTrace:String = xmlEscapeMessage(failure.thrownException.getStackTrace()); var stackTrace:String = failure.thrownException.getStackTrace(); + var xml:String = + "" + + + "" + + "" + + "" + + + ""; + + return xml; + } + + protected function sendMessage(message:String):void { + if (!socket.connected) { + messageQueue.push(message); + return; + } + socket.send(message); + trace('+++++++++ sendMessage() - \n' + message + '\n'); + } + +// protected function sendResults(msg:String):void +// { +// if(socket.connected) +// { +// socket.send( msg ); +// } +// +// trace(msg); +// } + + protected function onConnect(event:Event):void { + connectTimeout.stop(); + sendQueuedMessages(); + } + + protected function sendQueuedMessages():void { + while (messageQueue.length) { + sendMessage(messageQueue.shift()); + } + } + + private function onData( event : DataEvent ) : void + { + trace('onData: ' + event.data); + +// // If we received an acknowledgement on startup, the java server is ready and we can start sending. +// if ( data == START_OF_TEST_RUN_ACK ) { +// setStatusReady(); +// } else + + if (event.data == END_OF_TEST_ACK) { + // If we received an acknowledgement finish-up. + exit(); + } + } + + protected function onErrorEvent(event:Event):void { + trace('FlexUnitCIPrinter::onErrorEvent() - event: ' + event); + //throw new Error('FlashBuilderPrinter::onErrorEvent() - event: ' + event); + } + + public function onRunStarted():void { + } + + public function onTestStarted(test:Object):void { + startTime = getTimer(); + } + + public function onTestCompleted(test:Object):void { +// testTimes.push({test:test, duration:duration}); + } + + public function onTestSuccess(success:ITestSuccess):void + { + //TODO: move test time into ITestSuccess + var duration:Number = (getTimer() - startTime) / 1000; + var xmlMessageSuccess:String = ""; + sendMessage(xmlMessageSuccess); + } + + public function onRunCompleted(result:IResult):void { + sendMessage(END_OF_TEST_RUN); + } + + /** + * Exit the test runner by calling the ApplicationCloser. + */ + protected function exit():void + { + socket.close(); + fscommand("quit"); + } + + public function onWarning(warning : ITestWarning) : void { + } + } +} diff --git a/asunit-4.0/test/AsUnitCIRunner.as b/asunit-4.0/test/AsUnitCIRunner.as new file mode 100644 index 0000000..b5db877 --- /dev/null +++ b/asunit-4.0/test/AsUnitCIRunner.as @@ -0,0 +1,18 @@ +package { + + import asunit.core.FlexUnitCICore; + import asunit.core.TextCore; + + import flash.display.MovieClip; + + [SWF(width="1024", height="640", backgroundColor="#000000", frameRate="61")] + public class AsUnitCIRunner extends MovieClip { + + private var core:TextCore; + + public function AsUnitCIRunner() { + core = new FlexUnitCICore(); + core.start(AllTests, null, this); + } + } +} \ No newline at end of file From e53b666c2da3530b715231a16f5da6d095209254 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Wed, 13 Oct 2010 17:32:12 -0700 Subject: [PATCH 19/54] Added metadata to mxmlc arguments. --- asunit-4.0/build.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/asunit-4.0/build.xml b/asunit-4.0/build.xml index 6974506..680bf23 100644 --- a/asunit-4.0/build.xml +++ b/asunit-4.0/build.xml @@ -68,6 +68,7 @@ + From d29fff4909f57e2c827b53178d2ab05bd3efd10c Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Wed, 13 Oct 2010 17:32:53 -0700 Subject: [PATCH 20/54] Added unit test report folder to .gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3075ab1..eed7d37 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ asunit-3.0/obj asunit-4.0/bin asunit-4.0/bin-debug asunit-4.0/obj +asunit-4.0/report html-template .DS_Store .actionScriptProperties From 0a0946732486c8c82d998e9318b461ea57fd927f Mon Sep 17 00:00:00 2001 From: Stray Date: Sat, 6 Nov 2010 16:09:11 +0000 Subject: [PATCH 21/54] Fixed hole in assertArraysEqualIgnoringOrder where the assert passed incorrectly where the arrays contain repeated items, ie: [item1, item1, item2] equals [item1, item2, item2] These are now found to be not equal. Added tests for this to the asunit3 and asunit4 suites (which were failing before the change to Assert), and updated the Assert in both suites so that they now pass. Refactored logic for bothNull, eitherNull and differentLengths tests within asserts to use helper functions. Refactored the null defense in assertEquals to give a cleaner early exit where expected is null. --- asunit-3.0/src/asunit/framework/Assert.as | 82 +++++++++++++------ .../AssertEqualsArraysIgnoringOrderTest.as | 14 ++++ asunit-4.0/src/asunit/framework/Assert.as | 32 +++++--- .../AssertEqualsArraysIgnoringOrderTest.as | 14 ++++ 4 files changed, 107 insertions(+), 35 deletions(-) mode change 100644 => 100755 asunit-4.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as diff --git a/asunit-3.0/src/asunit/framework/Assert.as b/asunit-3.0/src/asunit/framework/Assert.as index 4ef249f..84166f5 100644 --- a/asunit-3.0/src/asunit/framework/Assert.as +++ b/asunit-3.0/src/asunit/framework/Assert.as @@ -147,22 +147,29 @@ package asunit.framework { throw new IllegalOperationError("Invalid argument count"); } - if(expected == null && actual == null) { + if(bothNull(expected, actual)) { return; } - try { - if(expected != null && expected.equals(actual)) { + if(eitherNull(expected, actual)) { + throw new AssertionFailedError(format(message, expected, actual)); + } + + // now we know both are not null + + try { + if(expected.equals(actual)) { return; } } catch(e:Error) { - if(expected != null && expected == actual) { + if(expected == actual) { return; } } - throw new AssertionFailedError(format(message, expected, actual)); + throw new AssertionFailedError(format(message, expected, actual)); + } /** * Asserts that an object isn't null. If it is @@ -323,17 +330,18 @@ package asunit.framework { throw new IllegalOperationError("Invalid argument count"); } - if (expected == null && actual == null) { + if (bothNull(expected, actual)) { return; } - if ((expected == null && actual != null) || (expected != null && actual == null)) { + if (eitherNull(expected, actual)) { failNotEquals(message, expected, actual); } // from here on: expected != null && actual != null - if (expected.length != actual.length) { + if (differentLengths(expected, actual)) { failNotEquals(message, expected, actual); } - for (var i : int = 0; i < expected.length; i++) { + var iLength:uint = expected.length; + for (var i : int = 0; i < iLength; i++) { assertEquals(expected[i], actual[i]); } } @@ -363,36 +371,47 @@ package asunit.framework { throw new IllegalOperationError("Invalid argument count"); } - if (expected == null && actual == null) { + if (bothNull(expected, actual)) { return; } - if ((expected == null && actual != null) || (expected != null && actual == null)) { + if (eitherNull(expected, actual)) { failNotEquals(message, expected, actual); } // from here on: expected != null && actual != null - if (expected.length != actual.length) { + if (differentLengths(expected, actual)) { failNotEquals(message, expected, actual); } - for (var i : int = 0; i < expected.length; i++) { - var foundMatch : Boolean = false; - var expectedMember : Object = expected[i]; - for (var j : int = 0; j < actual.length; j++) { - var actualMember : Object = actual[j]; + + var unusedPotentialMatches:Array = actual.slice(); + + var iLength:uint = expected.length; + var jLength:uint; + + searchingForExpectedItems: + for (var i:int = 0; i < iLength; i++) + { + var expectedMember : Object = expected[i]; + jLength = unusedPotentialMatches.length; + + checkingAgainstActualItems: + for (var j : int = 0; j < jLength; j++) { + var actualMember : Object = unusedPotentialMatches[j]; try { assertEquals(expectedMember, actualMember); - foundMatch = true; - break; + unusedPotentialMatches.splice(j, 1); + continue searchingForExpectedItems; } catch (e : AssertionFailedError) { // no match, try next } } - if (!foundMatch) { - failNotEquals("Found no match for " + expectedMember + ";", expected, actual); - } - } + + failNotEquals("Found no match for " + expectedMember + ";", expected, actual); + + } } - + + static private function failNotEquals(message:String, expected:Object, actual:Object):void { fail(format(message, expected, actual)); } @@ -404,5 +423,20 @@ package asunit.framework { } return formatted + "expected:<" + expected + "> but was:<" + actual + ">"; } + + static public function bothNull(v1:*, v2:*):Boolean + { + return ((v1==null)&&(v2==null)); + } + + static public function eitherNull(v1:*, v2:*):Boolean + { + return ((v1==null)||(v2==null)); + } + + static public function differentLengths(v1:*, v2:*):Boolean + { + return (v1.length != v2.length); + } } } diff --git a/asunit-3.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as b/asunit-3.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as index daa4a70..93a9faf 100755 --- a/asunit-3.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as +++ b/asunit-3.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as @@ -3,6 +3,7 @@ import asunit.errors.AssertionFailedError; import asunit.framework.TestCase; import asunit.framework.Assert; + import flash.display.Sprite; /** * Tests assertEqualsArraysIgnoringOrder @@ -88,5 +89,18 @@ public function testArrayDifferentLength2():void { assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def"], ["abc", "def", "ghi"]); } + + public function testArrayWithRepeatedItems():void { + var spr1:Sprite = new Sprite(); + var spr2:Sprite = new Sprite(); + var spr3:Sprite = new Sprite(); + + var controlArray:Array = [spr1, spr2, spr3, spr1]; + var matchingArray:Array = [spr1, spr2, spr1, spr3]; + var nonMatchingArray:Array = [spr1, spr2, spr3, spr2]; + + assertEqualsArraysIgnoringOrder('these arrays should match', controlArray, matchingArray); + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, controlArray, nonMatchingArray); + } } } \ No newline at end of file diff --git a/asunit-4.0/src/asunit/framework/Assert.as b/asunit-4.0/src/asunit/framework/Assert.as index 4ef249f..808c8a4 100644 --- a/asunit-4.0/src/asunit/framework/Assert.as +++ b/asunit-4.0/src/asunit/framework/Assert.as @@ -373,24 +373,34 @@ package asunit.framework { if (expected.length != actual.length) { failNotEquals(message, expected, actual); } - for (var i : int = 0; i < expected.length; i++) { - var foundMatch : Boolean = false; - var expectedMember : Object = expected[i]; - for (var j : int = 0; j < actual.length; j++) { - var actualMember : Object = actual[j]; + + var unusedPotentialMatches:Array = actual.slice(); + + var iLength:uint = expected.length; + var jLength:uint; + + searchingForExpectedItems: + for (var i:int = 0; i < iLength; i++) + { + var expectedMember : Object = expected[i]; + jLength = unusedPotentialMatches.length; + + checkingAgainstActualItems: + for (var j : int = 0; j < jLength; j++) { + var actualMember : Object = unusedPotentialMatches[j]; try { assertEquals(expectedMember, actualMember); - foundMatch = true; - break; + unusedPotentialMatches.splice(j, 1); + continue searchingForExpectedItems; } catch (e : AssertionFailedError) { // no match, try next } } - if (!foundMatch) { - failNotEquals("Found no match for " + expectedMember + ";", expected, actual); - } - } + + failNotEquals("Found no match for " + expectedMember + ";", expected, actual); + + } } static private function failNotEquals(message:String, expected:Object, actual:Object):void { diff --git a/asunit-4.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as b/asunit-4.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as old mode 100644 new mode 100755 index f5ef4b0..b974881 --- a/asunit-4.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as +++ b/asunit-4.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as @@ -3,6 +3,7 @@ import asunit.errors.AssertionFailedError; import asunit.framework.TestCase; import asunit.framework.Assert; + import flash.display.Sprite; /** * Tests assertEqualsArraysIgnoringOrder @@ -84,5 +85,18 @@ public function testArrayDifferentLength2():void { assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def"], ["abc", "def", "ghi"]); } + + public function testArrayWithRepeatedItems():void { + var spr1:Sprite = new Sprite(); + var spr2:Sprite = new Sprite(); + var spr3:Sprite = new Sprite(); + + var controlArray:Array = [spr1, spr2, spr3, spr1]; + var matchingArray:Array = [spr1, spr2, spr1, spr3]; + var nonMatchingArray:Array = [spr1, spr2, spr3, spr2]; + + assertEqualsArraysIgnoringOrder('these arrays should match', controlArray, matchingArray); + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, controlArray, nonMatchingArray); + } } } \ No newline at end of file From 828ff0f32aa6c35e5a103d5f97109229a0d61e61 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sat, 6 Nov 2010 23:48:27 -0700 Subject: [PATCH 22/54] Removed InjectionDelegate which is no longer used. --- .../src/asunit/framework/InjectionDelegate.as | 96 ------------------- .../asunit/framework/InjectionDelegateTest.as | 79 --------------- 2 files changed, 175 deletions(-) delete mode 100644 asunit-4.0/src/asunit/framework/InjectionDelegate.as delete mode 100644 asunit-4.0/test/asunit/framework/InjectionDelegateTest.as diff --git a/asunit-4.0/src/asunit/framework/InjectionDelegate.as b/asunit-4.0/src/asunit/framework/InjectionDelegate.as deleted file mode 100644 index 581d783..0000000 --- a/asunit-4.0/src/asunit/framework/InjectionDelegate.as +++ /dev/null @@ -1,96 +0,0 @@ -package asunit.framework { - - import p2.reflect.ReflectionMetaData; - import p2.reflect.Reflection; - - import flash.utils.Dictionary; - import asunit.errors.UsageError; - import p2.reflect.ReflectionVariable; - import p2.reflect.ReflectionMember; - import flash.utils.getDefinitionByName; - - public class InjectionDelegate { - //--------------------------------------- - // CLASS CONSTANTS - //--------------------------------------- - - public static const THROW_ERROR_ON_MISSING_INJECTION_POINT:Boolean = true; - public static const INJECT_ANNOTATION:String = "Inject"; - - private var entities:Dictionary; - - public function InjectionDelegate() - { - entities = new Dictionary(); - } - - /** - * @param addict * an entity with at least one [Inject] annotation - */ - public function updateInjectionPoints(addict:*, throwErrorOnMissingInjection:Boolean=false):void { - var reflection:Reflection = Reflection.create(addict); - var members:Array = reflection.getMembersByMetaData(INJECT_ANNOTATION); - var addictName:String = reflection.name - if (throwErrorOnMissingInjection) - { - validateMembers(members, addictName); - } - var reflectionVariable:ReflectionVariable; - var injectionPointFound:Boolean; - members.forEach(function(member:ReflectionMember, index:int, items:Array):void { - reflectionVariable = member as ReflectionVariable; - if (reflectionVariable) - { - updateInjectionPoint(addict, reflectionVariable); - injectionPointFound = true; - } - }); - - if (!injectionPointFound && throwErrorOnMissingInjection) - { - throw new UsageError("InjectionDelegate expected at least one [Inject] annotation on a variable or accessor on" + addictName); - } - - } - - /** - * For each inject annotation we call this method - * @private - * @return - */ - private function updateInjectionPoint(addict:*, member:ReflectionVariable):void { - //FIXME: This actually could be a getter. If someone has their head up their booty. - var instance:* = getInstanceFromTypeName(member.type); - addict[member.name] = instance; - } - - private function getInstanceFromTypeName(name:String):* { - var clazz:Class = getDefinitionByName(name) as Class; - return getOrCacheInstanceFromClass(clazz); - } - - private function getOrCacheInstanceFromClass(clazz:Class):* { - if (!entities[clazz]) - { - //FIXME: This will choke if given a class with constructor arguments! - entities[clazz] = new clazz(); - updateInjectionPoints(entities[clazz]); - } - - return entities[clazz]; - } - - /** - * @private - */ - private function validateMembers(members:Array, name:String):void - { - if (!members || members.length == 0) - { - throw new UsageError("InjectionDelegate expects at least one [Inject] annotation on " + name); - } - - } - - } -} \ No newline at end of file diff --git a/asunit-4.0/test/asunit/framework/InjectionDelegateTest.as b/asunit-4.0/test/asunit/framework/InjectionDelegateTest.as deleted file mode 100644 index 242ca1d..0000000 --- a/asunit-4.0/test/asunit/framework/InjectionDelegateTest.as +++ /dev/null @@ -1,79 +0,0 @@ -package asunit.framework { - - import asunit.asserts.*; - - public class InjectionDelegateTest { - - [Inject] - public var injector:InjectionDelegate; - - [Test] - public function testInstantiated():void { - assertTrue("instance is InjectionDelegate", injector is InjectionDelegate); - } - - [Test] - public function testUpdateInjectionPoints():void { - var addict:Addict = new Addict(); - injector.updateInjectionPoints(addict); - assertNotNull(addict.array); - } - - [Test] - public function injectedInstancesShouldBeCached():void { - var addict:Addict = new Addict(); - var addict2:Addict = new Addict(); - - injector.updateInjectionPoints(addict); - injector.updateInjectionPoints(addict2); - - assertSame(addict.array, addict2.array); - - } - - [Test(expects="asunit.errors.UsageError")] - public function shouldThrowUsageErrorOnInvalidAddict():void - { - var invalidAddict:AddictWithNoInjections = new AddictWithNoInjections(); - injector.updateInjectionPoints(invalidAddict, InjectionDelegate.THROW_ERROR_ON_MISSING_INJECTION_POINT); - } - - [Test(expects="asunit.errors.UsageError")] - public function shouldThrowUsageErrorIfNoVariableInjectionsFound():void - { - var invalidAddict:AddictWithOnlyMethodInjection = new AddictWithOnlyMethodInjection(); - injector.updateInjectionPoints(invalidAddict, InjectionDelegate.THROW_ERROR_ON_MISSING_INJECTION_POINT); - } - - [Test] - public function shouldNotThrowUsageErrorOnInvalidAddict():void - { - var invalidAddict:AddictWithNoInjections = new AddictWithNoInjections(); - injector.updateInjectionPoints(invalidAddict); - } - - [Test] - public function shouldNotThrowUsageErrorIfNoVariableInjectionsFound():void - { - var invalidAddict:AddictWithOnlyMethodInjection = new AddictWithOnlyMethodInjection(); - injector.updateInjectionPoints(invalidAddict); - } - - } -} - -//An addict that has no inject annotations -class AddictWithNoInjections {} - -class AddictWithOnlyMethodInjection { - [Inject] - public function pleaseInjectMe(array:Array):void{}; -} - -class Addict { - [Inject] - public var array:Array; - - [Inject] - public function pleaseInjectMe(array:Array):void{}; -} \ No newline at end of file From 4823858d4675029b898cead17e08b24b9ce4387a Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sat, 6 Nov 2010 23:51:07 -0700 Subject: [PATCH 23/54] AsUnitCore now extends EventDispatcher instead of delegating. Several other classes were already doing that, might as well be consistent and have less code. --- asunit-4.0/src/asunit/core/AsUnitCore.as | 34 +----------------------- 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/asunit-4.0/src/asunit/core/AsUnitCore.as b/asunit-4.0/src/asunit/core/AsUnitCore.as index 4d06947..448eca9 100644 --- a/asunit-4.0/src/asunit/core/AsUnitCore.as +++ b/asunit-4.0/src/asunit/core/AsUnitCore.as @@ -4,7 +4,6 @@ package asunit.core { import asunit.framework.IRunnerFactory; import asunit.framework.Result; import asunit.framework.IRunner; - import asunit.framework.InjectionDelegate; import asunit.framework.RunnerFactory; import asunit.framework.TestObserver; import asunit.runners.LegacyRunner; @@ -13,15 +12,12 @@ package asunit.core { import flash.display.DisplayObjectContainer; import flash.events.Event; import flash.events.EventDispatcher; - import flash.events.IEventDispatcher; - public class AsUnitCore implements IEventDispatcher { + public class AsUnitCore extends EventDispatcher { internal var result:IResult; protected var injector:Injector; - protected var bridgeInjector:InjectionDelegate; - protected var dispatcher:IEventDispatcher; protected var legacyRunnerReference:LegacyRunner; protected var observers:Array; protected var runner:IRunner; @@ -30,7 +26,6 @@ package asunit.core { public function AsUnitCore() { super(); initializeInjector(); - initializeDispatcher(); initializeObservers(); initialize(); } @@ -42,10 +37,6 @@ package asunit.core { result = new Result(); injector.mapValue(IResult, result); } - - protected function initializeDispatcher():void { - dispatcher = new EventDispatcher(this); - } /** * Template method for subclasses to override, @@ -148,28 +139,5 @@ package asunit.core { protected function onRunCompleted():void { } - // BEGIN: Implement the IEventDispatcher Interface: - - public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void { - dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference); - } - - public function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void { - dispatcher.removeEventListener(type, listener, useCapture); - } - - public function dispatchEvent(event:Event):Boolean { - return dispatcher.dispatchEvent(event); - } - - public function hasEventListener(type:String):Boolean { - return dispatcher.hasEventListener(type); - } - - public function willTrigger(type:String):Boolean { - return dispatcher.willTrigger(type); - } - - // END: Implement the IEvent Dispatcher Interface: } } From 614702cdc825d1dd3be44b0dae3cb59f12b2b158 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sat, 6 Nov 2010 23:59:57 -0700 Subject: [PATCH 24/54] Changed SuiteRunnerTest back to use [Before] method to instantiate the unit under test. This necessitated restoring a way to pass an IResult to the SuiteRunner and verify it. SuiteRunner also now extends EventDispatcher to be consistent with the rest (AsUnitCore, TestRunner, etc.). --- asunit-4.0/src/asunit/runners/SuiteRunner.as | 52 +++++++------------ .../test/asunit/runners/SuiteRunnerTest.as | 17 +++--- 2 files changed, 28 insertions(+), 41 deletions(-) diff --git a/asunit-4.0/src/asunit/runners/SuiteRunner.as b/asunit-4.0/src/asunit/runners/SuiteRunner.as index b1d7e44..967e023 100644 --- a/asunit-4.0/src/asunit/runners/SuiteRunner.as +++ b/asunit-4.0/src/asunit/runners/SuiteRunner.as @@ -1,34 +1,42 @@ package asunit.runners { import asunit.framework.CallbackBridge; + import asunit.framework.IResult; import asunit.framework.IRunner; import asunit.framework.IRunnerFactory; + import asunit.framework.Result; import asunit.framework.RunnerFactory; import asunit.framework.SuiteIterator; import asunit.util.Iterator; + import org.swiftsuspenders.Injector; import flash.display.DisplayObjectContainer; import flash.events.Event; import flash.events.EventDispatcher; - import flash.events.IEventDispatcher; import flash.events.TimerEvent; import flash.utils.Timer; - public class SuiteRunner implements IEventDispatcher, IRunner { + public class SuiteRunner extends EventDispatcher implements IRunner { - protected var dispatcher:IEventDispatcher; + public var result:IResult; + protected var testClasses:Iterator; protected var timer:Timer; protected var visualContext:DisplayObjectContainer; protected var testMethod:String; - - private var factory:IRunnerFactory; + protected var injector:Injector; + protected var factory:IRunnerFactory; - public function SuiteRunner(factory:IRunnerFactory = null) { - timer = new Timer(0, 1); - dispatcher = new EventDispatcher(); - this.factory = factory || new RunnerFactory(); - } + public function SuiteRunner(factory:IRunnerFactory = null, result:IResult = null, injector:Injector = null) { + timer = new Timer(0, 1); + + this.injector = injector ||= new Injector(); + injector.mapValue(Injector, injector); + this.result = result ||= new Result(); + injector.mapValue(IResult, result); + this.factory = factory ||= injector.instantiate(RunnerFactory); + injector.mapValue(IRunnerFactory, factory); + } public function run(suite:Class, testMethod:String=null, visualContext:DisplayObjectContainer=null):void { this.visualContext = visualContext; @@ -78,29 +86,5 @@ package asunit.runners { */ protected function onRunCompleted():void { } - - // BEGIN: Implement the IEvent Dispatcher Interface: - - public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void { - dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference); - } - - public function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void { - dispatcher.removeEventListener(type, listener, useCapture); - } - - public function dispatchEvent(event:Event):Boolean { - return dispatcher.dispatchEvent(event); - } - - public function hasEventListener(type:String):Boolean { - return dispatcher.hasEventListener(type); - } - - public function willTrigger(type:String):Boolean { - return dispatcher.willTrigger(type); - } - - // END: Implement the IEvent Dispatcher Interface: } } diff --git a/asunit-4.0/test/asunit/runners/SuiteRunnerTest.as b/asunit-4.0/test/asunit/runners/SuiteRunnerTest.as index ebfbea7..36f2973 100644 --- a/asunit-4.0/test/asunit/runners/SuiteRunnerTest.as +++ b/asunit-4.0/test/asunit/runners/SuiteRunnerTest.as @@ -5,6 +5,7 @@ package asunit.runners { import asunit.framework.Result; import asunit.support.DoubleFailSuite; import asunit.support.InjectionVerification; + import flash.display.Sprite; import flash.events.Event; @@ -12,12 +13,14 @@ package asunit.runners { [Inject] public var async:IAsync; - - [Inject] - public var suiteRunner:SuiteRunner; - - [Inject] - public var runnerResult:Result; + private var suiteRunner:SuiteRunner; + private var runnerResult:Result; + + [Before] + public function setUp():void { + runnerResult = new Result(); + suiteRunner = new SuiteRunner(null, runnerResult); + } public function testRunTriggersCompleteEvent():void { suiteRunner.addEventListener(Event.COMPLETE, async.add(checkResultWasNotSuccessful)); @@ -31,7 +34,7 @@ package asunit.runners { [Test] public function testCanHandATestToSuiteRunner():void { suiteRunner.addEventListener(Event.COMPLETE, async.add()); - suiteRunner.run(InjectionVerification); + suiteRunner.run(InjectionVerification, null, new Sprite()); assertFalse(runnerResult.wasSuccessful); } } From af84f4d9a54168da2b5178ae960d163cbdce567f Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 7 Nov 2010 00:02:24 -0700 Subject: [PATCH 25/54] Result doesn't extend EventDispatcher any more. It's been a long time since it needed to. --- asunit-4.0/src/asunit/framework/Result.as | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/asunit-4.0/src/asunit/framework/Result.as b/asunit-4.0/src/asunit/framework/Result.as index cacbd67..27158e4 100644 --- a/asunit-4.0/src/asunit/framework/Result.as +++ b/asunit-4.0/src/asunit/framework/Result.as @@ -2,8 +2,6 @@ package asunit.framework { import asunit.errors.UsageError; - import flash.events.EventDispatcher; - /** * A Result collects the results of executing * a test case. It is an instance of the Collecting Parameter pattern. @@ -13,7 +11,7 @@ package asunit.framework { * * @see Test */ - public class Result extends EventDispatcher implements IResult { + public class Result implements IResult { protected var _runCount:uint = 0; protected var _runTime:Number; From e45ec523bb984734ab71ca6535961fb7db09f137 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 7 Nov 2010 00:05:55 -0700 Subject: [PATCH 26/54] Small cleanups: AsyncTest' unused dispatcher, AllTests' references to deleted tests, RunnerFactory formatting & Injector mapping. --- asunit-4.0/src/asunit/framework/RunnerFactory.as | 10 ++++------ asunit-4.0/test/AllTests.as | 2 -- asunit-4.0/test/asunit/framework/AsyncTest.as | 4 ---- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/asunit-4.0/src/asunit/framework/RunnerFactory.as b/asunit-4.0/src/asunit/framework/RunnerFactory.as index 21aeb47..5a6f1f7 100644 --- a/asunit-4.0/src/asunit/framework/RunnerFactory.as +++ b/asunit-4.0/src/asunit/framework/RunnerFactory.as @@ -37,18 +37,17 @@ package asunit.framework { public function RunnerFactory(injector:Injector = null) { DefaultSuiteRunner = DEFAULT_SUITE_RUNNER; DefaultTestRunner = DEFAULT_TEST_RUNNER; - this.injector = injector || new Injector(); + this.injector = injector ||= new Injector(); + injector.mapValue(Injector, injector); } private var _injector:Injector; - public function get injector():Injector - { + public function get injector():Injector { return _injector; } - public function set injector(value:Injector):void - { + public function set injector(value:Injector):void { _injector = value; } @@ -56,7 +55,6 @@ package asunit.framework { * runnerFor is the primary inerface to the RunnerFactory */ public function runnerFor(testOrSuite:Class):IRunner { - //trace(">> runnerFor: " + testOrSuite + " with current default of: " + DefaultTestRunner); validate(testOrSuite); return getRunnerForTestOrSuite(testOrSuite); } diff --git a/asunit-4.0/test/AllTests.as b/asunit-4.0/test/AllTests.as index feb0085..300e416 100644 --- a/asunit-4.0/test/AllTests.as +++ b/asunit-4.0/test/AllTests.as @@ -14,7 +14,6 @@ package { import asunit.framework.AsyncMethodTest; import asunit.framework.AsyncTest; import asunit.framework.CallbackBridgeTest; - import asunit.framework.InjectionDelegateTest; import asunit.framework.NestedSuiteIteratorTest; import asunit.framework.ProceedOnEventTest; import asunit.framework.ResultTest; @@ -47,7 +46,6 @@ package { public var asunit_framework_AsyncMethodTest:asunit.framework.AsyncMethodTest; public var asunit_framework_AsyncTest:asunit.framework.AsyncTest; public var asunit_framework_CallbackBridgeTest:asunit.framework.CallbackBridgeTest; - public var asunit_framework_InjectionDelegateTest:asunit.framework.InjectionDelegateTest; public var asunit_framework_NestedSuiteIteratorTest:asunit.framework.NestedSuiteIteratorTest; public var asunit_framework_ProceedOnEventTest:asunit.framework.ProceedOnEventTest; public var asunit_framework_ResultTest:asunit.framework.ResultTest; diff --git a/asunit-4.0/test/asunit/framework/AsyncTest.as b/asunit-4.0/test/asunit/framework/AsyncTest.as index 24b1ade..3caee8a 100644 --- a/asunit-4.0/test/asunit/framework/AsyncTest.as +++ b/asunit-4.0/test/asunit/framework/AsyncTest.as @@ -7,7 +7,6 @@ import asunit.framework.TestCase; import flash.events.Event; - import flash.events.EventDispatcher; import flash.utils.setTimeout; public class AsyncTest { @@ -15,9 +14,6 @@ [Inject] public var async:IAsync; - [Inject] - public var dispatcher:EventDispatcher; - private var orphanAsync:IAsync; private var command:TimeoutCommand; From fbef15e67f5888db1583e9c2d909ab9c789f4fc8 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 7 Nov 2010 00:09:38 -0700 Subject: [PATCH 27/54] Updated three more test cases to use [Befpre] method to instantiate unit under test. --- asunit-4.0/test/asunit/framework/ProceedOnEventTest.as | 3 +-- asunit-4.0/test/asunit/framework/RunnerFactoryTest.as | 10 +++++++--- .../test/asunit/runners/TestRunnerAsyncMethodTest.as | 9 ++++++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/asunit-4.0/test/asunit/framework/ProceedOnEventTest.as b/asunit-4.0/test/asunit/framework/ProceedOnEventTest.as index 48f10d3..d67f5c1 100644 --- a/asunit-4.0/test/asunit/framework/ProceedOnEventTest.as +++ b/asunit-4.0/test/asunit/framework/ProceedOnEventTest.as @@ -15,8 +15,6 @@ package asunit.framework { [Inject] public var async:IAsync; - - [Inject] public var dispatcher:EventDispatcher; private var orphanAsync:IAsync; @@ -26,6 +24,7 @@ package asunit.framework { [Before] public function setUp():void { orphanAsync = new Async(); + dispatcher = new EventDispatcher(); } [After] diff --git a/asunit-4.0/test/asunit/framework/RunnerFactoryTest.as b/asunit-4.0/test/asunit/framework/RunnerFactoryTest.as index b93989d..b2c553c 100644 --- a/asunit-4.0/test/asunit/framework/RunnerFactoryTest.as +++ b/asunit-4.0/test/asunit/framework/RunnerFactoryTest.as @@ -14,9 +14,13 @@ package asunit.framework { public class RunnerFactoryTest { - [Inject] - public var factory:RunnerFactory; - + private var factory:IRunnerFactory; + + [Before] + public function before():void { + factory = new RunnerFactory(); + } + [Test] public function shouldCreateDefaultRunner():void { var result:IRunner = factory.runnerFor(SucceedAssertTrue); diff --git a/asunit-4.0/test/asunit/runners/TestRunnerAsyncMethodTest.as b/asunit-4.0/test/asunit/runners/TestRunnerAsyncMethodTest.as index 6700b90..7238b5a 100644 --- a/asunit-4.0/test/asunit/runners/TestRunnerAsyncMethodTest.as +++ b/asunit-4.0/test/asunit/runners/TestRunnerAsyncMethodTest.as @@ -17,9 +17,12 @@ package asunit.runners { [Inject] public var async:IAsync; - - [Inject] - public var runner:TestRunner; + private var runner:TestRunner; + + [Before] + public function before():void { + runner = new TestRunner(); + } [Test] public function asyncShouldWork():void { From 245c0ba611b261625f1d029688e728644b6fd4da Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 7 Nov 2010 00:40:11 -0700 Subject: [PATCH 28/54] Added source code for SwiftSuspenders 1.5.1. --- .../org/swiftsuspenders/InjectionConfig.as | 78 ++++ .../org/swiftsuspenders/InjectionType.as | 16 + .../org/swiftsuspenders/Injector.as | 376 ++++++++++++++++++ .../org/swiftsuspenders/InjectorError.as | 17 + .../org/swiftsuspenders/Reflector.as | 95 +++++ .../org/swiftsuspenders/getConstructor.as | 33 ++ .../ConstructorInjectionPoint.as | 94 +++++ .../injectionpoints/InjectionPoint.as | 35 ++ .../injectionpoints/MethodInjectionPoint.as | 122 ++++++ .../NoParamsConstructorInjectionPoint.as | 24 ++ .../PostConstructInjectionPoint.as | 52 +++ .../injectionpoints/PropertyInjectionPoint.as | 62 +++ .../injectionresults/InjectClassResult.as | 33 ++ .../injectionresults/InjectOtherRuleResult.as | 34 ++ .../injectionresults/InjectSingletonResult.as | 43 ++ .../injectionresults/InjectValueResult.as | 33 ++ .../injectionresults/InjectionResult.as | 26 ++ 17 files changed, 1173 insertions(+) create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/InjectionConfig.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/InjectionType.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/Injector.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/InjectorError.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/Reflector.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/getConstructor.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/ConstructorInjectionPoint.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/InjectionPoint.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/MethodInjectionPoint.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/NoParamsConstructorInjectionPoint.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/PostConstructInjectionPoint.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/PropertyInjectionPoint.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectClassResult.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectOtherRuleResult.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectSingletonResult.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectValueResult.as create mode 100644 asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectionResult.as diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/InjectionConfig.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/InjectionConfig.as new file mode 100644 index 0000000..4eba00b --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/InjectionConfig.as @@ -0,0 +1,78 @@ +/* +* Copyright (c) 2009 the original author or authors +* +* Permission is hereby granted to use, modify, and distribute this file +* in accordance with the terms of the license agreement accompanying it. +*/ + +package org.swiftsuspenders +{ + import org.swiftsuspenders.injectionresults.InjectionResult; + + public class InjectionConfig + { + /******************************************************************************************* + * public properties * + *******************************************************************************************/ + public var request : Class; + public var injectionName : String; + + + /******************************************************************************************* + * private properties * + *******************************************************************************************/ + private var m_injector : Injector; + private var m_result : InjectionResult; + + + /******************************************************************************************* + * public methods * + *******************************************************************************************/ + public function InjectionConfig(request : Class, injectionName : String) + { + this.request = request; + this.injectionName = injectionName; + } + + public function getResponse(injector : Injector) : Object + { + if (m_result) + { + return m_result.getResponse(m_injector || injector); + } + var parentConfig : InjectionConfig = + (m_injector || injector).getAncestorMapping(request, injectionName); + if (parentConfig) + { + return parentConfig.getResponse(injector); + } + return null; + } + + public function hasResponse(injector : Injector) : Boolean + { + if (m_result) + { + return true; + } + var parentConfig : InjectionConfig = + (m_injector || injector).getAncestorMapping(request, injectionName); + return parentConfig != null; + } + + public function hasOwnResponse() : Boolean + { + return m_result != null; + } + + public function setResult(result : InjectionResult) : void + { + m_result = result; + } + + public function setInjector(injector : Injector) : void + { + m_injector = injector; + } + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/InjectionType.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/InjectionType.as new file mode 100644 index 0000000..0994dbb --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/InjectionType.as @@ -0,0 +1,16 @@ +/* +* Copyright (c) 2009 the original author or authors +* +* Permission is hereby granted to use, modify, and distribute this file +* in accordance with the terms of the license agreement accompanying it. +*/ + +package org.swiftsuspenders +{ + public class InjectionType + { + public static const VALUE : int = 0; + public static const CLASS : int = 1; + public static const SINGLETON : int = 2; + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/Injector.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/Injector.as new file mode 100644 index 0000000..ce98088 --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/Injector.as @@ -0,0 +1,376 @@ +/* + * Copyright (c) 2009-2010 the original author or authors + * + * Permission is hereby granted to use, modify, and distribute this file + * in accordance with the terms of the license agreement accompanying it. + */ + +package org.swiftsuspenders +{ + import flash.system.ApplicationDomain; + import flash.utils.Dictionary; + import flash.utils.Proxy; + import flash.utils.describeType; + import flash.utils.getDefinitionByName; + import flash.utils.getQualifiedClassName; + + import org.swiftsuspenders.injectionpoints.ConstructorInjectionPoint; + import org.swiftsuspenders.injectionpoints.InjectionPoint; + import org.swiftsuspenders.injectionpoints.MethodInjectionPoint; + import org.swiftsuspenders.injectionpoints.NoParamsConstructorInjectionPoint; + import org.swiftsuspenders.injectionpoints.PostConstructInjectionPoint; + import org.swiftsuspenders.injectionpoints.PropertyInjectionPoint; + import org.swiftsuspenders.injectionresults.InjectClassResult; + import org.swiftsuspenders.injectionresults.InjectOtherRuleResult; + import org.swiftsuspenders.injectionresults.InjectSingletonResult; + import org.swiftsuspenders.injectionresults.InjectValueResult; + + public class Injector + { + /******************************************************************************************* + * private properties * + *******************************************************************************************/ + private var m_parentInjector : Injector; + private var m_applicationDomain:ApplicationDomain; + private var m_mappings : Dictionary; + private var m_injectionPointLists : Dictionary; + private var m_constructorInjectionPoints : Dictionary; + private var m_attendedToInjectees : Dictionary; + private var m_xmlMetadata : XML; + + + /******************************************************************************************* + * public methods * + *******************************************************************************************/ + public function Injector(xmlConfig : XML = null) + { + m_mappings = new Dictionary(); + m_injectionPointLists = new Dictionary(); + m_constructorInjectionPoints = new Dictionary(); + m_attendedToInjectees = new Dictionary(true); + m_xmlMetadata = xmlConfig; + } + + public function mapValue(whenAskedFor : Class, useValue : Object, named : String = "") : * + { + var config : InjectionConfig = getMapping(whenAskedFor, named); + config.setResult(new InjectValueResult(useValue)); + return config; + } + + public function mapClass( + whenAskedFor : Class, instantiateClass : Class, named : String = "") : * + { + var config : InjectionConfig = getMapping(whenAskedFor, named); + config.setResult(new InjectClassResult(instantiateClass)); + return config; + } + + public function mapSingleton(whenAskedFor : Class, named : String = "") : * + { + return mapSingletonOf(whenAskedFor, whenAskedFor, named); + } + + public function mapSingletonOf( + whenAskedFor : Class, useSingletonOf : Class, named : String = "") : * + { + var config : InjectionConfig = getMapping(whenAskedFor, named); + config.setResult(new InjectSingletonResult(useSingletonOf)); + return config; + } + + public function mapRule(whenAskedFor : Class, useRule : *, named : String = "") : * + { + var config : InjectionConfig = getMapping(whenAskedFor, named); + config.setResult(new InjectOtherRuleResult(useRule)); + return useRule; + } + + public function getMapping(whenAskedFor : Class, named : String = "") : InjectionConfig + { + var requestName : String = getQualifiedClassName(whenAskedFor); + var config : InjectionConfig = m_mappings[requestName + '#' + named]; + if (!config) + { + config = m_mappings[requestName + '#' + named] = + new InjectionConfig(whenAskedFor, named); + } + return config; + } + + public function injectInto(target : Object) : void + { + if (m_attendedToInjectees[target]) + { + return; + } + m_attendedToInjectees[target] = true; + + //get injection points or cache them if this target's class wasn't encountered before + var injectionPoints : Array; + + var ctor : Class = getConstructor(target); + + injectionPoints = m_injectionPointLists[ctor] || getInjectionPoints(ctor); + + var length : int = injectionPoints.length; + for (var i : int = 0; i < length; i++) + { + var injectionPoint : InjectionPoint = injectionPoints[i]; + injectionPoint.applyInjection(target, this); + } + + } + + public function instantiate(clazz:Class):* + { + var injectionPoint : InjectionPoint = m_constructorInjectionPoints[clazz]; + if (!injectionPoint) + { + getInjectionPoints(clazz); + injectionPoint = m_constructorInjectionPoints[clazz]; + } + var instance : * = injectionPoint.applyInjection(clazz, this); + injectInto(instance); + return instance; + } + + public function unmap(clazz : Class, named : String = "") : void + { + var mapping : InjectionConfig = getConfigurationForRequest(clazz, named); + if (!mapping) + { + throw new InjectorError('Error while removing an injector mapping: ' + + 'No mapping defined for class ' + getQualifiedClassName(clazz) + + ', named "' + named + '"'); + } + mapping.setResult(null); + } + + public function hasMapping(clazz : Class, named : String = '') : Boolean + { + var mapping : InjectionConfig = getConfigurationForRequest(clazz, named); + if (!mapping) + { + return false; + } + return mapping.hasResponse(this); + } + + public function getInstance(clazz : Class, named : String = '') : * + { + var mapping : InjectionConfig = getConfigurationForRequest(clazz, named); + if (!mapping || !mapping.hasResponse(this)) + { + throw new InjectorError('Error while getting mapping response: ' + + 'No mapping defined for class ' + getQualifiedClassName(clazz) + + ', named "' + named + '"'); + } + return mapping.getResponse(this); + } + + public function createChildInjector(applicationDomain:ApplicationDomain=null) : Injector + { + var injector : Injector = new Injector(); + injector.setApplicationDomain(applicationDomain); + injector.setParentInjector(this); + return injector; + } + + public function setApplicationDomain(applicationDomain:ApplicationDomain):void + { + m_applicationDomain = applicationDomain; + } + + public function getApplicationDomain():ApplicationDomain + { + return m_applicationDomain ? m_applicationDomain : ApplicationDomain.currentDomain; + } + + public function setParentInjector(parentInjector : Injector) : void + { + //restore own map of worked injectees if parent injector is removed + if (m_parentInjector && !parentInjector) + { + m_attendedToInjectees = new Dictionary(true); + } + m_parentInjector = parentInjector; + //use parent's map of worked injectees + if (parentInjector) + { + m_attendedToInjectees = parentInjector.attendedToInjectees; + } + } + + public function getParentInjector() : Injector + { + return m_parentInjector; + } + + + /******************************************************************************************* + * internal methods * + *******************************************************************************************/ + internal function getAncestorMapping( + whenAskedFor : Class, named : String = null) : InjectionConfig + { + var parent : Injector = m_parentInjector; + while (parent) + { + var parentConfig : InjectionConfig = + parent.getConfigurationForRequest(whenAskedFor, named, false); + if (parentConfig && parentConfig.hasOwnResponse()) + { + return parentConfig; + } + parent = parent.getParentInjector(); + } + return null; + } + + internal function get attendedToInjectees() : Dictionary + { + return m_attendedToInjectees; + } + + + /******************************************************************************************* + * private methods * + *******************************************************************************************/ + private function getInjectionPoints(clazz : Class) : Array + { + var description : XML = describeType(clazz); + var injectionPoints : Array = []; + m_injectionPointLists[clazz] = injectionPoints; + m_injectionPointLists[description.@name.toString()] = injectionPoints; + var node : XML; + + // This is where we have to wire in the XML... + if(m_xmlMetadata) + { + createInjectionPointsFromConfigXML(description); + addParentInjectionPoints(description, injectionPoints); + } + + var injectionPoint : InjectionPoint; + //get constructor injections + node = description.factory.constructor[0]; + if (node) + { + m_constructorInjectionPoints[clazz] = + new ConstructorInjectionPoint(node, clazz, this); + } + else + { + m_constructorInjectionPoints[clazz] = new NoParamsConstructorInjectionPoint(); + } + //get injection points for variables + for each (node in description.factory.*. + (name() == 'variable' || name() == 'accessor').metadata.(@name == 'Inject')) + { + injectionPoint = new PropertyInjectionPoint(node, this); + injectionPoints.push(injectionPoint); + } + + //get injection points for methods + for each (node in description.factory.method.metadata.(@name == 'Inject')) + { + injectionPoint = new MethodInjectionPoint(node, this); + injectionPoints.push(injectionPoint); + } + + //get post construct methods + var postConstructMethodPoints : Array = []; + for each (node in description.factory.method.metadata.(@name == 'PostConstruct')) + { + injectionPoint = new PostConstructInjectionPoint(node, this); + postConstructMethodPoints.push(injectionPoint); + } + if (postConstructMethodPoints.length > 0) + { + postConstructMethodPoints.sortOn("order", Array.NUMERIC); + injectionPoints.push.apply(injectionPoints, postConstructMethodPoints); + } + + return injectionPoints; + } + + private function getConfigurationForRequest( + clazz : Class, named : String, traverseAncestors : Boolean = true) : InjectionConfig + { + var requestName : String = getQualifiedClassName(clazz); + var config:InjectionConfig = m_mappings[requestName + '#' + named]; + if(!config && traverseAncestors && + m_parentInjector && m_parentInjector.hasMapping(clazz, named)) + { + config = getAncestorMapping(clazz, named); + } + return config; + } + + private function createInjectionPointsFromConfigXML(description : XML) : void + { + var node : XML; + //first, clear out all "Inject" metadata, we want a clean slate to have the result + //work the same in the Flash IDE and MXMLC + for each (node in description..metadata.(@name=='Inject' || @name=='PostConstruct')) + { + delete node.parent().metadata.(@name=='Inject' || @name=='PostConstruct')[0]; + } + + //now, we create the new injection points based on the given xml file + var className:String = description.factory.@type; + for each (node in m_xmlMetadata.type.(@name == className).children()) + { + var metaNode : XML = ; + if (node.name() == 'postconstruct') + { + metaNode.@name = 'PostConstruct'; + if (node.@order.length()) + { + metaNode.appendChild(); + } + } + else + { + metaNode.@name = 'Inject'; + if (node.@injectionname.length()) + { + metaNode.appendChild(); + } + for each (var arg : XML in node.arg) + { + metaNode.appendChild(); + } + } + var typeNode : XML; + if (node.name() == 'constructor') + { + typeNode = description.factory[0]; + } + else + { + typeNode = description.factory.*.(attribute('name') == node.@name)[0]; + if (!typeNode) + { + throw new InjectorError('Error in XML configuration: Class "' + className + + '" doesn\'t contain the instance member "' + node.@name + '"'); + } + } + typeNode.appendChild(metaNode); + } + } + + private function addParentInjectionPoints(description : XML, injectionPoints : Array) : void + { + var parentClassName : String = description.factory.extendsClass.@type[0]; + if (!parentClassName) + { + return; + } + var parentInjectionPoints : Array = m_injectionPointLists[parentClassName] || + getInjectionPoints(Class(getDefinitionByName(parentClassName))); + injectionPoints.push.apply(injectionPoints, parentInjectionPoints); + } + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/InjectorError.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/InjectorError.as new file mode 100644 index 0000000..94ad2fd --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/InjectorError.as @@ -0,0 +1,17 @@ +/* +* Copyright (c) 2009 the original author or authors +* +* Permission is hereby granted to use, modify, and distribute this file +* in accordance with the terms of the license agreement accompanying it. +*/ + +package org.swiftsuspenders +{ + public class InjectorError extends Error + { + public function InjectorError(message:*="", id:*=0) + { + super(message, id); + } + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/Reflector.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/Reflector.as new file mode 100644 index 0000000..afb1d33 --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/Reflector.as @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2009 the original author or authors + * + * Permission is hereby granted to use, modify, and distribute this file + * in accordance with the terms of the license agreement accompanying it. + */ + +package org.swiftsuspenders +{ + import flash.system.ApplicationDomain; + import flash.utils.describeType; + import flash.utils.getDefinitionByName; + import flash.utils.getQualifiedClassName; + + /** + * @author tschneidereit + */ + public class Reflector + { + /******************************************************************************************* + * public methods * + *******************************************************************************************/ + public function Reflector() + { + } + + public function classExtendsOrImplements(classOrClassName : Object, + superclass : Class, application : ApplicationDomain = null) : Boolean + { + var actualClass : Class; + + if (classOrClassName is Class) + { + actualClass = Class(classOrClassName); + } + else if (classOrClassName is String) + { + try + { + actualClass = Class(getDefinitionByName(classOrClassName as String)); + } + catch (e : Error) + { + throw new Error("The class name " + classOrClassName + + " is not valid because of " + e + "\n" + e.getStackTrace()); + } + } + + if (!actualClass) + { + throw new Error("The parameter classOrClassName must be a valid Class " + + "instance or fully qualified class name."); + } + + if (actualClass == superclass) + return true; + + var factoryDescription : XML = describeType(actualClass).factory[0]; + + return (factoryDescription.children().( + name() == "implementsInterface" || name() == "extendsClass").( + attribute("type") == getQualifiedClassName(superclass)).length() > 0); + } + + public function getClass(value : *, applicationDomain : ApplicationDomain = null) : Class + { + if (value is Class) + { + return value; + } + return getConstructor(value); + } + + public function getFQCN(value : *, replaceColons : Boolean = false) : String + { + var fqcn:String; + if (value is String) + { + fqcn = value; + // Add colons if missing and desired. + if (!replaceColons && fqcn.indexOf('::') == -1) + { + var lastDotIndex:int = fqcn.lastIndexOf('.'); + if (lastDotIndex == -1) return fqcn; + return fqcn.substring(0, lastDotIndex) + '::' + fqcn.substring(lastDotIndex + 1); + } + } + else + { + fqcn = getQualifiedClassName(value); + } + return replaceColons ? fqcn.replace('::', '.') : fqcn; + } + } +} diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/getConstructor.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/getConstructor.as new file mode 100644 index 0000000..266166e --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/getConstructor.as @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2010 the original author or authors + * + * Permission is hereby granted to use, modify, and distribute this file + * in accordance with the terms of the license agreement accompanying it. + */ + +package org.swiftsuspenders +{ + import flash.utils.Proxy; + import flash.utils.getDefinitionByName; + import flash.utils.getQualifiedClassName; + + internal function getConstructor(value : Object) : Class + { + /* + There are several types for which the 'constructor' property doesn't work: + - instances of Proxy, XML and XMLList throw exceptions when trying to access 'constructor' + - int and uint return Number as their constructor + For these, we have to fall back to more verbose ways of getting the constructor. + + Additionally, Vector instances always return Vector.<*> when queried for their constructor. + Ideally, that would also be resolved, but the SwiftSuspenders wouldn't be compatible with + Flash Player < 10, anymore. + */ + if (value is Proxy || value is Number || value is XML || value is XMLList) + { + var fqcn : String = getQualifiedClassName(value); + return Class(getDefinitionByName(fqcn)); + } + return value.constructor; + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/ConstructorInjectionPoint.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/ConstructorInjectionPoint.as new file mode 100644 index 0000000..4369195 --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/ConstructorInjectionPoint.as @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2009 the original author or authors + * + * Permission is hereby granted to use, modify, and distribute this file + * in accordance with the terms of the license agreement accompanying it. + */ + +package org.swiftsuspenders.injectionpoints +{ + import flash.utils.describeType; + + import org.swiftsuspenders.Injector; + + public class ConstructorInjectionPoint extends MethodInjectionPoint + { + /******************************************************************************************* + * public methods * + *******************************************************************************************/ + public function ConstructorInjectionPoint(node : XML, clazz : Class, injector : Injector) + { + /* + In many cases, the flash player doesn't give us type information for constructors until + the class has been instantiated at least once. Therefore, we do just that if we don't get + type information for at least one parameter. + */ + if (node.parameter.(@type == '*').length() == node.parameter.@type.length()) + { + createDummyInstance(node, clazz); + } + super(node, injector); + } + + override public function applyInjection(target : Object, injector : Injector) : Object + { + var p : Array = gatherParameterValues(target, injector); + //the only way to implement ctor injections, really! + switch (p.length) + { + case 0 : return (new target()); + case 1 : return (new target(p[0])); + case 2 : return (new target(p[0], p[1])); + case 3 : return (new target(p[0], p[1], p[2])); + case 4 : return (new target(p[0], p[1], p[2], p[3])); + case 5 : return (new target(p[0], p[1], p[2], p[3], p[4])); + case 6 : return (new target(p[0], p[1], p[2], p[3], p[4], p[5])); + case 7 : return (new target(p[0], p[1], p[2], p[3], p[4], p[5], p[6])); + case 8 : return (new target(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7])); + case 9 : return (new target(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8])); + case 10 : return (new target(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9])); + } + return null; + } + + /******************************************************************************************* + * protected methods * + *******************************************************************************************/ + override protected function initializeInjection(node : XML, injector : Injector) : void + { + var nameArgs : XMLList = node.parent().metadata.(@name == 'Inject').arg.(@key == 'name'); + methodName = 'constructor'; + + gatherParameters(node, nameArgs, injector); + } + + /******************************************************************************************* + * private methods * + *******************************************************************************************/ + private function createDummyInstance(constructorNode : XML, clazz : Class) : void + { + try + { + switch (constructorNode.children().length()) + { + case 0 : (new clazz()); break; + case 1 : (new clazz(null)); break; + case 2 : (new clazz(null, null)); break; + case 3 : (new clazz(null, null, null)); break; + case 4 : (new clazz(null, null, null, null)); break; + case 5 : (new clazz(null, null, null, null, null)); break; + case 6 : (new clazz(null, null, null, null, null, null)); break; + case 7 : (new clazz(null, null, null, null, null, null, null)); break; + case 8 : (new clazz(null, null, null, null, null, null, null, null)); break; + case 9 : (new clazz(null, null, null, null, null, null, null, null, null)); break; + case 10 : (new clazz(null, null, null, null, null, null, null, null, null, null)); break; + } + } + catch (error : Error) + { + trace(error); + } + constructorNode.setChildren(describeType(clazz).factory.constructor[0].children()); + } + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/InjectionPoint.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/InjectionPoint.as new file mode 100644 index 0000000..681e55c --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/InjectionPoint.as @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2009 the original author or authors + * + * Permission is hereby granted to use, modify, and distribute this file + * in accordance with the terms of the license agreement accompanying it. + */ + +package org.swiftsuspenders.injectionpoints +{ + import org.swiftsuspenders.Injector; + + public class InjectionPoint + { + /******************************************************************************************* + * public methods * + *******************************************************************************************/ + public function InjectionPoint(node : XML, injector : Injector) + { + initializeInjection(node, injector); + } + + public function applyInjection(target : Object, injector : Injector) : Object + { + return target; + } + + + /******************************************************************************************* + * protected methods * + *******************************************************************************************/ + protected function initializeInjection(node : XML, injector : Injector) : void + { + } + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/MethodInjectionPoint.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/MethodInjectionPoint.as new file mode 100644 index 0000000..c716295 --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/MethodInjectionPoint.as @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2009 the original author or authors + * + * Permission is hereby granted to use, modify, and distribute this file + * in accordance with the terms of the license agreement accompanying it. + */ + +package org.swiftsuspenders.injectionpoints +{ + import flash.utils.getDefinitionByName; + import flash.utils.getQualifiedClassName; + + import org.swiftsuspenders.InjectionConfig; + import org.swiftsuspenders.Injector; + import org.swiftsuspenders.InjectorError; + + public class MethodInjectionPoint extends InjectionPoint + { + /******************************************************************************************* + * private properties * + *******************************************************************************************/ + protected var methodName : String; + protected var m_injectionConfigs : Array; + protected var requiredParameters : int = 0; + + + /******************************************************************************************* + * public methods * + *******************************************************************************************/ + public function MethodInjectionPoint(node : XML, injector : Injector) + { + super(node, injector); + } + + override public function applyInjection(target : Object, injector : Injector) : Object + { + var parameters : Array = gatherParameterValues(target, injector); + var method : Function = target[methodName]; + method.apply(target, parameters); + return target; + } + + + /******************************************************************************************* + * protected methods * + *******************************************************************************************/ + override protected function initializeInjection(node : XML, injector : Injector) : void + { + var nameArgs : XMLList = node.arg.(@key == 'name'); + var methodNode : XML = node.parent(); + methodName = methodNode.@name.toString(); + + gatherParameters(methodNode, nameArgs, injector); + } + + protected function gatherParameters( + methodNode : XML, nameArgs : XMLList, injector : Injector) : void + { + m_injectionConfigs = []; + var i : int = 0; + for each (var parameter : XML in methodNode.parameter) + { + var injectionName : String = ''; + if (nameArgs[i]) + { + injectionName = nameArgs[i].@value.toString(); + } + var parameterTypeName : String = parameter.@type.toString(); + var parameterType : Class; + if (parameterTypeName == '*') + { + if (parameter.@optional.toString() == 'false') + { + //TODO: Find a way to trace name of affected class here + throw new Error('Error in method definition of injectee. Required ' + + 'parameters can\'t have type "*".'); + } + else + { + parameterTypeName = null; + } + } + else + { + parameterType = Class(injector.getApplicationDomain().getDefinition(parameterTypeName)); + } + m_injectionConfigs.push(injector.getMapping(parameterType, injectionName)); + if (parameter.@optional.toString() == 'false') + { + requiredParameters++; + } + i++; + } + } + + protected function gatherParameterValues(target : Object, injector : Injector) : Array + { + var parameters : Array = []; + var length : int = m_injectionConfigs.length; + for (var i : int = 0; i < length; i++) + { + var config : InjectionConfig = m_injectionConfigs[i]; + var injection : Object = config.getResponse(injector); + if (injection == null) + { + if (i >= requiredParameters) + { + break; + } + throw(new InjectorError( + 'Injector is missing a rule to handle injection into target ' + target + + '. Target dependency: ' + getQualifiedClassName(config.request) + + ', method: ' + methodName + ', parameter: ' + (i + 1) + )); + } + + parameters[i] = injection; + } + return parameters; + } + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/NoParamsConstructorInjectionPoint.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/NoParamsConstructorInjectionPoint.as new file mode 100644 index 0000000..4aa6066 --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/NoParamsConstructorInjectionPoint.as @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2009 the original author or authors + * + * Permission is hereby granted to use, modify, and distribute this file + * in accordance with the terms of the license agreement accompanying it. + */ + +package org.swiftsuspenders.injectionpoints +{ + import org.swiftsuspenders.Injector; + + public class NoParamsConstructorInjectionPoint extends InjectionPoint + { + public function NoParamsConstructorInjectionPoint() + { + super(null, null); + } + + override public function applyInjection(target : Object, injector : Injector) : Object + { + return new target(); + } + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/PostConstructInjectionPoint.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/PostConstructInjectionPoint.as new file mode 100644 index 0000000..d7f45f2 --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/PostConstructInjectionPoint.as @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2009 the original author or authors +* +* Permission is hereby granted to use, modify, and distribute this file +* in accordance with the terms of the license agreement accompanying it. +*/ + +package org.swiftsuspenders.injectionpoints +{ + import org.swiftsuspenders.Injector; + + public class PostConstructInjectionPoint extends InjectionPoint + { + /******************************************************************************************* + * private properties * + *******************************************************************************************/ + protected var methodName : String; + protected var orderValue:int; + + + /******************************************************************************************* + * public methods * + *******************************************************************************************/ + public function PostConstructInjectionPoint(node:XML, injector : Injector) + { + super(node, injector); + } + + public function get order():int + { + return orderValue; + } + + override public function applyInjection(target : Object, injector : Injector) : Object + { + target[methodName](); + return target; + } + + + /******************************************************************************************* + * protected methods * + *******************************************************************************************/ + override protected function initializeInjection(node : XML, injector : Injector) : void + { + var orderArg : XMLList = node.arg.(@key == 'order'); + var methodNode : XML = node.parent(); + orderValue = int(orderArg.@value); + methodName = methodNode.@name.toString(); + } + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/PropertyInjectionPoint.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/PropertyInjectionPoint.as new file mode 100644 index 0000000..d7a3405 --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionpoints/PropertyInjectionPoint.as @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2009 the original author or authors + * + * Permission is hereby granted to use, modify, and distribute this file + * in accordance with the terms of the license agreement accompanying it. + */ + +package org.swiftsuspenders.injectionpoints +{ + import flash.utils.getDefinitionByName; + + import org.swiftsuspenders.InjectionConfig; + import org.swiftsuspenders.Injector; + import org.swiftsuspenders.InjectorError; + + public class PropertyInjectionPoint extends InjectionPoint + { + /******************************************************************************************* + * private properties * + *******************************************************************************************/ + private var propertyName : String; + private var propertyType : String; + private var m_injectionConfig : InjectionConfig; + + + /******************************************************************************************* + * public methods * + *******************************************************************************************/ + public function PropertyInjectionPoint(node : XML, injector : Injector) + { + super(node, injector); + } + + override public function applyInjection(target : Object, injector : Injector) : Object + { + var injection : Object = m_injectionConfig.getResponse(injector); + if (injection == null) + { + throw( + new InjectorError( + 'Injector is missing a rule to handle injection into target ' + target + + '. Target dependency: ' + propertyType + ) + ); + } + target[propertyName] = injection; + return target; + } + + + /******************************************************************************************* + * protected methods * + *******************************************************************************************/ + override protected function initializeInjection(node : XML, injector : Injector) : void + { + propertyType = node.parent().@type.toString(); + propertyName = node.parent().@name.toString(); + m_injectionConfig = injector.getMapping(Class(injector.getApplicationDomain().getDefinition(propertyType)), + node.arg.attribute('value').toString()); + } + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectClassResult.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectClassResult.as new file mode 100644 index 0000000..06cea28 --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectClassResult.as @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2009 the original author or authors +* +* Permission is hereby granted to use, modify, and distribute this file +* in accordance with the terms of the license agreement accompanying it. +*/ + +package org.swiftsuspenders.injectionresults +{ + import org.swiftsuspenders.Injector; + + public class InjectClassResult extends InjectionResult + { + /******************************************************************************************* + * private properties * + *******************************************************************************************/ + private var m_responseType : Class; + + + /******************************************************************************************* + * public methods * + *******************************************************************************************/ + public function InjectClassResult(responseType : Class) + { + m_responseType = responseType; + } + + override public function getResponse(injector : Injector) : Object + { + return injector.instantiate(m_responseType); + } + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectOtherRuleResult.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectOtherRuleResult.as new file mode 100644 index 0000000..ecdeea0 --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectOtherRuleResult.as @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2010 the original author or authors + * + * Permission is hereby granted to use, modify, and distribute this file + * in accordance with the terms of the license agreement accompanying it. + */ + +package org.swiftsuspenders.injectionresults +{ + import org.swiftsuspenders.InjectionConfig; + import org.swiftsuspenders.Injector; + + public class InjectOtherRuleResult extends InjectionResult + { + /******************************************************************************************* + * private properties * + *******************************************************************************************/ + private var m_rule : InjectionConfig; + + + /******************************************************************************************* + * public methods * + *******************************************************************************************/ + public function InjectOtherRuleResult(rule : InjectionConfig) + { + m_rule = rule; + } + + override public function getResponse(injector : Injector) : Object + { + return m_rule.getResponse(injector); + } + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectSingletonResult.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectSingletonResult.as new file mode 100644 index 0000000..4a371ad --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectSingletonResult.as @@ -0,0 +1,43 @@ +/* +* Copyright (c) 2009 the original author or authors +* +* Permission is hereby granted to use, modify, and distribute this file +* in accordance with the terms of the license agreement accompanying it. +*/ + +package org.swiftsuspenders.injectionresults +{ + import org.swiftsuspenders.Injector; + + public class InjectSingletonResult extends InjectionResult + { + /******************************************************************************************* + * private properties * + *******************************************************************************************/ + private var m_responseType : Class; + private var m_response : Object; + + + /******************************************************************************************* + * public methods * + *******************************************************************************************/ + public function InjectSingletonResult(responseType : Class) + { + m_responseType = responseType; + } + + override public function getResponse(injector : Injector) : Object + { + return m_response ||= createResponse(injector); + } + + + /******************************************************************************************* + * private methods * + *******************************************************************************************/ + private function createResponse(injector : Injector) : Object + { + return injector.instantiate(m_responseType); + } + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectValueResult.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectValueResult.as new file mode 100644 index 0000000..e31a339 --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectValueResult.as @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2009 the original author or authors +* +* Permission is hereby granted to use, modify, and distribute this file +* in accordance with the terms of the license agreement accompanying it. +*/ + +package org.swiftsuspenders.injectionresults +{ + import org.swiftsuspenders.Injector; + + public class InjectValueResult extends InjectionResult + { + /******************************************************************************************* + * private properties * + *******************************************************************************************/ + private var m_value : Object; + + + /******************************************************************************************* + * public methods * + *******************************************************************************************/ + public function InjectValueResult(value : Object) + { + m_value = value; + } + + override public function getResponse(injector : Injector) : Object + { + return m_value; + } + } +} \ No newline at end of file diff --git a/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectionResult.as b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectionResult.as new file mode 100644 index 0000000..db56073 --- /dev/null +++ b/asunit-4.0/vendor/as3injection/org/swiftsuspenders/injectionresults/InjectionResult.as @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2010 the original author or authors + * + * Permission is hereby granted to use, modify, and distribute this file + * in accordance with the terms of the license agreement accompanying it. + */ + +package org.swiftsuspenders.injectionresults +{ + import org.swiftsuspenders.Injector; + + public class InjectionResult + { + /******************************************************************************************* + * public methods * + *******************************************************************************************/ + public function InjectionResult() + { + } + + public function getResponse(injector : Injector) : Object + { + return null; + } + } +} \ No newline at end of file From 80be03f5a3d3cd6be8158af6f3db7e8ec8fc93f9 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 7 Nov 2010 00:44:27 -0700 Subject: [PATCH 29/54] AsUnit 4 builds and runs in Flash CS3! (As long as we build everything from source. SWC linkage was added in Flash CS4.) --- asunit-4.0/test/AsUnitRunnerCS3.fla | Bin 0 -> 22016 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 asunit-4.0/test/AsUnitRunnerCS3.fla diff --git a/asunit-4.0/test/AsUnitRunnerCS3.fla b/asunit-4.0/test/AsUnitRunnerCS3.fla new file mode 100644 index 0000000000000000000000000000000000000000..55d4a4a2fa8c459a9d0602fe2f898be855ec7c94 GIT binary patch literal 22016 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 literal 0 HcmV?d00001 From 97f7cb413ff0de962cff2f655114229c4ba525d2 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 7 Nov 2010 00:53:24 -0700 Subject: [PATCH 30/54] LegacyRunnerTest now explicitly sends a context Sprite to run(). --- asunit-4.0/test/asunit/runners/LegacyRunnerTest.as | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/asunit-4.0/test/asunit/runners/LegacyRunnerTest.as b/asunit-4.0/test/asunit/runners/LegacyRunnerTest.as index 878796b..726280b 100644 --- a/asunit-4.0/test/asunit/runners/LegacyRunnerTest.as +++ b/asunit-4.0/test/asunit/runners/LegacyRunnerTest.as @@ -5,6 +5,7 @@ package asunit.runners { import asunit.framework.Result; import asunit.framework.TestCase; import asunit.support.LegacyTestCase; + import flash.display.Sprite; import flash.events.Event; @@ -33,7 +34,7 @@ package asunit.runners { assertEquals(2, testRunner.result.runCount); }; testRunner.addEventListener(Event.COMPLETE, addAsync(handler)); - testRunner.run(LegacyTestCase); + testRunner.run(LegacyTestCase, null, new Sprite()); } } } From 45b27dea3f3ad3b9494b5020fe63e4d99a6eca90 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 7 Nov 2010 00:58:38 -0700 Subject: [PATCH 31/54] Overhauled test injection in TestRunner to use the SwiftSuspenders injector. Removed support for injecting arbitrary properties from [Inject] metadata--it's not an established convention. [Inject] in frameworks like Robotlegs and Swiz is understood to support a "name" property, but that's to identify the injection rule; it's not a property to set on the instance. --- asunit-4.0/src/asunit/runners/TestRunner.as | 190 ++---------------- .../asunit/framework/VisualTestCaseTest.as | 28 +-- .../test/asunit/runners/TestRunnerTest.as | 23 --- .../test/asunit/support/AnnotatedSubClass.as | 18 -- .../asunit/support/AnnotatedSuperClass.as | 15 -- .../asunit/support/InjectTimeoutOnAsync.as | 14 -- .../asunit/support/InjectionVerification.as | 32 +-- 7 files changed, 20 insertions(+), 300 deletions(-) delete mode 100644 asunit-4.0/test/asunit/support/AnnotatedSubClass.as delete mode 100644 asunit-4.0/test/asunit/support/AnnotatedSuperClass.as delete mode 100644 asunit-4.0/test/asunit/support/InjectTimeoutOnAsync.as diff --git a/asunit-4.0/src/asunit/runners/TestRunner.as b/asunit-4.0/src/asunit/runners/TestRunner.as index d38293a..48e4541 100644 --- a/asunit-4.0/src/asunit/runners/TestRunner.as +++ b/asunit-4.0/src/asunit/runners/TestRunner.as @@ -15,6 +15,8 @@ package asunit.runners { import asunit.framework.TestWarning; import asunit.util.ArrayIterator; import asunit.util.Iterator; + import flash.display.Sprite; + import org.swiftsuspenders.Injector; import p2.reflect.Reflection; import p2.reflect.ReflectionMetaData; @@ -30,29 +32,21 @@ package asunit.runners { import flash.utils.getTimer; public class TestRunner extends EventDispatcher implements IRunner { - public static var ASYNC_NAME:String = 'asunit.framework::Async'; - public static var IASYNC_NAME:String = 'asunit.framework::IAsync'; - public static var DISPLAY_OBJECT_CONTAINER:String = 'flash.display::DisplayObjectContainer'; - - /** - * This is how the Runner connects to a printer. - * The AsUnitCore will inject the requested bridge - * based on the concrete data type. - * - * There should be a similar Injection point on - * whatever printers are interested in what this - * concrete runner will dispatch. - */ + + /** + * + */ + //TODO: perhaps add a getter for this to IRunner public var result:IResult; // partially exposed for unit testing internal var currentTest:Object; internal var async:IAsync; + /** Supplies dependencies to tests, e.g. IAsync, context Sprite. */ + internal var testInjector:Injector; - protected var asyncMembers:Iterator; protected var currentMethod:Method; protected var currentTestReflection:Reflection; - protected var injectableMembers:Iterator; protected var methodIsExecuting:Boolean = false; protected var methodPassed:Boolean = true; protected var methodTimeoutID:Number; @@ -65,8 +59,11 @@ package asunit.runners { public function TestRunner(result:IResult = null) { async = new Async(); - this.result = result || new Result(); - timer = new Timer(0, 1); + this.result = result ||= new Result(); + testInjector = new Injector(); + testInjector.mapValue(IAsync, async); + testInjector.mapValue(Async, async); + timer = new Timer(0, 1); timer.addEventListener(TimerEvent.TIMER, runNextMethod); visualInstances = []; } @@ -78,19 +75,18 @@ package asunit.runners { public function runMethodByName(test:Class, methodName:String=null, visualContext:DisplayObjectContainer=null):void { currentTestReflection = Reflection.create(test); this.visualContext = visualContext; + testInjector.mapValue(Sprite, visualContext); currentMethod = null; testMethodNameReceived = (methodName != null); try { - currentTest = new test(); + currentTest = testInjector.instantiate(test); } catch(e:VerifyError) { warn("Unable to instantiate provided test case with: " + currentTestReflection.name); return; } - initializeInjectableMembers(); - async.addEventListener(TimeoutCommandEvent.CALLED, onAsyncMethodCalled); async.addEventListener(TimeoutCommandEvent.TIMED_OUT, onAsyncMethodTimedOut); @@ -109,25 +105,12 @@ package asunit.runners { return new TestIterator(test, testMethodName); } - protected function initializeInjectableMembers():void { - injectableMembers = new ArrayIterator(currentTestReflection.getMembersByMetaData('Inject')); - } - protected function runNextMethod(e:TimerEvent = null):void { - if(!testMethodNameReceived && methodsToRun.readyToTearDown) { - removeInjectedMembers(); - removeInjectedVisualInstances(); - } - if (testCompleted) { onTestCompleted(); return; } - if(methodsToRun.readyToSetUp) { - prepareForSetUp(); - } - runMethod(methodsToRun.next()); } @@ -230,152 +213,11 @@ package asunit.runners { protected function get testCompleted():Boolean { return (!methodsToRun.hasNext() && !async.hasPending); - } - - protected function removeInjectedMembers():void { - var member:ReflectionVariable; - while(injectableMembers.hasNext()) { - removeInjectedMember(injectableMembers.next()); - } - injectableMembers.reset(); - } - - protected function removeInjectedVisualInstances():void { - var visuals:Iterator = new ArrayIterator(visualInstances); - while(visuals.hasNext()) { - visualContext.removeChild(visuals.next()); - } - visualInstances = []; - } - - protected function removeInjectedMember(member:ReflectionVariable):void { - if(!member) return; - currentTest[member.name] = null; - } - - protected function prepareForSetUp():void { - injectMembers(); - } - - protected function injectMembers():void { - var member:ReflectionVariable; - while(injectableMembers.hasNext()) { - injectMember(injectableMembers.next()); - } - injectableMembers.reset(); - } - protected function injectMember(member:ReflectionVariable):void { - if(!member) return; - var definition:Class; - try { - definition = getDefinitionByName(member.type) as Class; - } - catch(referenceError:ReferenceError) { - warn("Unable to [Inject] with " + member.type + ". Maybe this was an inner class? That makes it unavailable to external code, try putting it in it's own file."); - return; - } - var reflection:Reflection = Reflection.create(definition); - try { - var instance:* = createInstanceFromReflection(reflection); - configureInjectedInstance(member, instance); - currentTest[member.name] = instance; - } - catch(e:VerifyError) { - throw new VerifyError("Failed to instantiate " + member.type + " in order to inject public var " + member.name); - } } - - protected function configureInjectedInstance(member:ReflectionVariable, instance:*):void { - var injectTag:ReflectionMetaData = member.getMetaDataByName('Inject'); - var args:Array = injectTag.args; - var arg:Object; - var len:int = args.length; - for(var i:int; i < len; i++) { - arg = args[i]; - try { - instance[arg.key] = coerceArgumentType(member, arg.value); - } - catch(e:ReferenceError) { - var reflect:Reflection = Reflection.create(instance); - warn("Unable to inject attribute " + arg.key + " on " + reflect.name); - } - } - } - - protected function coerceArgumentType(member:ReflectionVariable, value:String):* { - switch(value) { - case "false" : - return false; - case "true" : - return true; - } - - return value; - } - - protected function createInstanceFromReflection(reflection:Reflection):* { - // Return the shared async instance if they're expecting the interface - // or concrete instance, but NOT if their Inject is merely a subclass... - if(reflection.name == ASYNC_NAME || reflection.name == IASYNC_NAME) { - return async; - } - - var clazz:Class = getClassReferenceFromReflection(reflection); - var constructorReflection:Reflection = Reflection.create(clazz); - try { - var instance:* = new constructorReflection.classReference(); - } - catch(e:VerifyError) { - warn("Unable to instantiate: " + reflection.name + " for injection"); - } - - if(constructorReflection.isA(DISPLAY_OBJECT_CONTAINER)) { - // Add injected DisplayObjectContainers to a collection - // for removal, and add them to the visualContext if - // one was provided to the run() method. - if(visualContext) { - visualInstances.push(instance); - visualContext.addChild(instance); - } - else { - warn("TestRunner is injecting a DisplayObjectContainer on your Test but wasn't given a visualContext when run was called. This means your visual entity will not be attached to the Display List."); - } - } - - return instance; - } - protected function warn(message:String, method:Method=null):void { result.onWarning(new TestWarning(message, method)); } - - protected function getClassReferenceFromReflection(reflection:Reflection):Class { - // This will attempt to deal with I-prefixed interfaces - like IAsync. - if(reflection.isInterface) { - return attemptToGetClassReferenceFromReflection(reflection); - } - return reflection.classReference; - } - - protected function attemptToGetClassReferenceFromReflection(reflection:Reflection):Class { - var fullName:String = reflection.name; - var parts:Array = fullName.split("::"); - var interfaceName:String = parts.pop(); - var expr:RegExp = /I([AZ].+)/; - var match:Object = expr.exec(interfaceName); - if(match) { - parts.push(match[1]); - var implementationName:String = parts.join("::"); - return Class(getDefinitionByName(implementationName)); - } - throw new VerifyError("Unable to find class instance for interface " + fullName); - } - - // TODO: Implement this method: - protected function argumentFreeConstructor(reflection:Reflection):Boolean { - return true; - } } } diff --git a/asunit-4.0/test/asunit/framework/VisualTestCaseTest.as b/asunit-4.0/test/asunit/framework/VisualTestCaseTest.as index 909c16b..7db71f1 100644 --- a/asunit-4.0/test/asunit/framework/VisualTestCaseTest.as +++ b/asunit-4.0/test/asunit/framework/VisualTestCaseTest.as @@ -7,37 +7,13 @@ package asunit.framework { public class VisualTestCaseTest { [Inject] - public var sprite:Sprite; + public var context:Sprite; [Test] public function instantiated():void { - assertTrue(sprite is Sprite); - } - - [Test] - public function testSize():void { - assertTrue(sprite.width == 0); - assertTrue(sprite.height == 0); + assertTrue(context is Sprite); } - [Test] - public function testDrawnSize():void { - sprite.x = 110; - sprite.y = 115; - sprite.graphics.beginFill(0xFF0000); - sprite.graphics.drawRect(0, 0, 100, 200); - - assertEquals(100, sprite.width); - assertEquals(200, sprite.height); - assertEquals(110, sprite.x); - assertEquals(115, sprite.y); - } - - [Test] - public function testSecondSize():void { - assertTrue(sprite.width == 0); - assertTrue(sprite.height == 0); - } } } diff --git a/asunit-4.0/test/asunit/runners/TestRunnerTest.as b/asunit-4.0/test/asunit/runners/TestRunnerTest.as index 6ef66c3..69549c0 100644 --- a/asunit-4.0/test/asunit/runners/TestRunnerTest.as +++ b/asunit-4.0/test/asunit/runners/TestRunnerTest.as @@ -8,8 +8,6 @@ package asunit.runners { import asunit.framework.Result; import asunit.framework.TestCase; import asunit.framework.TestFailure; - import asunit.support.AnnotatedSubClass; - import asunit.support.InjectTimeoutOnAsync; import asunit.support.InjectionFailure; import asunit.support.InjectionVerification; import asunit.support.MultiMethod; @@ -145,27 +143,6 @@ package asunit.runners { runner.run(InjectionVerification, null, context); assertFalse("Should not have encountered failures: " + runner.result.failures.join("\n\n"), runner.result.failureEncountered); } - - [Test] - public function shouldInjectWithUnknownAttribute():void { - runner.run(InjectionFailure); - var warnings:Array = runner.result.warnings; - assertEquals(1, warnings.length); - } - - [Test] - public function shouldInjectAsyncTimeout():void { - var async:IAsync = runner.async; - assertEquals(Async.DEFAULT_TIMEOUT, async.timeout); - runner.run(InjectTimeoutOnAsync); - assertEquals(5, async.timeout); - } - - [Test] - public function annotationsOnSuperClassShouldBeRespected():void { - runner.run(AnnotatedSubClass); - assertFalse("Should not have failures: " + runner.result.failures.join("\n\n"), runner.result.failureEncountered); - } } } diff --git a/asunit-4.0/test/asunit/support/AnnotatedSubClass.as b/asunit-4.0/test/asunit/support/AnnotatedSubClass.as deleted file mode 100644 index 0e20203..0000000 --- a/asunit-4.0/test/asunit/support/AnnotatedSubClass.as +++ /dev/null @@ -1,18 +0,0 @@ -package asunit.support { - - import asunit.asserts.*; - - public class AnnotatedSubClass extends AnnotatedSuperClass { - - [Test] - public function verifyDictionary():void { - assertNotNull(dictionary); - } - - [Test] - public function verifyAsync():void { - assertNotNull(async); - } - } -} - diff --git a/asunit-4.0/test/asunit/support/AnnotatedSuperClass.as b/asunit-4.0/test/asunit/support/AnnotatedSuperClass.as deleted file mode 100644 index 658df28..0000000 --- a/asunit-4.0/test/asunit/support/AnnotatedSuperClass.as +++ /dev/null @@ -1,15 +0,0 @@ -package asunit.support { - - import asunit.asserts.*; - import asunit.framework.IAsync; - import flash.utils.Dictionary; - - public class AnnotatedSuperClass { - - [Inject] - public var async:IAsync; - - [Inject] - public var dictionary:Dictionary; - } -} diff --git a/asunit-4.0/test/asunit/support/InjectTimeoutOnAsync.as b/asunit-4.0/test/asunit/support/InjectTimeoutOnAsync.as deleted file mode 100644 index 16b3b56..0000000 --- a/asunit-4.0/test/asunit/support/InjectTimeoutOnAsync.as +++ /dev/null @@ -1,14 +0,0 @@ -package asunit.support { - - import asunit.framework.IAsync; - - public class InjectTimeoutOnAsync { - - [Inject(timeout=5)] - public var async:IAsync; - - [Test] - public function verifyNothing():void { - } - } -} diff --git a/asunit-4.0/test/asunit/support/InjectionVerification.as b/asunit-4.0/test/asunit/support/InjectionVerification.as index b293d8d..6fc7286 100644 --- a/asunit-4.0/test/asunit/support/InjectionVerification.as +++ b/asunit-4.0/test/asunit/support/InjectionVerification.as @@ -17,42 +17,14 @@ package asunit.support { [Inject] public var context:Sprite; - [Inject(someString="stringValue", someBoolean=false, someNumber=23.4, someInt=-23, someUInt=25)] - public var custom:CustomParameters; - - [Test] - public function injectedShouldReceiveUIntValue():void { - assertSame(25, custom.someUInt); - } - - [Test] - public function injectedShouldReceiveIntegerValue():void { - assertSame(-23, custom.someInt); - } - - [Test] - public function injectedShouldReceiveNumberValue():void { - assertSame(23.4, custom.someNumber); - } - - [Test] - public function injectedShouldReceiveBooleanValue():void { - assertSame(false, custom.someBoolean); - } - - [Test] - public function injectedShouldReceiveStringValue():void { - assertEquals("stringValue", custom.someString); - } - [Test] public function verifyDisplayObjectInjection():void { - assertNotNull("DisplayObject should exiset", context); + assertNotNull("DisplayObject should exist", context); } [Test] public function verifyDisplayObjectAttachedToStage():void { - assertNotNull("DisplayObjects hould be attached", context.stage); + assertNotNull("DisplayObjects should be attached to stage", context.stage); } [Test] From 4d3708c1db17c0d4b9c9a2718db069e5a14643b0 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 7 Nov 2010 01:05:56 -0800 Subject: [PATCH 32/54] Call stacks for failures are now much shorter. Now using a while loop to iterate as far as possible before hitting async methods. --- asunit-4.0/src/asunit/runners/TestRunner.as | 53 ++++++++++++--------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/asunit-4.0/src/asunit/runners/TestRunner.as b/asunit-4.0/src/asunit/runners/TestRunner.as index 48e4541..c6da4b7 100644 --- a/asunit-4.0/src/asunit/runners/TestRunner.as +++ b/asunit-4.0/src/asunit/runners/TestRunner.as @@ -64,16 +64,16 @@ package asunit.runners { testInjector.mapValue(IAsync, async); testInjector.mapValue(Async, async); timer = new Timer(0, 1); - timer.addEventListener(TimerEvent.TIMER, runNextMethod); + timer.addEventListener(TimerEvent.TIMER, runNextMethods); visualInstances = []; } - public function run(testOrSuite:Class, methodName:String=null, visualContext:DisplayObjectContainer=null):void { - runMethodByName(testOrSuite, methodName, visualContext); + public function runMethodByName(testOrSuite:Class, methodName:String=null, visualContext:DisplayObjectContainer=null):void { + run(testOrSuite, methodName, visualContext); } - public function runMethodByName(test:Class, methodName:String=null, visualContext:DisplayObjectContainer=null):void { - currentTestReflection = Reflection.create(test); + public function run(test:Class, methodName:String=null, visualContext:DisplayObjectContainer=null):void { + currentTestReflection = Reflection.create(test); this.visualContext = visualContext; testInjector.mapValue(Sprite, visualContext); currentMethod = null; @@ -98,31 +98,39 @@ package asunit.runners { if(methodsToRun.length == 0) { warn(">> We were unable to find any test methods in " + currentTestReflection.name + ". Did you set the --keep-as3-metadata flag?"); } - runNextMethod(); + + runNextMethods(); } protected function createTestIterator(test:*, testMethodName:String):TestIterator { return new TestIterator(test, testMethodName); } - protected function runNextMethod(e:TimerEvent = null):void { - if (testCompleted) { - onTestCompleted(); - return; - } - - runMethod(methodsToRun.next()); + protected function runNextMethods(e:TimerEvent = null):void { + // Loop through as many as possible without hitting asynchronous tests. + // This keeps the call stack small. + while (methodsToRun.hasNext()) { + var hasAsyncPending:Boolean = runMethod(methodsToRun.next()); + if (hasAsyncPending) return; + } + + onTestCompleted(); } - protected function runMethod(method:Method):void { - if (!method) return; + /** + * + * @param method + * @return true if asynchronous calls are pending after calling the test method. + */ + protected function runMethod(method:Method):Boolean { + if (!method) return false; currentMethod = method; methodPassed = true; // innocent until proven guilty by recordFailure() if (currentMethod.ignore) { result.onTestIgnored(currentMethod); onMethodCompleted(); - return; + return false; } // This is used to prevent async callbacks from triggering onMethodCompleted too early. @@ -153,22 +161,23 @@ package asunit.runners { methodIsExecuting = false; - if (async.hasPending) return; + if (async.hasPending) return true; onMethodCompleted(); + return false; } - protected function onMethodCompleted():void { + protected function onMethodCompleted(wasAsync:Boolean = false):void { async.cancelPending(); if (currentMethod.isTest && methodPassed && !currentMethod.ignore) { result.onTestSuccess(new TestSuccess(currentTest, currentMethod.name)); } - // Calling synchronously is faster but keeps adding to the call stack. - runNextMethod(); + if (wasAsync) + runNextMethods(); - // green thread for runNextMethod() + // green thread for runNextMethods() // This runs much slower in Flash Player 10.1. //timer.reset(); //timer.start(); @@ -197,7 +206,7 @@ package asunit.runners { protected function onAsyncMethodCompleted(event:Event = null):void { if (!methodIsExecuting && !async.hasPending) { - onMethodCompleted(); + onMethodCompleted(true); } } From cc9371b4f7b5ddb2480f03906108609afdcac5d5 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 7 Nov 2010 01:25:00 -0800 Subject: [PATCH 33/54] Removed CallbackBridge because it was no different than a Result. Renamed CallbackBridge to ResultObserverTest. May merge with the older-style ResultTest later. --- .../src/asunit/framework/CallbackBridge.as | 10 --- asunit-4.0/src/asunit/runners/SuiteRunner.as | 1 - asunit-4.0/test/AllTests.as | 2 - .../asunit/framework/CallbackBridgeTest.as | 73 ------------------- .../asunit/framework/ResultObserverTest.as | 61 ++++++++++++++++ .../test/asunit/support/CustomSuiteRunner.as | 1 - 6 files changed, 61 insertions(+), 87 deletions(-) delete mode 100644 asunit-4.0/src/asunit/framework/CallbackBridge.as delete mode 100644 asunit-4.0/test/asunit/framework/CallbackBridgeTest.as create mode 100644 asunit-4.0/test/asunit/framework/ResultObserverTest.as diff --git a/asunit-4.0/src/asunit/framework/CallbackBridge.as b/asunit-4.0/src/asunit/framework/CallbackBridge.as deleted file mode 100644 index 942d243..0000000 --- a/asunit-4.0/src/asunit/framework/CallbackBridge.as +++ /dev/null @@ -1,10 +0,0 @@ -package asunit.framework { - - public class CallbackBridge extends Result { - - internal function get numListeners():uint { - return listeners.length; - } - - } -} \ No newline at end of file diff --git a/asunit-4.0/src/asunit/runners/SuiteRunner.as b/asunit-4.0/src/asunit/runners/SuiteRunner.as index 967e023..41b0902 100644 --- a/asunit-4.0/src/asunit/runners/SuiteRunner.as +++ b/asunit-4.0/src/asunit/runners/SuiteRunner.as @@ -1,6 +1,5 @@ package asunit.runners { - import asunit.framework.CallbackBridge; import asunit.framework.IResult; import asunit.framework.IRunner; import asunit.framework.IRunnerFactory; diff --git a/asunit-4.0/test/AllTests.as b/asunit-4.0/test/AllTests.as index 300e416..ba8c7e5 100644 --- a/asunit-4.0/test/AllTests.as +++ b/asunit-4.0/test/AllTests.as @@ -13,7 +13,6 @@ package { import asunit.framework.AssertThrowsTest; import asunit.framework.AsyncMethodTest; import asunit.framework.AsyncTest; - import asunit.framework.CallbackBridgeTest; import asunit.framework.NestedSuiteIteratorTest; import asunit.framework.ProceedOnEventTest; import asunit.framework.ResultTest; @@ -45,7 +44,6 @@ package { public var asunit_framework_AssertThrowsTest:asunit.framework.AssertThrowsTest; public var asunit_framework_AsyncMethodTest:asunit.framework.AsyncMethodTest; public var asunit_framework_AsyncTest:asunit.framework.AsyncTest; - public var asunit_framework_CallbackBridgeTest:asunit.framework.CallbackBridgeTest; public var asunit_framework_NestedSuiteIteratorTest:asunit.framework.NestedSuiteIteratorTest; public var asunit_framework_ProceedOnEventTest:asunit.framework.ProceedOnEventTest; public var asunit_framework_ResultTest:asunit.framework.ResultTest; diff --git a/asunit-4.0/test/asunit/framework/CallbackBridgeTest.as b/asunit-4.0/test/asunit/framework/CallbackBridgeTest.as deleted file mode 100644 index 1103ffe..0000000 --- a/asunit-4.0/test/asunit/framework/CallbackBridgeTest.as +++ /dev/null @@ -1,73 +0,0 @@ -package asunit.framework { - - import asunit.asserts.*; - import asunit.support.FakeObserver; - import asunit.framework.Result; - import asunit.framework.CallbackBridge; - - public class CallbackBridgeTest { - - private var bridge:CallbackBridge; - - private var observer:FakeObserver; - - [Before] - public function createObserver():void { - observer = new FakeObserver(); - bridge = new CallbackBridge(); - bridge.addListener(observer); - } - - [After] - public function destroyObserver():void { - observer = null; - } - - [Test] - public function canInstantiate():void { - assertTrue("instance is CallbackBridge", bridge is CallbackBridge); - } - - [Test] - public function addListenerWorked():void { - assertEquals(1, bridge.numListeners); - } - - [Test] - public function addedListenerReceivesOnRunStarted():void { - bridge.onRunStarted(); - assertTrue(observer.onRunStartedCalled); - } - - [Test] - public function addedListenerReceivesOnTestStarted():void { - bridge.onTestStarted(null); - assertTrue(observer.onTestStartedCalled); - } - - [Test] - public function shouldHaveDefaultRunCount():void - { - assertEquals(0, bridge.runCount); - } - - [Test] - public function shouldHaveCumulativeRunCount():void - { - /* - function onTestStarted(test:Object):void; - function onTestCompleted(test:Object):void; - function onTestFailure(failure:ITestFailure):void; - function onTestSuccess(success:ITestSuccess):void; - */ - bridge.onTestStarted(null); - bridge.onTestSuccess(null); - bridge.onTestCompleted(null); - bridge.onTestStarted(null); - bridge.onTestSuccess(null); - bridge.onTestCompleted(null); - assertEquals(2, bridge.runCount); - } - - } -} \ No newline at end of file diff --git a/asunit-4.0/test/asunit/framework/ResultObserverTest.as b/asunit-4.0/test/asunit/framework/ResultObserverTest.as new file mode 100644 index 0000000..9ab4eee --- /dev/null +++ b/asunit-4.0/test/asunit/framework/ResultObserverTest.as @@ -0,0 +1,61 @@ +package asunit.framework { + + import asunit.asserts.*; + import asunit.support.FakeObserver; + import asunit.framework.Result; + + public class ResultObserverTest { + + private var result:Result; + + private var observer:FakeObserver; + + [Before] + public function createObserver():void { + observer = new FakeObserver(); + result = new Result(); + result.addListener(observer); + } + + [After] + public function destroyObserver():void { + observer = null; + } + + [Test] + public function canInstantiate():void { + assertTrue("instance is Result", result is Result); + } + + [Test] + public function addedListenerReceivesOnRunStarted():void { + result.onRunStarted(); + assertTrue(observer.onRunStartedCalled); + } + + [Test] + public function addedListenerReceivesOnTestStarted():void { + result.onTestStarted(null); + assertTrue(observer.onTestStartedCalled); + } + + [Test] + public function shouldHaveDefaultRunCount():void + { + assertEquals(0, result.runCount); + } + + [Test] + public function shouldHaveCumulativeRunCount():void + { + result.onTestStarted(null); + result.onTestSuccess(null); + result.onTestCompleted(null); + result.onTestStarted(null); + result.onTestSuccess(null); + result.onTestCompleted(null); + assertEquals(2, result.runCount); + } + + } +} \ No newline at end of file diff --git a/asunit-4.0/test/asunit/support/CustomSuiteRunner.as b/asunit-4.0/test/asunit/support/CustomSuiteRunner.as index 3ffd6e9..e8cfcc8 100644 --- a/asunit-4.0/test/asunit/support/CustomSuiteRunner.as +++ b/asunit-4.0/test/asunit/support/CustomSuiteRunner.as @@ -1,6 +1,5 @@ package asunit.support { - import asunit.framework.CallbackBridge; import asunit.framework.IResult; import asunit.framework.IRunnerFactory; import asunit.runners.SuiteRunner; From ccee463d0a28d529b0d52ae36b23a1790d718bde Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 7 Nov 2010 10:09:47 -0800 Subject: [PATCH 34/54] Added ResultObserverTest to AllTests (renamed from CallbackBridgeTest). --- asunit-4.0/test/AllTests.as | 2 ++ 1 file changed, 2 insertions(+) diff --git a/asunit-4.0/test/AllTests.as b/asunit-4.0/test/AllTests.as index ba8c7e5..6dda29a 100644 --- a/asunit-4.0/test/AllTests.as +++ b/asunit-4.0/test/AllTests.as @@ -15,6 +15,7 @@ package { import asunit.framework.AsyncTest; import asunit.framework.NestedSuiteIteratorTest; import asunit.framework.ProceedOnEventTest; + import asunit.framework.ResultObserverTest; import asunit.framework.ResultTest; import asunit.framework.RunnerFactoryTest; import asunit.framework.SuiteIteratorTest; @@ -46,6 +47,7 @@ package { public var asunit_framework_AsyncTest:asunit.framework.AsyncTest; public var asunit_framework_NestedSuiteIteratorTest:asunit.framework.NestedSuiteIteratorTest; public var asunit_framework_ProceedOnEventTest:asunit.framework.ProceedOnEventTest; + public var asunit_framework_ResultObserverTest:asunit.framework.ResultObserverTest; public var asunit_framework_ResultTest:asunit.framework.ResultTest; public var asunit_framework_RunnerFactoryTest:asunit.framework.RunnerFactoryTest; public var asunit_framework_SuiteIteratorTest:asunit.framework.SuiteIteratorTest; From 6c4fcc47d3d747bdfef413446caa129d11705882 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 7 Nov 2010 11:14:20 -0800 Subject: [PATCH 35/54] Cleanup of FlexUnitCIPrinter. --- .../src/asunit/printers/FlexUnitCIPrinter.as | 339 ++++++++---------- 1 file changed, 155 insertions(+), 184 deletions(-) diff --git a/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as b/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as index a2de962..66eb754 100644 --- a/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as +++ b/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as @@ -17,195 +17,166 @@ package asunit.printers { import flash.system.fscommand; import flash.utils.Timer; import flash.utils.getQualifiedClassName; - import flash.utils.getTimer; - - public class FlexUnitCIPrinter extends EventDispatcher implements IRunListener, TestObserver - { - protected static const DEFAULT_SERVER:String = "127.0.0.1"; - protected static const DEFAULT_PORT:uint = 1024; - - public var port:uint; - public var server:String; //this is local host. same machine - - private static const SUCCESS:String = "success"; - private static const ERROR:String = "error"; - private static const FAILURE:String = "failure"; - private static const IGNORE:String = "ignore"; - - private var _ready:Boolean = false; - - private static const START_OF_TEST_RUN_ACK : String = ""; - private static const END_OF_TEST_ACK : String =""; - private static const END_OF_TEST_RUN : String = ""; - - private var socket:XMLSocket; - private var connectTimeout:Timer; - - protected var messageQueue:Array; + import flash.utils.getTimer; + + public class FlexUnitCIPrinter extends EventDispatcher implements IRunListener + { + protected static const DEFAULT_SERVER:String = "127.0.0.1"; + protected static const DEFAULT_PORT:uint = 1024; + + public var port:uint; + public var server:String; //this is local host. same machine + + private static const SUCCESS:String = "success"; + private static const ERROR:String = "error"; + private static const FAILURE:String = "failure"; + private static const IGNORE:String = "ignore"; + + private static const START_OF_TEST_RUN_ACK : String = ""; + private static const END_OF_TEST_ACK : String =""; + private static const END_OF_TEST_RUN : String = ""; + + private var socket:XMLSocket; + private var connectTimeout:Timer; + + protected var messageQueue:Array; private var startTime : int; - - public function FlexUnitCIPrinter() - { - this.port = port; - this.server = server; - messageQueue = []; - - socket = new XMLSocket(); - socket.addEventListener(Event.CONNECT, onConnect); - socket.addEventListener(DataEvent.DATA, onData); - socket.addEventListener(IOErrorEvent.IO_ERROR, onErrorEvent); - socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onErrorEvent); - socket.addEventListener(Event.CLOSE, onErrorEvent); - - connectTimeout = new Timer(5000, 1); - connectTimeout.addEventListener(TimerEvent.TIMER_COMPLETE, onConnectTimeout); - connectTimeout.start(); - - connect(); - } - - protected function connect(ip:String = DEFAULT_SERVER, port:uint = DEFAULT_PORT):void { - try { - socket.connect(ip, port); - } - catch (e:Error) { - trace('## Error connecting to socket: ' + e.message); - } - } - - private function onConnectTimeout(event:TimerEvent):void { - throw new Error('Timed out waiting to connect to socket.'); - } - - [Bindable(event="listenerReady")] - public function get ready():Boolean - { - return _ready; - } - - public function onTestIgnored(method:Method):void { - var xmlMessageIgnore:String = "" - + "" - + ""; - sendMessage(xmlMessageIgnore); - } - - protected static function xmlEscapeMessage(message:String):String { - if (!message) return ''; - - var escape:XML = ; - escape.setChildren( message ); - return escape.children()[0].toXMLString(); - } - - public function onTestFailure(failure:ITestFailure):void { - sendMessage(getFailureMessage(failure)); - } - + + public function FlexUnitCIPrinter() + { + this.port = port; + this.server = server; + messageQueue = []; + + socket = new XMLSocket(); + socket.addEventListener(Event.CONNECT, onConnect); + socket.addEventListener(DataEvent.DATA, onData); + socket.addEventListener(IOErrorEvent.IO_ERROR, onErrorEvent); + socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onErrorEvent); + socket.addEventListener(Event.CLOSE, onErrorEvent); + + connectTimeout = new Timer(5000, 1); + connectTimeout.addEventListener(TimerEvent.TIMER_COMPLETE, onConnectTimeout); + connectTimeout.start(); + + connect(); + } + + protected function connect(ip:String = DEFAULT_SERVER, port:uint = DEFAULT_PORT):void { + try { + socket.connect(ip, port); + } + catch (e:Error) { + trace('## Error connecting to socket: ' + e.message); + } + } + + private function onConnectTimeout(event:TimerEvent):void { + throw new Error('Timed out waiting to connect to socket.'); + } + + public function onTestIgnored(method:Method):void { + var xmlMessageIgnore:String = "" + + "" + + ""; + sendMessage(xmlMessageIgnore); + } + + protected static function xmlEscapeMessage(message:String):String { + if (!message) return ''; + + var escape:XML = ; + escape.setChildren( message ); + return escape.children()[0].toXMLString(); + } + + public function onTestFailure(failure:ITestFailure):void { + sendMessage(getFailureMessage(failure)); + } + protected function getFailureMessage(failure:ITestFailure):String { - var status:String = failure.isFailure ? FAILURE : ERROR; -// var stackTrace:String = xmlEscapeMessage(failure.thrownException.getStackTrace()); var stackTrace:String = failure.thrownException.getStackTrace(); - var xml:String = - "" - - + "" - + "" - + "" - - + ""; - - return xml; - } - - protected function sendMessage(message:String):void { - if (!socket.connected) { - messageQueue.push(message); - return; - } - socket.send(message); - trace('+++++++++ sendMessage() - \n' + message + '\n'); - } - -// protected function sendResults(msg:String):void -// { -// if(socket.connected) -// { -// socket.send( msg ); -// } -// -// trace(msg); -// } - - protected function onConnect(event:Event):void { - connectTimeout.stop(); - sendQueuedMessages(); - } - - protected function sendQueuedMessages():void { - while (messageQueue.length) { - sendMessage(messageQueue.shift()); - } - } - - private function onData( event : DataEvent ) : void - { - trace('onData: ' + event.data); - -// // If we received an acknowledgement on startup, the java server is ready and we can start sending. -// if ( data == START_OF_TEST_RUN_ACK ) { -// setStatusReady(); -// } else - - if (event.data == END_OF_TEST_ACK) { - // If we received an acknowledgement finish-up. - exit(); - } - } - - protected function onErrorEvent(event:Event):void { - trace('FlexUnitCIPrinter::onErrorEvent() - event: ' + event); - //throw new Error('FlashBuilderPrinter::onErrorEvent() - event: ' + event); - } - - public function onRunStarted():void { - } - - public function onTestStarted(test:Object):void { - startTime = getTimer(); - } - - public function onTestCompleted(test:Object):void { -// testTimes.push({test:test, duration:duration}); - } - - public function onTestSuccess(success:ITestSuccess):void - { - //TODO: move test time into ITestSuccess - var duration:Number = (getTimer() - startTime) / 1000; - var xmlMessageSuccess:String = ""; - sendMessage(xmlMessageSuccess); - } - + var status:String = failure.isFailure ? FAILURE : ERROR; +// var stackTrace:String = xmlEscapeMessage(failure.thrownException.getStackTrace()); + var stackTrace:String = failure.thrownException.getStackTrace(); + var xml:String = + "" + + + "" + + "" + + "" + + + ""; + + return xml; + } + + protected function sendMessage(message:String):void { + if (!socket.connected) { + messageQueue.push(message); + return; + } + socket.send(message); + } + + protected function onConnect(event:Event):void { + connectTimeout.stop(); + sendQueuedMessages(); + } + + protected function sendQueuedMessages():void { + while (messageQueue.length) { + sendMessage(messageQueue.shift()); + } + } + + private function onData( event : DataEvent ) : void + { + if (event.data == END_OF_TEST_ACK) { + exit(); + } + } + + protected function onErrorEvent(event:Event):void { + trace('FlexUnitCIPrinter::onErrorEvent() - event: ' + event); + //throw new Error('FlashBuilderPrinter::onErrorEvent() - event: ' + event); + } + + public function onRunStarted():void { + } + + public function onTestStarted(test:Object):void { + startTime = getTimer(); + } + + public function onTestCompleted(test:Object):void { +// testTimes.push({test:test, duration:duration}); + } + + public function onTestSuccess(success:ITestSuccess):void + { + //TODO: move test time into ITestSuccess + var duration:Number = (getTimer() - startTime) / 1000; + var xmlMessageSuccess:String = ""; + sendMessage(xmlMessageSuccess); + } + public function onRunCompleted(result:IResult):void { - sendMessage(END_OF_TEST_RUN); - } - - /** - * Exit the test runner by calling the ApplicationCloser. - */ - protected function exit():void - { - socket.close(); + sendMessage(END_OF_TEST_RUN); + } + + protected function exit():void + { + socket.close(); fscommand("quit"); } - public function onWarning(warning : ITestWarning) : void { + public function onWarning(warning:ITestWarning) : void { } - } -} + } +} From ebf0335e17e89932b35e3d1360362ffced1e27a7 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 7 Nov 2010 11:36:49 -0800 Subject: [PATCH 36/54] Remove the TestObserver empty marker interface and "observer" terminology, which duplicated the existing "listener" paradigm. --- asunit-4.0/src/asunit/core/AsUnitCore.as | 36 ++++++------------- .../src/asunit/core/FlashBuilderCore.as | 2 +- .../src/asunit/core/FlashDevelopCore.as | 2 +- asunit-4.0/src/asunit/core/FlexUnitCICore.as | 2 +- asunit-4.0/src/asunit/core/TextCore.as | 2 +- asunit-4.0/src/asunit/framework/Async.as | 2 +- asunit-4.0/src/asunit/framework/IResult.as | 2 -- .../src/asunit/framework/ITestListener.as | 3 +- asunit-4.0/src/asunit/framework/Result.as | 7 ---- .../src/asunit/framework/TestObserver.as | 12 ------- .../asunit/printers/FlashBuilderPrinter.as | 4 +-- .../asunit/printers/FlashDevelopPrinter.as | 3 +- .../src/asunit/printers/FlexUnitCIPrinter.as | 1 - asunit-4.0/test/asunit/core/AsUnitCoreTest.as | 2 +- .../asunit/framework/ResultObserverTest.as | 12 +++---- 15 files changed, 25 insertions(+), 67 deletions(-) delete mode 100644 asunit-4.0/src/asunit/framework/TestObserver.as diff --git a/asunit-4.0/src/asunit/core/AsUnitCore.as b/asunit-4.0/src/asunit/core/AsUnitCore.as index 448eca9..9c0f741 100644 --- a/asunit-4.0/src/asunit/core/AsUnitCore.as +++ b/asunit-4.0/src/asunit/core/AsUnitCore.as @@ -5,7 +5,7 @@ package asunit.core { import asunit.framework.Result; import asunit.framework.IRunner; import asunit.framework.RunnerFactory; - import asunit.framework.TestObserver; + import asunit.framework.IRunListener; import asunit.runners.LegacyRunner; import org.swiftsuspenders.Injector; @@ -19,7 +19,6 @@ package asunit.core { protected var injector:Injector; protected var legacyRunnerReference:LegacyRunner; - protected var observers:Array; protected var runner:IRunner; protected var _visualContext:DisplayObjectContainer; @@ -55,18 +54,8 @@ package asunit.core { } /** - * Add a new Observer instance to this test run. + * Add a listener to this test run. * - * The TestObserver interface is simply a marker interface - * that indicates your observer has at least one [Inject] - * variable where a bridge will be injected. - * - * Concrete observers are coupled to concrete runners - * by using [Inject] metadata and Bridges for message passing. - * - * The primary TestRunner, CallbackBridge and TextPrinter - * are good examples of how to build this relationship. - * * To use a different TestRunner on a Suite or Test, simply set: * * [RunWith("fully.qualified.ClassName")] @@ -80,8 +69,8 @@ package asunit.core { * provided by a couple of concrete runners. * */ - public function addObserver(observer:TestObserver):void { - result.addObserver(observer); + public function addListener(listener:IRunListener):void { + result.addListener(listener); } /** @@ -119,25 +108,20 @@ package asunit.core { var factory:IRunnerFactory = injector.getInstance(IRunnerFactory); runner = factory.runnerFor(testOrSuite); - runner.addEventListener(Event.COMPLETE, runCompleteHandler); + runner.addEventListener(Event.COMPLETE, onRunCompleted); result.onRunStarted(); runner.run(testOrSuite, testMethodName, this.visualContext); } - private function runCompleteHandler(event:Event):void { + /** + * Subclasses can override to perform some + * operation when the run is complete. + */ + protected function onRunCompleted(event:Event):void { runner.removeEventListener(Event.COMPLETE, onRunCompleted); result.onRunCompleted(result); onRunCompleted(); dispatchEvent(event); } - - - /** - * Template method that subclasses can override to perform some - * operation when the run is complete. - */ - protected function onRunCompleted():void { - } - } } diff --git a/asunit-4.0/src/asunit/core/FlashBuilderCore.as b/asunit-4.0/src/asunit/core/FlashBuilderCore.as index f5b5da8..1ec203b 100644 --- a/asunit-4.0/src/asunit/core/FlashBuilderCore.as +++ b/asunit-4.0/src/asunit/core/FlashBuilderCore.as @@ -10,7 +10,7 @@ package asunit.core { super.initializeObservers(); var projectName:String = 'SomeProject'; - addObserver(new FlashBuilderPrinter(projectName)); + addListener(new FlashBuilderPrinter(projectName)); } override protected function onRunCompleted():void { super.onRunCompleted(); diff --git a/asunit-4.0/src/asunit/core/FlashDevelopCore.as b/asunit-4.0/src/asunit/core/FlashDevelopCore.as index 088e565..6db7815 100644 --- a/asunit-4.0/src/asunit/core/FlashDevelopCore.as +++ b/asunit-4.0/src/asunit/core/FlashDevelopCore.as @@ -8,7 +8,7 @@ package asunit.core { override protected function initializeObservers():void { super.initializeObservers(); - addObserver(new FlashDevelopPrinter()); + addListener(new FlashDevelopPrinter()); } override protected function onRunCompleted():void { diff --git a/asunit-4.0/src/asunit/core/FlexUnitCICore.as b/asunit-4.0/src/asunit/core/FlexUnitCICore.as index c402e4b..9cdd789 100644 --- a/asunit-4.0/src/asunit/core/FlexUnitCICore.as +++ b/asunit-4.0/src/asunit/core/FlexUnitCICore.as @@ -9,7 +9,7 @@ package asunit.core { override protected function initializeObservers():void { super.initializeObservers(); - addObserver(new FlexUnitCIPrinter()); + addListener(new FlexUnitCIPrinter()); } override protected function onRunCompleted():void { diff --git a/asunit-4.0/src/asunit/core/TextCore.as b/asunit-4.0/src/asunit/core/TextCore.as index babdc54..6c24453 100644 --- a/asunit-4.0/src/asunit/core/TextCore.as +++ b/asunit-4.0/src/asunit/core/TextCore.as @@ -23,7 +23,7 @@ package asunit.core { super.initializeObservers(); textPrinter = new TextPrinter(); - addObserver(textPrinter); + addListener(textPrinter); } /* Delegate some configuration to the TextPrinter */ diff --git a/asunit-4.0/src/asunit/framework/Async.as b/asunit-4.0/src/asunit/framework/Async.as index 336f2e9..82d5f7f 100644 --- a/asunit-4.0/src/asunit/framework/Async.as +++ b/asunit-4.0/src/asunit/framework/Async.as @@ -61,7 +61,7 @@ package asunit.framework { } /** - * Returns a new async handler that should be used as the observer of some + * Returns a new async handler that should be used as the listener of some * presumably asynchronous event. * * You can optionally pass a function closure that you would like to have diff --git a/asunit-4.0/src/asunit/framework/IResult.as b/asunit-4.0/src/asunit/framework/IResult.as index a93d29d..c0e6c37 100644 --- a/asunit-4.0/src/asunit/framework/IResult.as +++ b/asunit-4.0/src/asunit/framework/IResult.as @@ -5,8 +5,6 @@ function addListener(listener:IRunListener):void; function removeListener(listener:IRunListener):void; - function addObserver(observer:TestObserver):void; - function get errors():Array; function get errorCount():uint; diff --git a/asunit-4.0/src/asunit/framework/ITestListener.as b/asunit-4.0/src/asunit/framework/ITestListener.as index 9a2287b..761393d 100644 --- a/asunit-4.0/src/asunit/framework/ITestListener.as +++ b/asunit-4.0/src/asunit/framework/ITestListener.as @@ -1,9 +1,8 @@ package asunit.framework { import asunit.framework.ITestFailure; - import asunit.framework.TestObserver; - public interface ITestListener extends TestObserver { + public interface ITestListener { function onTestStarted(test:Object):void; function onTestCompleted(test:Object):void; function onTestFailure(failure:ITestFailure):void; diff --git a/asunit-4.0/src/asunit/framework/Result.as b/asunit-4.0/src/asunit/framework/Result.as index 27158e4..778e2c3 100644 --- a/asunit-4.0/src/asunit/framework/Result.as +++ b/asunit-4.0/src/asunit/framework/Result.as @@ -67,13 +67,6 @@ package asunit.framework { public function get runTime():Number { return _runTime; } public function set runTime(value:Number):void { _runTime = value; } - public function addObserver(observer:TestObserver):void { - if(!(observer is IRunListener)) { - throw new UsageError("Result.addObserver called with an instance that wasn't an IRunListener. This should work soon, but doesn't yet..."); - } - addListener(IRunListener(observer)); - } - public function addListener(listener:IRunListener):void { if (listeners.indexOf(listener) >= 0) return; listeners.push(listener); diff --git a/asunit-4.0/src/asunit/framework/TestObserver.as b/asunit-4.0/src/asunit/framework/TestObserver.as deleted file mode 100644 index 8331621..0000000 --- a/asunit-4.0/src/asunit/framework/TestObserver.as +++ /dev/null @@ -1,12 +0,0 @@ -package asunit.framework { - - /** - * TestObserver is a marker interface that usually - * indicates that a given class will have at least - * one [Inject] annotation above a public instance - * variable that implements MessageBridge. - */ - public interface TestObserver { - } -} - diff --git a/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as b/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as index 86fdc88..483d2b6 100644 --- a/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as +++ b/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as @@ -1,12 +1,10 @@ package asunit.printers { import asunit.framework.ITestFailure; import asunit.framework.ITestWarning; - import asunit.framework.IResult; import asunit.framework.IRunListener; import asunit.framework.ITestSuccess; import asunit.framework.Method; - import asunit.framework.TestObserver; import flash.events.Event; import flash.events.IOErrorEvent; @@ -14,7 +12,7 @@ package asunit.printers { import flash.net.XMLSocket; import flash.utils.getQualifiedClassName; - public class FlashBuilderPrinter implements IRunListener, TestObserver { + public class FlashBuilderPrinter implements IRunListener { protected var projectName:String; protected var contextName:String; protected var messageQueue:Array; diff --git a/asunit-4.0/src/asunit/printers/FlashDevelopPrinter.as b/asunit-4.0/src/asunit/printers/FlashDevelopPrinter.as index bb87a82..6854696 100644 --- a/asunit-4.0/src/asunit/printers/FlashDevelopPrinter.as +++ b/asunit-4.0/src/asunit/printers/FlashDevelopPrinter.as @@ -6,9 +6,8 @@ package asunit.printers { import asunit.framework.IRunListener; import asunit.framework.ITestSuccess; import asunit.framework.Method; - import asunit.framework.TestObserver; - public class FlashDevelopPrinter implements IRunListener, TestObserver { + public class FlashDevelopPrinter implements IRunListener { protected static const localPathPattern:RegExp = /([A-Z]:\\[^\/:\*\?<>\|]+\.\w{2,6})|(\\{2}[^\/:\*\?<>\|]+\.\w{2,6})/g; diff --git a/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as b/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as index 66eb754..ff3433b 100644 --- a/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as +++ b/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as @@ -5,7 +5,6 @@ package asunit.printers { import asunit.framework.ITestSuccess; import asunit.framework.ITestWarning; import asunit.framework.Method; - import asunit.framework.TestObserver; import flash.events.DataEvent; import flash.events.Event; diff --git a/asunit-4.0/test/asunit/core/AsUnitCoreTest.as b/asunit-4.0/test/asunit/core/AsUnitCoreTest.as index a41ede2..9872bd8 100644 --- a/asunit-4.0/test/asunit/core/AsUnitCoreTest.as +++ b/asunit-4.0/test/asunit/core/AsUnitCoreTest.as @@ -68,7 +68,7 @@ package asunit.core { public function textPrinterShouldWork():void { var printer:TextPrinter = new TextPrinter(); printer.traceOnComplete = false; - core.addObserver(printer); + core.addListener(printer); // Wait for the complete event: var handler:Function = function(event:Event):void { diff --git a/asunit-4.0/test/asunit/framework/ResultObserverTest.as b/asunit-4.0/test/asunit/framework/ResultObserverTest.as index 9ab4eee..1af088f 100644 --- a/asunit-4.0/test/asunit/framework/ResultObserverTest.as +++ b/asunit-4.0/test/asunit/framework/ResultObserverTest.as @@ -8,18 +8,18 @@ package asunit.framework { private var result:Result; - private var observer:FakeObserver; + private var listener:FakeObserver; [Before] public function createObserver():void { - observer = new FakeObserver(); + listener = new FakeObserver(); result = new Result(); - result.addListener(observer); + result.addListener(listener); } [After] public function destroyObserver():void { - observer = null; + listener = null; } [Test] @@ -30,13 +30,13 @@ package asunit.framework { [Test] public function addedListenerReceivesOnRunStarted():void { result.onRunStarted(); - assertTrue(observer.onRunStartedCalled); + assertTrue(listener.onRunStartedCalled); } [Test] public function addedListenerReceivesOnTestStarted():void { result.onTestStarted(null); - assertTrue(observer.onTestStartedCalled); + assertTrue(listener.onTestStartedCalled); } [Test] From 5845630d648798c8080616f34f00c8b48173bdd6 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sun, 7 Nov 2010 12:35:21 -0800 Subject: [PATCH 37/54] OOPS: fixed a straggling compile error. --- asunit-4.0/src/asunit/core/AsUnitCore.as | 1 - 1 file changed, 1 deletion(-) diff --git a/asunit-4.0/src/asunit/core/AsUnitCore.as b/asunit-4.0/src/asunit/core/AsUnitCore.as index 9c0f741..333fb53 100644 --- a/asunit-4.0/src/asunit/core/AsUnitCore.as +++ b/asunit-4.0/src/asunit/core/AsUnitCore.as @@ -120,7 +120,6 @@ package asunit.core { protected function onRunCompleted(event:Event):void { runner.removeEventListener(Event.COMPLETE, onRunCompleted); result.onRunCompleted(result); - onRunCompleted(); dispatchEvent(event); } } From 6f79121dad16436aa4e5492af8495593334ff187 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Mon, 8 Nov 2010 11:15:17 -0800 Subject: [PATCH 38/54] Reverted change to AsUnitCore onRunCompleted as it affects other cores. --- asunit-4.0/src/asunit/core/AsUnitCore.as | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/asunit-4.0/src/asunit/core/AsUnitCore.as b/asunit-4.0/src/asunit/core/AsUnitCore.as index 333fb53..666e0ca 100644 --- a/asunit-4.0/src/asunit/core/AsUnitCore.as +++ b/asunit-4.0/src/asunit/core/AsUnitCore.as @@ -108,19 +108,24 @@ package asunit.core { var factory:IRunnerFactory = injector.getInstance(IRunnerFactory); runner = factory.runnerFor(testOrSuite); - runner.addEventListener(Event.COMPLETE, onRunCompleted); + runner.addEventListener(Event.COMPLETE, onRunnerComplete); result.onRunStarted(); runner.run(testOrSuite, testMethodName, this.visualContext); } - /** - * Subclasses can override to perform some - * operation when the run is complete. - */ - protected function onRunCompleted(event:Event):void { + protected function onRunnerComplete(event:Event):void { runner.removeEventListener(Event.COMPLETE, onRunCompleted); result.onRunCompleted(result); + onRunCompleted(); dispatchEvent(event); } + + /** + * Subclasses can override to perform some + * operation when the run is complete. + */ + protected function onRunCompleted():void { + + } } } From afda47508d4761548ab49f84f2f41f062f7ce251 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Tue, 9 Nov 2010 00:58:40 -0800 Subject: [PATCH 39/54] TextPrinter now exposes an option to hideLocalPaths from the stack trace, which AsUnitRunner now uses. Made TextPrinter default constants more consistent. --- asunit-4.0/src/asunit/printers/TextPrinter.as | 30 +++++++++---------- asunit-4.0/test/AsUnitRunner.as | 1 + 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/asunit-4.0/src/asunit/printers/TextPrinter.as b/asunit-4.0/src/asunit/printers/TextPrinter.as index 3c52d6f..66c2ce6 100644 --- a/asunit-4.0/src/asunit/printers/TextPrinter.as +++ b/asunit-4.0/src/asunit/printers/TextPrinter.as @@ -19,25 +19,27 @@ package asunit.printers { import flash.utils.getTimer; public class TextPrinter extends Sprite implements IRunListener { - public static var LOCAL_PATH_PATTERN:RegExp = /([A-Z]:\\[^\/:\*\?<>\|]+\.\w{2,6})|(\\{2}[^\/:\*\?<>\|]+\.\w{2,6})/g; - public static var BACKGROUND_COLOR:uint = 0x333333; - public static var DEFAULT_HEADER:String = "AsUnit 4.0 by Luke Bayes, Ali Mills and Robert Penner\n\nFlash Player version: " + Capabilities.version - public static var FONT_SIZE:int = 12; - public static var TEXT_COLOR:uint = 0xffffff; + public static const LOCAL_PATH_PATTERN:RegExp = /([A-Z]:\\[^\/:\*\?<>\|]+\.\w{2,6})|(\\{2}[^\/:\*\?<>\|]+\.\w{2,6})/g; + public static const DEFAULT_BACKGROUND_COLOR:uint = 0x333333; + public static const DEFAULT_HEADER:String = "AsUnit 4.0 by Luke Bayes, Ali Mills and Robert Penner\n\nFlash Player version: " + Capabilities.version + public static const DEFAULT_FOOTER:String = ""; + public static const DEFAULT_FONT_SIZE:int = 12; + public static const DEFAULT_TEXT_COLOR:uint = 0xffffff; - public var backgroundColor:uint = BACKGROUND_COLOR; + public var header:String = DEFAULT_HEADER; + public var footer:String = DEFAULT_FOOTER; + public var backgroundColor:uint = DEFAULT_BACKGROUND_COLOR; + public var textColor:uint = DEFAULT_TEXT_COLOR; public var displayPerformanceDetails:Boolean = true; - public var localPathPattern:RegExp; - public var textColor:uint = TEXT_COLOR; public var traceOnComplete:Boolean = true; + public var hideLocalPaths:Boolean = false; + public var localPathPattern:RegExp = LOCAL_PATH_PATTERN; protected var textDisplay:TextField; private var backgroundFill:Shape; private var dots:Array; private var failures:Array; - private var footer:String; - private var header:String; private var ignores:Array; private var resultBar:Shape; private var resultBarHeight:uint = 3; @@ -59,10 +61,6 @@ package asunit.printers { testTimes = []; warnings = []; - footer = ''; - header = DEFAULT_HEADER; - localPathPattern = LOCAL_PATH_PATTERN; - if(stage) { initializeDisplay(); } else { @@ -88,7 +86,7 @@ package asunit.printers { private function getFailureStackTrace(failure:ITestFailure):String { var stack:String = ""; stack = failure.thrownException.getStackTrace(); - //stack = stack.replace(localPathPattern, ''); + if (hideLocalPaths) stack = stack.replace(localPathPattern, ''); stack = stack.replace(/AssertionFailedError: /, ''); stack += "\n\n"; return stack; @@ -281,7 +279,7 @@ package asunit.printers { var format:TextFormat = textDisplay.getTextFormat(); format.font = '_sans'; - format.size = FONT_SIZE; + format.size = DEFAULT_FONT_SIZE; format.leftMargin = 5; format.rightMargin = 5; textDisplay.defaultTextFormat = format; diff --git a/asunit-4.0/test/AsUnitRunner.as b/asunit-4.0/test/AsUnitRunner.as index 512304d..b155de6 100755 --- a/asunit-4.0/test/AsUnitRunner.as +++ b/asunit-4.0/test/AsUnitRunner.as @@ -10,6 +10,7 @@ package { public function AsUnitRunner() { core = new TextCore(); + core.textPrinter.hideLocalPaths = true; core.start(AllTests, null, this); } } From dec9ed429912c0cea839b0afd5b046e5a250c959 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Tue, 9 Nov 2010 01:02:13 -0800 Subject: [PATCH 40/54] Minor cleanup of cores for Flash Builder and FlexUnit CI. --- .../src/asunit/core/FlashBuilderCore.as | 2 +- asunit-4.0/src/asunit/core/FlexUnitCICore.as | 37 ++++++++----------- .../asunit/printers/FlashBuilderPrinter.as | 3 -- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/asunit-4.0/src/asunit/core/FlashBuilderCore.as b/asunit-4.0/src/asunit/core/FlashBuilderCore.as index 1ec203b..46b8831 100644 --- a/asunit-4.0/src/asunit/core/FlashBuilderCore.as +++ b/asunit-4.0/src/asunit/core/FlashBuilderCore.as @@ -8,10 +8,10 @@ package asunit.core { override protected function initializeObservers():void { super.initializeObservers(); - var projectName:String = 'SomeProject'; addListener(new FlashBuilderPrinter(projectName)); } + override protected function onRunCompleted():void { super.onRunCompleted(); fscommand('quit'); // fails silently if not in debug player diff --git a/asunit-4.0/src/asunit/core/FlexUnitCICore.as b/asunit-4.0/src/asunit/core/FlexUnitCICore.as index 9cdd789..27e83ad 100644 --- a/asunit-4.0/src/asunit/core/FlexUnitCICore.as +++ b/asunit-4.0/src/asunit/core/FlexUnitCICore.as @@ -1,22 +1,17 @@ -package asunit.core { - +package asunit.core { + import asunit.printers.FlexUnitCIPrinter; - import asunit.printers.FlashDevelopPrinter; - - import flash.system.fscommand; - - public class FlexUnitCICore extends TextCore { - - override protected function initializeObservers():void { - super.initializeObservers(); - addListener(new FlexUnitCIPrinter()); - } - - override protected function onRunCompleted():void { - super.onRunCompleted(); - //fscommand('quit'); // fails silently if not in debug player - //System.exit(0); // generates SecurityError if not in debug player - } - } -} - + + public class FlexUnitCICore extends TextCore { + + override protected function initializeObservers():void { + super.initializeObservers(); + addListener(new FlexUnitCIPrinter()); + } + + override protected function onRunCompleted():void { + super.onRunCompleted(); + // The FlexUnitCIPrinter will close Flash Player when the socket acknowledges the end. + } + } +} diff --git a/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as b/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as index 483d2b6..73876b7 100644 --- a/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as +++ b/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as @@ -92,7 +92,6 @@ package asunit.printers { return; } socket.send(message); - //trace('+++++++++ sendMessage() - \n' + message + '\n'); } protected function getFailureMessage(failure:ITestFailure):String { @@ -117,7 +116,6 @@ package asunit.printers { protected function onErrorEvent(event:Event):void { trace('FlashBuilderPrinter::onErrorEvent() - event: ' + event); - //throw new Error('FlashBuilderPrinter::onErrorEvent() - event: ' + event); } protected static function xmlEscapeMessage(message:String):String { @@ -127,6 +125,5 @@ package asunit.printers { escape.setChildren( message ); return escape.children()[0].toXMLString(); } - } } From 740a095efe03f7108a28d7bc5e8b4bec3b62c0bb Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Tue, 9 Nov 2010 01:06:29 -0800 Subject: [PATCH 41/54] Simplified TextCore by making its textPrinter public (used by AsUnitRunner). --- asunit-4.0/src/asunit/core/TextCore.as | 80 ++++++++++---------------- 1 file changed, 31 insertions(+), 49 deletions(-) diff --git a/asunit-4.0/src/asunit/core/TextCore.as b/asunit-4.0/src/asunit/core/TextCore.as index 6c24453..5f87b92 100644 --- a/asunit-4.0/src/asunit/core/TextCore.as +++ b/asunit-4.0/src/asunit/core/TextCore.as @@ -3,52 +3,34 @@ package asunit.core { import asunit.printers.TextPrinter; import flash.display.DisplayObjectContainer; - - /** - * TextCore is just a simple helper class that - * configures the base class AsUnitCore to use the - * standard TextPrinter. - * - * The main idea is that you may want a completely - * different text output without the default TextPrinter, - * and if that's the case, you can go ahead and - * instantiate AsUnitCore and configure it however you - * wish. - */ - public class TextCore extends AsUnitCore { - - private var textPrinter:TextPrinter; - - override protected function initializeObservers():void { - super.initializeObservers(); - - textPrinter = new TextPrinter(); - addListener(textPrinter); - } - - /* Delegate some configuration to the TextPrinter */ - public function set displayPerformanceDetails(show:Boolean):void { - textPrinter.displayPerformanceDetails = show; - } - - public function get displayPerformanceDetails():Boolean { - return textPrinter.displayPerformanceDetails; - } - - public function set traceOnComplete(should:Boolean):void { - textPrinter.traceOnComplete = should; - } - - public function get traceOnComplete():Boolean { - return textPrinter.traceOnComplete; - } - - - override public function set visualContext(context:DisplayObjectContainer):void { - super.visualContext = context; - // Add the TextPrinter to the Display List: - visualContext.addChild(textPrinter); - } - } -} - + + /** + * TextCore is just a simple helper class that + * configures the base class AsUnitCore to use the + * standard TextPrinter. + * + * The main idea is that you may want a completely + * different text output without the default TextPrinter, + * and if that's the case, you can go ahead and + * instantiate AsUnitCore and configure it however you + * wish. + */ + public class TextCore extends AsUnitCore { + + public var textPrinter:TextPrinter; + + override protected function initializeObservers():void { + super.initializeObservers(); + + textPrinter = new TextPrinter(); + addListener(textPrinter); + } + + override public function set visualContext(context:DisplayObjectContainer):void { + super.visualContext = context; + // Add the TextPrinter to the Display List: + visualContext.addChild(textPrinter); + } + } +} + From 683acdc5337852f5ab49f49143e779fec7f8b187 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Sat, 4 Dec 2010 09:36:23 -0800 Subject: [PATCH 42/54] FIX: TestCase.assertEqualsFloat was pointing to Assert.assertEquals. --- asunit-4.0/src/asunit/framework/TestCase.as | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/asunit-4.0/src/asunit/framework/TestCase.as b/asunit-4.0/src/asunit/framework/TestCase.as index 50e4e16..077b5c3 100644 --- a/asunit-4.0/src/asunit/framework/TestCase.as +++ b/asunit-4.0/src/asunit/framework/TestCase.as @@ -44,8 +44,7 @@ package asunit.framework { } protected function addChild(child:DisplayObject):DisplayObject { - context.addChild(child); - return child; + return context.addChild(child); } protected function removeChild(child:DisplayObject):DisplayObject { @@ -92,7 +91,7 @@ package asunit.framework { } protected function assertEqualsFloat(...args:Array):void { - Assert.assertEquals.apply(null, args); + Assert.assertEqualsFloat.apply(null, args); } protected function assertEqualsArrays(...args:Array):void { From f7b60f34c93a55452a6fb9bac70d60f9f39222e0 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Tue, 28 Dec 2010 13:35:44 -0700 Subject: [PATCH 43/54] Added assertion for the error message with new method, assertThrowsWithMessage(). --- .../asunit/asserts/assertThrowsWithMessage.as | 5 + asunit-4.0/src/asunit/framework/Assert.as | 31 +++++ asunit-4.0/src/asunit/framework/Method.as | 2 + asunit-4.0/src/asunit/framework/TestCase.as | 6 + asunit-4.0/src/asunit/runners/TestRunner.as | 8 +- asunit-4.0/test/AllTests.as | 4 + .../framework/AssertThrowsWithMessageTest.as | 50 +++++++ .../TestRunnerExpectsErrorWithMessageTest.as | 125 ++++++++++++++++++ 8 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 asunit-4.0/src/asunit/asserts/assertThrowsWithMessage.as create mode 100644 asunit-4.0/test/asunit/framework/AssertThrowsWithMessageTest.as create mode 100644 asunit-4.0/test/asunit/runners/TestRunnerExpectsErrorWithMessageTest.as diff --git a/asunit-4.0/src/asunit/asserts/assertThrowsWithMessage.as b/asunit-4.0/src/asunit/asserts/assertThrowsWithMessage.as new file mode 100644 index 0000000..1b000f5 --- /dev/null +++ b/asunit-4.0/src/asunit/asserts/assertThrowsWithMessage.as @@ -0,0 +1,5 @@ +package asunit.asserts { + import asunit.framework.Assert; + + public var assertThrowsWithMessage:Function = Assert.assertThrowsWithMessage; +} diff --git a/asunit-4.0/src/asunit/framework/Assert.as b/asunit-4.0/src/asunit/framework/Assert.as index 808c8a4..b229bfb 100644 --- a/asunit-4.0/src/asunit/framework/Assert.as +++ b/asunit-4.0/src/asunit/framework/Assert.as @@ -111,6 +111,37 @@ package asunit.framework { throw new AssertionFailedError("expected error type:<" + getQualifiedClassName(errorType) + "> but none was thrown." ); } + /** + * Asserts that the provided block throws an exception that matches + * the type and message provided. + * + * + * public function testFailingCode():void { + * assertThrows(CustomError, "Invalid state", function():void { + * var instance:Sprite = new Sprite(); + * instance.callMethodThatThrows(); + * }); + * } + * + **/ + static public function assertThrowsWithMessage(errorType:Class, errorMessage:String, block:Function):void { + try { + block.call(); + } + catch(e:Error) { + if(!(e is errorType)) { + throw new AssertionFailedError("expected error type:<" + getQualifiedClassName(errorType) + +"> but was:<" + getQualifiedClassName(e) + ">"); + } + if(e.message != errorMessage) { + throw new AssertionFailedError("expected error message:<" + errorMessage + +"> but was:<" + e.message + ">"); + } + return; + } + throw new AssertionFailedError("expected error type:<" + getQualifiedClassName(errorType) + "> with message:<" + errorMessage + "> but none was thrown." ); + } + /** * Asserts that two objects are equal. If they are not * an AssertionFailedError is thrown with the given message. diff --git a/asunit-4.0/src/asunit/framework/Method.as b/asunit-4.0/src/asunit/framework/Method.as index 93a642d..0b1f164 100644 --- a/asunit-4.0/src/asunit/framework/Method.as +++ b/asunit-4.0/src/asunit/framework/Method.as @@ -9,6 +9,7 @@ private var _scopeName:String; public var expects:String; + public var message:String; public var ignore:Boolean; public var ignoreDescription:String; public var metadata:ReflectionMetaData; @@ -34,6 +35,7 @@ handleTimeoutMetaData(); applyMetaData('expects'); + applyMetaData('message'); applyMetaData('order'); } } diff --git a/asunit-4.0/src/asunit/framework/TestCase.as b/asunit-4.0/src/asunit/framework/TestCase.as index 077b5c3..6f3c6c9 100644 --- a/asunit-4.0/src/asunit/framework/TestCase.as +++ b/asunit-4.0/src/asunit/framework/TestCase.as @@ -70,6 +70,12 @@ package asunit.framework { Assert.assertThrows(errorType, block); } + protected function assertThrowsWithMessage(errorType:Class, + errorMessage:String, + block:Function):void { + Assert.assertThrowsWithMessage(errorType, errorMessage, block); + } + protected function assertEquals(...args:Array):void { Assert.assertEquals.apply(null, args); } diff --git a/asunit-4.0/src/asunit/runners/TestRunner.as b/asunit-4.0/src/asunit/runners/TestRunner.as index c6da4b7..3db00f0 100644 --- a/asunit-4.0/src/asunit/runners/TestRunner.as +++ b/asunit-4.0/src/asunit/runners/TestRunner.as @@ -139,7 +139,13 @@ package asunit.runners { if (currentMethod.expects) { try { var errorClass:Class = getDefinitionByName(currentMethod.expects) as Class; - Assert.assertThrows(errorClass, currentMethod.value); + var errorMessage:String = currentMethod.message; + if(errorMessage == null) { + Assert.assertThrows(errorClass, currentMethod.value); + } + else { + Assert.assertThrowsWithMessage(errorClass, errorMessage, currentMethod.value); + } } catch(definitionError:ReferenceError) { // NOTE: [luke] Added ReferenceError catch here b/c I had a bad class name in my expects. diff --git a/asunit-4.0/test/AllTests.as b/asunit-4.0/test/AllTests.as index 6dda29a..3c108d7 100644 --- a/asunit-4.0/test/AllTests.as +++ b/asunit-4.0/test/AllTests.as @@ -11,6 +11,7 @@ package { import asunit.framework.AssertEqualsArraysTest; import asunit.framework.AssertTest; import asunit.framework.AssertThrowsTest; + import asunit.framework.AssertThrowsWithMessageTest; import asunit.framework.AsyncMethodTest; import asunit.framework.AsyncTest; import asunit.framework.NestedSuiteIteratorTest; @@ -31,6 +32,7 @@ package { import asunit.runners.TestRunnerAsyncMethodTest; import asunit.runners.TestRunnerErrorMethodTest; import asunit.runners.TestRunnerExpectsErrorTest; + import asunit.runners.TestRunnerExpectsErrorWithMessageTest; import asunit.runners.TestRunnerIgnoredMethodTest; import asunit.runners.TestRunnerTest; import asunit.util.ArrayIteratorTest; @@ -42,6 +44,7 @@ package { public var asunit_framework_AssertEqualsArraysIgnoringOrderTest:asunit.framework.AssertEqualsArraysIgnoringOrderTest; public var asunit_framework_AssertEqualsArraysTest:asunit.framework.AssertEqualsArraysTest; public var asunit_framework_AssertTest:asunit.framework.AssertTest; + public var asunit_framework_AssertThrowsWithMessageTest:asunit.framework.AssertThrowsWithMessageTest; public var asunit_framework_AssertThrowsTest:asunit.framework.AssertThrowsTest; public var asunit_framework_AsyncMethodTest:asunit.framework.AsyncMethodTest; public var asunit_framework_AsyncTest:asunit.framework.AsyncTest; @@ -63,6 +66,7 @@ package { public var asunit_runners_TestRunnerAsyncMethodTest:asunit.runners.TestRunnerAsyncMethodTest; public var asunit_runners_TestRunnerErrorMethodTest:asunit.runners.TestRunnerErrorMethodTest; public var asunit_runners_TestRunnerExpectsErrorTest:asunit.runners.TestRunnerExpectsErrorTest; + public var asunit_runners_TestRunnerExpectsErrorWithMessageTest:asunit.runners.TestRunnerExpectsErrorWithMessageTest; public var asunit_runners_TestRunnerIgnoredMethodTest:asunit.runners.TestRunnerIgnoredMethodTest; public var asunit_runners_TestRunnerTest:asunit.runners.TestRunnerTest; public var asunit_util_ArrayIteratorTest:asunit.util.ArrayIteratorTest; diff --git a/asunit-4.0/test/asunit/framework/AssertThrowsWithMessageTest.as b/asunit-4.0/test/asunit/framework/AssertThrowsWithMessageTest.as new file mode 100644 index 0000000..5d3f66c --- /dev/null +++ b/asunit-4.0/test/asunit/framework/AssertThrowsWithMessageTest.as @@ -0,0 +1,50 @@ +package asunit.framework { + + import asunit.asserts.*; + import asunit.errors.AssertionFailedError; + + public class AssertThrowsWithMessageTest { + + [Test] + public function throwingExpectedErrorShouldPass():void { + assertThrowsWithMessage(ArgumentError, "foo", function():void { throw new ArgumentError("foo"); } ); + } + + [Test] + public function throwingUnexpectedErrorShouldFail():void { + try { + assertThrowsWithMessage(ArgumentError, "wrong error type", function():void { throw new Error("wrong error type"); } ); + } + catch (e:AssertionFailedError) { + assertEquals("expected error type: but was:", e.message) + return; + } + fail('failed assertThrowsWithMessage() should have thrown AssertionFailedError'); + } + + [Test] + public function throwingNoErrorShouldFailWithMessage():void { + try { + assertThrowsWithMessage(ArgumentError, "foo", function():void { } ); + } + catch (e:AssertionFailedError) { + assertEquals("expected error type: with message: but none was thrown.", e.message) + return; + } + fail('failed assertThrowsWithMessage() should have thrown AssertionFailedError'); + } + + [Test] + public function throwingErrorWithUnexpectedMessageShouldFail():void { + try { + assertThrowsWithMessage(Error, "foo", function():void { throw new Error("bar"); } ); + } + catch (e:AssertionFailedError) { + assertEquals("expected error message: but was:", e.message) + return; + } + fail('failed assertThrowsWithMessage() should have thrown AssertionFailedError'); + } + } +} + diff --git a/asunit-4.0/test/asunit/runners/TestRunnerExpectsErrorWithMessageTest.as b/asunit-4.0/test/asunit/runners/TestRunnerExpectsErrorWithMessageTest.as new file mode 100644 index 0000000..a3a80a1 --- /dev/null +++ b/asunit-4.0/test/asunit/runners/TestRunnerExpectsErrorWithMessageTest.as @@ -0,0 +1,125 @@ +package asunit.runners { + + import asunit.errors.AssertionFailedError; + import asunit.framework.TestCase; + + import asunit.framework.IResult; + import asunit.framework.Result; + import asunit.framework.TestFailure; + + import flash.events.Event; + + public class TestRunnerExpectsErrorWithMessageTest extends TestCase { + + private var runner:TestRunner; + private var successTest:Class; + private var throwNothingTest:Class; + private var throwWrongErrorTest:Class; + private var throwWrongMessageTest:Class; + + private var failedTest:Class; + private var failedMethod:String; + + public function TestRunnerExpectsErrorWithMessageTest(testMethod:String = null) { + super(testMethod); + } + + protected override function setUp():void { + super.setUp(); + runner = new TestRunner(); + successTest = TestExpectsArgumentErrorAndThrowsIt; + throwNothingTest = TestExpectsArgumentErrorButThrowsNothing; + throwWrongErrorTest = TestExpectsArgumentErrorButThrowsWrongError; + throwWrongMessageTest = TestExpectsArgumentErrorButThrowsWrongMessage; + } + + protected override function tearDown():void { + super.tearDown(); + runner = null; + successTest = null; + throwNothingTest = null; + throwWrongErrorTest = null; + throwWrongMessageTest = null; + failedTest = null; + failedMethod = null; + } + + public function test_method_expects_specific_error_and_throws_it_yields_successful_test_result():void { + runner.addEventListener(Event.COMPLETE, addAsync(check_Result_has_no_errors, 100)); + runner.run(successTest); + } + + public function test_method_expects_specific_error_but_nothing_thrown_yields_assertion_failure():void { + failedTest = throwNothingTest; + failedMethod = "fail_by_throwing_nothing"; + runner.addEventListener(Event.COMPLETE, addAsync(check_Result_has_one_assertion_failure, 100)); + runner.run(throwNothingTest); + } + + public function test_method_expects_specific_error_but_wrong_one_thrown_yields_assertion_failure():void { + failedTest = throwWrongErrorTest; + failedMethod = "fail_by_throwing_wrong_error"; + runner.addEventListener(Event.COMPLETE, addAsync(check_Result_has_one_assertion_failure, 100)); + runner.run(throwWrongErrorTest); + } + + public function test_method_expects_specific_message_but_wrong_one_thrown_yields_assertion_failure():void { + failedTest = throwWrongMessageTest; + failedMethod = "fail_by_throwing_wrong_message"; + runner.addEventListener(Event.COMPLETE, addAsync(check_Result_has_one_assertion_failure, 100)); + runner.run(throwWrongMessageTest); + } + + + private function check_Result_has_no_errors(e:Event):void { + var runnerResult:IResult = runner.result; + assertEquals('no errors in testResult', 0, runnerResult.errorCount); + assertEquals('no failures in testResult', 0, runnerResult.failureCount); + } + + private function check_Result_has_one_assertion_failure(e:Event):void { + var runnerResult:IResult = runner.result; + assertFalse(runnerResult.wasSuccessful); + + assertEquals('one failure in testResult', 1, runnerResult.failureCount); + assertEquals('no errors in testResult', 0, runnerResult.errorCount); + + var failure0:TestFailure = runnerResult.failures[0] as TestFailure; + assertTrue('thrownException is correct type', failure0.thrownException is AssertionFailedError); + assertTrue('failedTest is instance of the test class', failure0.failedTest is failedTest); + assertSame('failedMethod name', failedMethod, failure0.failedMethod); + } + } +} + +class TestExpectsArgumentErrorAndThrowsIt { + + [Test(expects="ArgumentError", message="generated by TestExpectsArgumentError")] + public function throwArgumentError():void { + throw new ArgumentError('generated by TestExpectsArgumentError'); + } +} + +class TestExpectsArgumentErrorButThrowsNothing { + + [Test(expects="ArgumentError", message="generated by TestExpectsArgumentErrorButThrowsNothing")] + public function fail_by_throwing_nothing():void { + } +} + +class TestExpectsArgumentErrorButThrowsWrongError { + + [Test(expects="ArgumentError", message="generated by TestExpectsArgumentErrorButThrowsWrongError")] + public function fail_by_throwing_wrong_error():void { + throw new Error('generated by TestExpectsArgumentErrorButThrowsWrongError'); + } +} + +class TestExpectsArgumentErrorButThrowsWrongMessage { + + [Test(expects="Error", message="foo")] + public function fail_by_throwing_wrong_message():void { + throw new Error('bar'); + } +} + From 6615297ba0225cda02c19ac00319ebb0c4ff6fee Mon Sep 17 00:00:00 2001 From: lukebayes Date: Wed, 19 Jan 2011 08:34:29 -0800 Subject: [PATCH 44/54] Replaced CRLF line endings with LF as per instructions found here: http://help.github.com/dealing-with-lineendings/ --- .../AssertEqualsArraysIgnoringOrderTest.as | 210 +++++----- asunit-4.0/build.xml | 172 ++++----- asunit-4.0/src/asunit/asserts/assertNull.as | 10 +- asunit-4.0/src/asunit/asserts/assertSame.as | 10 +- asunit-4.0/src/asunit/asserts/assertTrue.as | 10 +- asunit-4.0/src/asunit/core/FlexUnitCICore.as | 34 +- asunit-4.0/src/asunit/core/TextCore.as | 72 ++-- asunit-4.0/src/asunit/framework/Async.as | 276 ++++++------- asunit-4.0/src/asunit/framework/Command.as | 12 +- asunit-4.0/src/asunit/framework/IResult.as | 62 +-- asunit-4.0/src/asunit/framework/Result.as | 320 ++++++++-------- .../src/asunit/printers/FlexUnitCIPrinter.as | 362 +++++++++--------- asunit-4.0/src/asunit/runners/SuiteRunner.as | 178 ++++----- asunit-4.0/test/AsUnitCIRunner.as | 34 +- asunit-4.0/test/AsUnitRunner.as | 32 +- .../AssertEqualsArraysIgnoringOrderTest.as | 202 +++++----- asunit-4.0/test/asunit/framework/AsyncTest.as | 200 +++++----- .../asunit/framework/ProceedOnEventTest.as | 216 +++++------ .../asunit/framework/VisualTestCaseTest.as | 38 +- .../test/asunit/support/SingleSuccessSuite.as | 14 +- .../test/asunit/support/SuiteOfTwoSuites.as | 16 +- 21 files changed, 1240 insertions(+), 1240 deletions(-) diff --git a/asunit-3.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as b/asunit-3.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as index 93a9faf..8a383b8 100755 --- a/asunit-3.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as +++ b/asunit-3.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as @@ -1,106 +1,106 @@ -package asunit.framework -{ - import asunit.errors.AssertionFailedError; - import asunit.framework.TestCase; - import asunit.framework.Assert; - import flash.display.Sprite; - - /** - * Tests assertEqualsArraysIgnoringOrder - * - * @author Bastian Krol - */ - public class AssertEqualsArraysIgnoringOrderTest extends TestCase { - - public function AssertEqualsArraysIgnoringOrderTest(testMethod:String = null) { - super(testMethod); - } - - public function testNullEqualsNull():void { - assertEqualsArraysIgnoringOrder(Assert.assertEqualsArraysIgnoringOrder, null, null); - } - - public function testNullDoesNotEqualNotNull():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, null, []); - } - - public function testNotNullDoesNotEqualNull():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, [], null); - } - - public function testEmptyArrayEqualsEmptyArray():void { - assertEqualsArraysIgnoringOrder([], []); - } - - public function testArrayWithOneStringEquals():void { - assertEqualsArraysIgnoringOrder(["abcdefg"], ["abcdefg"]); - } - - public function testArrayWithOneStringNotEquals():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abcdefg"], ["12345"]); - } - - public function testArrayWithOneFunctionEquals():void { - assertEqualsArraysIgnoringOrder([tearDown], [tearDown]); - } - - public function testArrayWithOneFunctionNotEquals():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, [setUp], [tearDown]); - } - - public function testArrayWithOneNullMemberEquals():void { - assertEqualsArraysIgnoringOrder([null], [null]); - } - - public function testArrayWithOneNullMemberNotEquals1():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["..."], [null]); - } - - public function testArrayWithOneNullMemberNotEquals2():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, [null], ["..."]); - } - - public function testArrayEqualsSameOrder():void { - assertEqualsArraysIgnoringOrder(["abc", "def", "ghi"], ["abc", "def", "ghi"]); - } - - public function testArrayNotEquals():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def", "ghi"], ["abc", "xyz", "ghi"]); - } - - public function testArrayEqualsDifferentOrder1():void { - assertEqualsArraysIgnoringOrder(["abc", "def", "ghi"], ["def", "abc", "ghi"]); - } - - public function testArrayEqualsDifferentOrder2():void { - assertEqualsArraysIgnoringOrder([setUp, tearDown, cleanUp], [cleanUp, tearDown, setUp]); - } - - public function testArrayEqualsDifferentTypes():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, - ["abc", "def", "ghi"], - ["abc", setUp, "ghi"]); - } - - public function testArrayDifferentLength1():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def", "ghi"], ["abc", "def"]); - } - - public function testArrayDifferentLength2():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def"], ["abc", "def", "ghi"]); - } - - public function testArrayWithRepeatedItems():void { - var spr1:Sprite = new Sprite(); - var spr2:Sprite = new Sprite(); - var spr3:Sprite = new Sprite(); - - var controlArray:Array = [spr1, spr2, spr3, spr1]; - var matchingArray:Array = [spr1, spr2, spr1, spr3]; - var nonMatchingArray:Array = [spr1, spr2, spr3, spr2]; - - assertEqualsArraysIgnoringOrder('these arrays should match', controlArray, matchingArray); - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, controlArray, nonMatchingArray); - } - } +package asunit.framework +{ + import asunit.errors.AssertionFailedError; + import asunit.framework.TestCase; + import asunit.framework.Assert; + import flash.display.Sprite; + + /** + * Tests assertEqualsArraysIgnoringOrder + * + * @author Bastian Krol + */ + public class AssertEqualsArraysIgnoringOrderTest extends TestCase { + + public function AssertEqualsArraysIgnoringOrderTest(testMethod:String = null) { + super(testMethod); + } + + public function testNullEqualsNull():void { + assertEqualsArraysIgnoringOrder(Assert.assertEqualsArraysIgnoringOrder, null, null); + } + + public function testNullDoesNotEqualNotNull():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, null, []); + } + + public function testNotNullDoesNotEqualNull():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, [], null); + } + + public function testEmptyArrayEqualsEmptyArray():void { + assertEqualsArraysIgnoringOrder([], []); + } + + public function testArrayWithOneStringEquals():void { + assertEqualsArraysIgnoringOrder(["abcdefg"], ["abcdefg"]); + } + + public function testArrayWithOneStringNotEquals():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abcdefg"], ["12345"]); + } + + public function testArrayWithOneFunctionEquals():void { + assertEqualsArraysIgnoringOrder([tearDown], [tearDown]); + } + + public function testArrayWithOneFunctionNotEquals():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, [setUp], [tearDown]); + } + + public function testArrayWithOneNullMemberEquals():void { + assertEqualsArraysIgnoringOrder([null], [null]); + } + + public function testArrayWithOneNullMemberNotEquals1():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["..."], [null]); + } + + public function testArrayWithOneNullMemberNotEquals2():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, [null], ["..."]); + } + + public function testArrayEqualsSameOrder():void { + assertEqualsArraysIgnoringOrder(["abc", "def", "ghi"], ["abc", "def", "ghi"]); + } + + public function testArrayNotEquals():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def", "ghi"], ["abc", "xyz", "ghi"]); + } + + public function testArrayEqualsDifferentOrder1():void { + assertEqualsArraysIgnoringOrder(["abc", "def", "ghi"], ["def", "abc", "ghi"]); + } + + public function testArrayEqualsDifferentOrder2():void { + assertEqualsArraysIgnoringOrder([setUp, tearDown, cleanUp], [cleanUp, tearDown, setUp]); + } + + public function testArrayEqualsDifferentTypes():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, + ["abc", "def", "ghi"], + ["abc", setUp, "ghi"]); + } + + public function testArrayDifferentLength1():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def", "ghi"], ["abc", "def"]); + } + + public function testArrayDifferentLength2():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def"], ["abc", "def", "ghi"]); + } + + public function testArrayWithRepeatedItems():void { + var spr1:Sprite = new Sprite(); + var spr2:Sprite = new Sprite(); + var spr3:Sprite = new Sprite(); + + var controlArray:Array = [spr1, spr2, spr3, spr1]; + var matchingArray:Array = [spr1, spr2, spr1, spr3]; + var nonMatchingArray:Array = [spr1, spr2, spr3, spr2]; + + assertEqualsArraysIgnoringOrder('these arrays should match', controlArray, matchingArray); + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, controlArray, nonMatchingArray); + } + } } \ No newline at end of file diff --git a/asunit-4.0/build.xml b/asunit-4.0/build.xml index 680bf23..81a37cd 100644 --- a/asunit-4.0/build.xml +++ b/asunit-4.0/build.xml @@ -1,86 +1,86 @@ - - - - - - - - - - - - - - - - - - - - - - - - - Using Flex SDK at: ${FLEX_HOME} - - - - - - - - - - - - - - - - - - - - - - - - - [test] Running Unit Tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + Using Flex SDK at: ${FLEX_HOME} + + + + + + + + + + + + + + + + + + + + + + + + + [test] Running Unit Tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/asunit-4.0/src/asunit/asserts/assertNull.as b/asunit-4.0/src/asunit/asserts/assertNull.as index 31cbaa1..56a048a 100644 --- a/asunit-4.0/src/asunit/asserts/assertNull.as +++ b/asunit-4.0/src/asunit/asserts/assertNull.as @@ -1,5 +1,5 @@ -package asunit.asserts { - import asunit.framework.Assert; - - public var assertNull:Function = Assert.assertNull; -} +package asunit.asserts { + import asunit.framework.Assert; + + public var assertNull:Function = Assert.assertNull; +} diff --git a/asunit-4.0/src/asunit/asserts/assertSame.as b/asunit-4.0/src/asunit/asserts/assertSame.as index 4535456..39d23ff 100644 --- a/asunit-4.0/src/asunit/asserts/assertSame.as +++ b/asunit-4.0/src/asunit/asserts/assertSame.as @@ -1,5 +1,5 @@ -package asunit.asserts { - import asunit.framework.Assert; - - public var assertSame:Function = Assert.assertSame; -} +package asunit.asserts { + import asunit.framework.Assert; + + public var assertSame:Function = Assert.assertSame; +} diff --git a/asunit-4.0/src/asunit/asserts/assertTrue.as b/asunit-4.0/src/asunit/asserts/assertTrue.as index 2edba6f..0a75f29 100644 --- a/asunit-4.0/src/asunit/asserts/assertTrue.as +++ b/asunit-4.0/src/asunit/asserts/assertTrue.as @@ -1,5 +1,5 @@ -package asunit.asserts { - import asunit.framework.Assert; - - public var assertTrue:Function = Assert.assertTrue; -} +package asunit.asserts { + import asunit.framework.Assert; + + public var assertTrue:Function = Assert.assertTrue; +} diff --git a/asunit-4.0/src/asunit/core/FlexUnitCICore.as b/asunit-4.0/src/asunit/core/FlexUnitCICore.as index 27e83ad..57ec3a2 100644 --- a/asunit-4.0/src/asunit/core/FlexUnitCICore.as +++ b/asunit-4.0/src/asunit/core/FlexUnitCICore.as @@ -1,17 +1,17 @@ -package asunit.core { - - import asunit.printers.FlexUnitCIPrinter; - - public class FlexUnitCICore extends TextCore { - - override protected function initializeObservers():void { - super.initializeObservers(); - addListener(new FlexUnitCIPrinter()); - } - - override protected function onRunCompleted():void { - super.onRunCompleted(); - // The FlexUnitCIPrinter will close Flash Player when the socket acknowledges the end. - } - } -} +package asunit.core { + + import asunit.printers.FlexUnitCIPrinter; + + public class FlexUnitCICore extends TextCore { + + override protected function initializeObservers():void { + super.initializeObservers(); + addListener(new FlexUnitCIPrinter()); + } + + override protected function onRunCompleted():void { + super.onRunCompleted(); + // The FlexUnitCIPrinter will close Flash Player when the socket acknowledges the end. + } + } +} diff --git a/asunit-4.0/src/asunit/core/TextCore.as b/asunit-4.0/src/asunit/core/TextCore.as index 5f87b92..c5ac4b5 100644 --- a/asunit-4.0/src/asunit/core/TextCore.as +++ b/asunit-4.0/src/asunit/core/TextCore.as @@ -1,36 +1,36 @@ -package asunit.core { - - import asunit.printers.TextPrinter; - - import flash.display.DisplayObjectContainer; - - /** - * TextCore is just a simple helper class that - * configures the base class AsUnitCore to use the - * standard TextPrinter. - * - * The main idea is that you may want a completely - * different text output without the default TextPrinter, - * and if that's the case, you can go ahead and - * instantiate AsUnitCore and configure it however you - * wish. - */ - public class TextCore extends AsUnitCore { - - public var textPrinter:TextPrinter; - - override protected function initializeObservers():void { - super.initializeObservers(); - - textPrinter = new TextPrinter(); - addListener(textPrinter); - } - - override public function set visualContext(context:DisplayObjectContainer):void { - super.visualContext = context; - // Add the TextPrinter to the Display List: - visualContext.addChild(textPrinter); - } - } -} - +package asunit.core { + + import asunit.printers.TextPrinter; + + import flash.display.DisplayObjectContainer; + + /** + * TextCore is just a simple helper class that + * configures the base class AsUnitCore to use the + * standard TextPrinter. + * + * The main idea is that you may want a completely + * different text output without the default TextPrinter, + * and if that's the case, you can go ahead and + * instantiate AsUnitCore and configure it however you + * wish. + */ + public class TextCore extends AsUnitCore { + + public var textPrinter:TextPrinter; + + override protected function initializeObservers():void { + super.initializeObservers(); + + textPrinter = new TextPrinter(); + addListener(textPrinter); + } + + override public function set visualContext(context:DisplayObjectContainer):void { + super.visualContext = context; + // Add the TextPrinter to the Display List: + visualContext.addChild(textPrinter); + } + } +} + diff --git a/asunit-4.0/src/asunit/framework/Async.as b/asunit-4.0/src/asunit/framework/Async.as index 82d5f7f..8dd6c6e 100644 --- a/asunit-4.0/src/asunit/framework/Async.as +++ b/asunit-4.0/src/asunit/framework/Async.as @@ -1,138 +1,138 @@ -package asunit.framework { - - import asunit.framework.ErrorEvent; - - import asunit.events.TimeoutCommandEvent; - - import flash.events.Event; - import flash.events.EventDispatcher; - import flash.events.IEventDispatcher; - - public class Async extends EventDispatcher implements IAsync { - - public static var DEFAULT_TIMEOUT:uint = 50; - - private var _timeout:int = DEFAULT_TIMEOUT; - protected var pending:Array; - - /** - * Asynchronous handler class. - * - * This class give you the ability to create Asynchronous event handlers - * and pause test execution until those handlers are triggered. - * - * To take advantage of Asynchronous features, add a member variable - * to your test like: - * - * [Inject] - * public var async:IAsync; - * - * This public property will be injected with an IAsync instance - * before each test method. - * - * Within your test methods, you can add Async callbacks with: - * - * [Test] - * public function verifySomething():void { - * async.add(handler); - * } - * - * In the previous example, test execution will be halted until the - * +handler+ method is called. - * - * It's worth noting that AsUnit does not store any state related - * to the playback of your test harness in global variables. - * - */ - public function Async() { - pending = []; - } - - public function get hasPending():Boolean { - return pending.length > 0; - } - - public function set timeout(timeout:int):void { - _timeout = timeout; - } - - public function get timeout():int { - return _timeout; - } - - /** - * Returns a new async handler that should be used as the listener of some - * presumably asynchronous event. - * - * You can optionally pass a function closure that you would like to have - * executed when the provided handler is called. If this closure includes - * assertions, they will display in the test result. - * - * You can also override the default timeout (50ms) with a new value for - * this particular handler. - * - * This method may be called any number of times in a given [Test], [BeforeClass], - * or [Before] method. - * - * Test execution will be paused until all async handlers have returned - * or timed out. - * - * One way to use this method, is to simply send it to an event that you - * expect to have dispatched within a given time. - * - * instance.addEventListener(Event.COMPLETE, addAsync()); - * - * In this example, you will receive a timeout error if the COMPLETE - * event is not dispatched within 50ms. - * - */ - public function add(handler:Function=null, duration:int=-1):Function { - if (duration == -1) duration = timeout; - handler ||= function(...args):* {}; - var command:TimeoutCommand = new TimeoutCommand(null, handler, duration); - addPending(command); - return command.getCallback(); - } - - public function proceedOnEvent(target:IEventDispatcher, eventName:String, timeout:int=500, timeoutHandler:Function=null):void { - var asyncHandler:Function = add(null, timeout); - target.addEventListener(eventName, asyncHandler, false, 0, true); - } - - public function cancelPending():void { - for (var i:uint = pending.length; i--; ) { - var command:TimeoutCommand = TimeoutCommand(pending.pop()); - command.cancel(); - command.removeEventListener(TimeoutCommandEvent.CALLED, onTestResult); - command.removeEventListener(TimeoutCommandEvent.TIMED_OUT, onTestResult); - } - } - - // Partially opened for testing purposes. - public function getPending():Array { - // Clone to prevent changing by reference. - return pending.slice(); - } - - protected function addPending(command:TimeoutCommand):void { - pending.push(command); - command.addEventListener(TimeoutCommandEvent.CALLED, onTestResult); - command.addEventListener(TimeoutCommandEvent.TIMED_OUT, onTestResult); - command.addEventListener(ErrorEvent.ERROR, onTestResult); - dispatchEvent(new TimeoutCommandEvent(TimeoutCommandEvent.ADDED, command)); - } - - protected function onTestResult(e:Event):void { - var command:TimeoutCommand = TimeoutCommand(e.currentTarget); - command.removeEventListener(TimeoutCommandEvent.CALLED, onTestResult); - command.removeEventListener(TimeoutCommandEvent.TIMED_OUT, onTestResult); - removePending(command); - dispatchEvent(e); - } - - protected function removePending(command:TimeoutCommand):void { - pending.splice(pending.indexOf(command), 1); - } - } -} - +package asunit.framework { + + import asunit.framework.ErrorEvent; + + import asunit.events.TimeoutCommandEvent; + + import flash.events.Event; + import flash.events.EventDispatcher; + import flash.events.IEventDispatcher; + + public class Async extends EventDispatcher implements IAsync { + + public static var DEFAULT_TIMEOUT:uint = 50; + + private var _timeout:int = DEFAULT_TIMEOUT; + protected var pending:Array; + + /** + * Asynchronous handler class. + * + * This class give you the ability to create Asynchronous event handlers + * and pause test execution until those handlers are triggered. + * + * To take advantage of Asynchronous features, add a member variable + * to your test like: + * + * [Inject] + * public var async:IAsync; + * + * This public property will be injected with an IAsync instance + * before each test method. + * + * Within your test methods, you can add Async callbacks with: + * + * [Test] + * public function verifySomething():void { + * async.add(handler); + * } + * + * In the previous example, test execution will be halted until the + * +handler+ method is called. + * + * It's worth noting that AsUnit does not store any state related + * to the playback of your test harness in global variables. + * + */ + public function Async() { + pending = []; + } + + public function get hasPending():Boolean { + return pending.length > 0; + } + + public function set timeout(timeout:int):void { + _timeout = timeout; + } + + public function get timeout():int { + return _timeout; + } + + /** + * Returns a new async handler that should be used as the listener of some + * presumably asynchronous event. + * + * You can optionally pass a function closure that you would like to have + * executed when the provided handler is called. If this closure includes + * assertions, they will display in the test result. + * + * You can also override the default timeout (50ms) with a new value for + * this particular handler. + * + * This method may be called any number of times in a given [Test], [BeforeClass], + * or [Before] method. + * + * Test execution will be paused until all async handlers have returned + * or timed out. + * + * One way to use this method, is to simply send it to an event that you + * expect to have dispatched within a given time. + * + * instance.addEventListener(Event.COMPLETE, addAsync()); + * + * In this example, you will receive a timeout error if the COMPLETE + * event is not dispatched within 50ms. + * + */ + public function add(handler:Function=null, duration:int=-1):Function { + if (duration == -1) duration = timeout; + handler ||= function(...args):* {}; + var command:TimeoutCommand = new TimeoutCommand(null, handler, duration); + addPending(command); + return command.getCallback(); + } + + public function proceedOnEvent(target:IEventDispatcher, eventName:String, timeout:int=500, timeoutHandler:Function=null):void { + var asyncHandler:Function = add(null, timeout); + target.addEventListener(eventName, asyncHandler, false, 0, true); + } + + public function cancelPending():void { + for (var i:uint = pending.length; i--; ) { + var command:TimeoutCommand = TimeoutCommand(pending.pop()); + command.cancel(); + command.removeEventListener(TimeoutCommandEvent.CALLED, onTestResult); + command.removeEventListener(TimeoutCommandEvent.TIMED_OUT, onTestResult); + } + } + + // Partially opened for testing purposes. + public function getPending():Array { + // Clone to prevent changing by reference. + return pending.slice(); + } + + protected function addPending(command:TimeoutCommand):void { + pending.push(command); + command.addEventListener(TimeoutCommandEvent.CALLED, onTestResult); + command.addEventListener(TimeoutCommandEvent.TIMED_OUT, onTestResult); + command.addEventListener(ErrorEvent.ERROR, onTestResult); + dispatchEvent(new TimeoutCommandEvent(TimeoutCommandEvent.ADDED, command)); + } + + protected function onTestResult(e:Event):void { + var command:TimeoutCommand = TimeoutCommand(e.currentTarget); + command.removeEventListener(TimeoutCommandEvent.CALLED, onTestResult); + command.removeEventListener(TimeoutCommandEvent.TIMED_OUT, onTestResult); + removePending(command); + dispatchEvent(e); + } + + protected function removePending(command:TimeoutCommand):void { + pending.splice(pending.indexOf(command), 1); + } + } +} + diff --git a/asunit-4.0/src/asunit/framework/Command.as b/asunit-4.0/src/asunit/framework/Command.as index 74a6400..2bca187 100644 --- a/asunit-4.0/src/asunit/framework/Command.as +++ b/asunit-4.0/src/asunit/framework/Command.as @@ -1,6 +1,6 @@ -package asunit.framework { - - public interface Command { - function execute():*; - } -} +package asunit.framework { + + public interface Command { + function execute():*; + } +} diff --git a/asunit-4.0/src/asunit/framework/IResult.as b/asunit-4.0/src/asunit/framework/IResult.as index c0e6c37..49b9b6c 100644 --- a/asunit-4.0/src/asunit/framework/IResult.as +++ b/asunit-4.0/src/asunit/framework/IResult.as @@ -1,31 +1,31 @@ -package asunit.framework { - - public interface IResult extends IRunListener, ITestListener { - - function addListener(listener:IRunListener):void; - function removeListener(listener:IRunListener):void; - - function get errors():Array; - function get errorCount():uint; - - function get failures():Array; - function get failureCount():uint; - - function get successes():Array; - function get successCount():uint; - - function get warnings():Array; - - function get ignoredTests():Array; - function get ignoredTestCount():uint; - - function get runCount():uint; - - function get failureEncountered():Boolean; - function get wasSuccessful():Boolean; - - function get runTime():Number; - function set runTime(value:Number):void; - } -} - +package asunit.framework { + + public interface IResult extends IRunListener, ITestListener { + + function addListener(listener:IRunListener):void; + function removeListener(listener:IRunListener):void; + + function get errors():Array; + function get errorCount():uint; + + function get failures():Array; + function get failureCount():uint; + + function get successes():Array; + function get successCount():uint; + + function get warnings():Array; + + function get ignoredTests():Array; + function get ignoredTestCount():uint; + + function get runCount():uint; + + function get failureEncountered():Boolean; + function get wasSuccessful():Boolean; + + function get runTime():Number; + function set runTime(value:Number):void; + } +} + diff --git a/asunit-4.0/src/asunit/framework/Result.as b/asunit-4.0/src/asunit/framework/Result.as index 778e2c3..d6e12cb 100644 --- a/asunit-4.0/src/asunit/framework/Result.as +++ b/asunit-4.0/src/asunit/framework/Result.as @@ -1,160 +1,160 @@ -package asunit.framework { - - import asunit.errors.UsageError; - - /** - * A Result collects the results of executing - * a test case. It is an instance of the Collecting Parameter pattern. - * The test framework distinguishes between failures and errors. - * A failure is anticipated and checked for with assertions. Errors are - * unanticipated problems like an ArrayIndexOutOfBoundsException. - * - * @see Test - */ - public class Result implements IResult { - - protected var _runCount:uint = 0; - protected var _runTime:Number; - protected var _errors:Array; - protected var _failures:Array; - protected var _ignoredTests:Array; - protected var _successes:Array; - protected var _warnings:Array; - - protected var listeners:Array; - protected var runComplete:Boolean; - - public function Result() { - _errors = []; - _failures = []; - _ignoredTests = []; - _successes = []; - _warnings = []; - listeners = []; - } - - public function get errors():Array { return _errors; } - - /** - * Gets the number of detected errors. - */ - public function get errorCount():uint { return _errors.length; } - - /** - * - */ - public function get failures():Array { return _failures; } - - /** - * Gets the number of detected failures. - */ - public function get failureCount():uint { return _failures.length; } - - public function get successes():Array { return _successes; } - - public function get successCount():uint { return _successes.length; } - - public function get warnings():Array { return _warnings; } - - public function get ignoredTests():Array { return _ignoredTests; } - - public function get ignoredTestCount():uint { return _ignoredTests.length; } - - public function get runCount():uint { - return errorCount + failureCount + successCount; - } - - public function get runTime():Number { return _runTime; } - public function set runTime(value:Number):void { _runTime = value; } - - public function addListener(listener:IRunListener):void { - if (listeners.indexOf(listener) >= 0) return; - listeners.push(listener); - } - - public function removeListener(listener:IRunListener):void { - listeners.splice(listeners.indexOf(listener), 1); - } - - public function onRunStarted():void { - for each (var listener:IRunListener in listeners) { - listener.onRunStarted(); - } - } - - public function onRunCompleted(result:IResult):void { - runComplete = true; - for each (var listener:IRunListener in listeners) { - listener.onRunCompleted(this); - } - } - - public function onTestStarted(test:Object):void { - for each (var listener:IRunListener in listeners) { - listener.onTestStarted(test); - } - } - - public function onTestCompleted(test:Object):void { - for each (var listener:IRunListener in listeners) { - listener.onTestCompleted(test); - } - } - - /** - * Adds a failure to the list of failures. The passed in exception - * caused the failure. - */ - public function onTestFailure(failure:ITestFailure):void { - if (failure.isFailure) - _failures.push(failure); - else - _errors.push(failure); - - for each (var listener:IRunListener in listeners) { - listener.onTestFailure(failure); - } - } - - public function onTestSuccess(success:ITestSuccess):void { - _successes.push(success); - - for each (var listener:IRunListener in listeners) { - listener.onTestSuccess(success); - } - } - - public function onTestIgnored(method:Method):void { - _ignoredTests.push(method); - - for each (var listener:IRunListener in listeners) { - listener.onTestIgnored(method); - } - } - - public function onWarning(warning:ITestWarning):void { - _warnings.push(warning); - - for each (var listener:IRunListener in listeners) { - listener.onWarning(warning); - } - } - - /** - * Returns whether or not we have yet encountered a failure or error. - * Will be accurate when checked at any time during test run. - */ - public function get failureEncountered():Boolean { - return (failureCount > 0 || errorCount > 0); - } - - /** - * Returns whether or not the entire test was successful. - * Will only return true after +onRunCompleted+ called. - */ - public function get wasSuccessful():Boolean { - return (runComplete && !failureEncountered); - } - - } -} +package asunit.framework { + + import asunit.errors.UsageError; + + /** + * A Result collects the results of executing + * a test case. It is an instance of the Collecting Parameter pattern. + * The test framework distinguishes between failures and errors. + * A failure is anticipated and checked for with assertions. Errors are + * unanticipated problems like an ArrayIndexOutOfBoundsException. + * + * @see Test + */ + public class Result implements IResult { + + protected var _runCount:uint = 0; + protected var _runTime:Number; + protected var _errors:Array; + protected var _failures:Array; + protected var _ignoredTests:Array; + protected var _successes:Array; + protected var _warnings:Array; + + protected var listeners:Array; + protected var runComplete:Boolean; + + public function Result() { + _errors = []; + _failures = []; + _ignoredTests = []; + _successes = []; + _warnings = []; + listeners = []; + } + + public function get errors():Array { return _errors; } + + /** + * Gets the number of detected errors. + */ + public function get errorCount():uint { return _errors.length; } + + /** + * + */ + public function get failures():Array { return _failures; } + + /** + * Gets the number of detected failures. + */ + public function get failureCount():uint { return _failures.length; } + + public function get successes():Array { return _successes; } + + public function get successCount():uint { return _successes.length; } + + public function get warnings():Array { return _warnings; } + + public function get ignoredTests():Array { return _ignoredTests; } + + public function get ignoredTestCount():uint { return _ignoredTests.length; } + + public function get runCount():uint { + return errorCount + failureCount + successCount; + } + + public function get runTime():Number { return _runTime; } + public function set runTime(value:Number):void { _runTime = value; } + + public function addListener(listener:IRunListener):void { + if (listeners.indexOf(listener) >= 0) return; + listeners.push(listener); + } + + public function removeListener(listener:IRunListener):void { + listeners.splice(listeners.indexOf(listener), 1); + } + + public function onRunStarted():void { + for each (var listener:IRunListener in listeners) { + listener.onRunStarted(); + } + } + + public function onRunCompleted(result:IResult):void { + runComplete = true; + for each (var listener:IRunListener in listeners) { + listener.onRunCompleted(this); + } + } + + public function onTestStarted(test:Object):void { + for each (var listener:IRunListener in listeners) { + listener.onTestStarted(test); + } + } + + public function onTestCompleted(test:Object):void { + for each (var listener:IRunListener in listeners) { + listener.onTestCompleted(test); + } + } + + /** + * Adds a failure to the list of failures. The passed in exception + * caused the failure. + */ + public function onTestFailure(failure:ITestFailure):void { + if (failure.isFailure) + _failures.push(failure); + else + _errors.push(failure); + + for each (var listener:IRunListener in listeners) { + listener.onTestFailure(failure); + } + } + + public function onTestSuccess(success:ITestSuccess):void { + _successes.push(success); + + for each (var listener:IRunListener in listeners) { + listener.onTestSuccess(success); + } + } + + public function onTestIgnored(method:Method):void { + _ignoredTests.push(method); + + for each (var listener:IRunListener in listeners) { + listener.onTestIgnored(method); + } + } + + public function onWarning(warning:ITestWarning):void { + _warnings.push(warning); + + for each (var listener:IRunListener in listeners) { + listener.onWarning(warning); + } + } + + /** + * Returns whether or not we have yet encountered a failure or error. + * Will be accurate when checked at any time during test run. + */ + public function get failureEncountered():Boolean { + return (failureCount > 0 || errorCount > 0); + } + + /** + * Returns whether or not the entire test was successful. + * Will only return true after +onRunCompleted+ called. + */ + public function get wasSuccessful():Boolean { + return (runComplete && !failureEncountered); + } + + } +} diff --git a/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as b/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as index ff3433b..9b0cea7 100644 --- a/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as +++ b/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as @@ -1,181 +1,181 @@ -package asunit.printers { - import asunit.framework.IResult; - import asunit.framework.IRunListener; - import asunit.framework.ITestFailure; - import asunit.framework.ITestSuccess; - import asunit.framework.ITestWarning; - import asunit.framework.Method; - - import flash.events.DataEvent; - import flash.events.Event; - import flash.events.EventDispatcher; - import flash.events.IOErrorEvent; - import flash.events.SecurityErrorEvent; - import flash.events.TimerEvent; - import flash.net.XMLSocket; - import flash.system.fscommand; - import flash.utils.Timer; - import flash.utils.getQualifiedClassName; - import flash.utils.getTimer; - - public class FlexUnitCIPrinter extends EventDispatcher implements IRunListener - { - protected static const DEFAULT_SERVER:String = "127.0.0.1"; - protected static const DEFAULT_PORT:uint = 1024; - - public var port:uint; - public var server:String; //this is local host. same machine - - private static const SUCCESS:String = "success"; - private static const ERROR:String = "error"; - private static const FAILURE:String = "failure"; - private static const IGNORE:String = "ignore"; - - private static const START_OF_TEST_RUN_ACK : String = ""; - private static const END_OF_TEST_ACK : String =""; - private static const END_OF_TEST_RUN : String = ""; - - private var socket:XMLSocket; - private var connectTimeout:Timer; - - protected var messageQueue:Array; - - private var startTime : int; - - public function FlexUnitCIPrinter() - { - this.port = port; - this.server = server; - messageQueue = []; - - socket = new XMLSocket(); - socket.addEventListener(Event.CONNECT, onConnect); - socket.addEventListener(DataEvent.DATA, onData); - socket.addEventListener(IOErrorEvent.IO_ERROR, onErrorEvent); - socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onErrorEvent); - socket.addEventListener(Event.CLOSE, onErrorEvent); - - connectTimeout = new Timer(5000, 1); - connectTimeout.addEventListener(TimerEvent.TIMER_COMPLETE, onConnectTimeout); - connectTimeout.start(); - - connect(); - } - - protected function connect(ip:String = DEFAULT_SERVER, port:uint = DEFAULT_PORT):void { - try { - socket.connect(ip, port); - } - catch (e:Error) { - trace('## Error connecting to socket: ' + e.message); - } - } - - private function onConnectTimeout(event:TimerEvent):void { - throw new Error('Timed out waiting to connect to socket.'); - } - - public function onTestIgnored(method:Method):void { - var xmlMessageIgnore:String = "" - + "" - + ""; - sendMessage(xmlMessageIgnore); - } - - protected static function xmlEscapeMessage(message:String):String { - if (!message) return ''; - - var escape:XML = ; - escape.setChildren( message ); - return escape.children()[0].toXMLString(); - } - - public function onTestFailure(failure:ITestFailure):void { - sendMessage(getFailureMessage(failure)); - } - - protected function getFailureMessage(failure:ITestFailure):String { - var status:String = failure.isFailure ? FAILURE : ERROR; -// var stackTrace:String = xmlEscapeMessage(failure.thrownException.getStackTrace()); - var stackTrace:String = failure.thrownException.getStackTrace(); - var xml:String = - "" - - + "" - + "" - + "" - - + ""; - - return xml; - } - - protected function sendMessage(message:String):void { - if (!socket.connected) { - messageQueue.push(message); - return; - } - socket.send(message); - } - - protected function onConnect(event:Event):void { - connectTimeout.stop(); - sendQueuedMessages(); - } - - protected function sendQueuedMessages():void { - while (messageQueue.length) { - sendMessage(messageQueue.shift()); - } - } - - private function onData( event : DataEvent ) : void - { - if (event.data == END_OF_TEST_ACK) { - exit(); - } - } - - protected function onErrorEvent(event:Event):void { - trace('FlexUnitCIPrinter::onErrorEvent() - event: ' + event); - //throw new Error('FlashBuilderPrinter::onErrorEvent() - event: ' + event); - } - - public function onRunStarted():void { - } - - public function onTestStarted(test:Object):void { - startTime = getTimer(); - } - - public function onTestCompleted(test:Object):void { -// testTimes.push({test:test, duration:duration}); - } - - public function onTestSuccess(success:ITestSuccess):void - { - //TODO: move test time into ITestSuccess - var duration:Number = (getTimer() - startTime) / 1000; - var xmlMessageSuccess:String = ""; - sendMessage(xmlMessageSuccess); - } - - public function onRunCompleted(result:IResult):void { - sendMessage(END_OF_TEST_RUN); - } - - protected function exit():void - { - socket.close(); - fscommand("quit"); - } - - public function onWarning(warning:ITestWarning) : void { - } - } -} +package asunit.printers { + import asunit.framework.IResult; + import asunit.framework.IRunListener; + import asunit.framework.ITestFailure; + import asunit.framework.ITestSuccess; + import asunit.framework.ITestWarning; + import asunit.framework.Method; + + import flash.events.DataEvent; + import flash.events.Event; + import flash.events.EventDispatcher; + import flash.events.IOErrorEvent; + import flash.events.SecurityErrorEvent; + import flash.events.TimerEvent; + import flash.net.XMLSocket; + import flash.system.fscommand; + import flash.utils.Timer; + import flash.utils.getQualifiedClassName; + import flash.utils.getTimer; + + public class FlexUnitCIPrinter extends EventDispatcher implements IRunListener + { + protected static const DEFAULT_SERVER:String = "127.0.0.1"; + protected static const DEFAULT_PORT:uint = 1024; + + public var port:uint; + public var server:String; //this is local host. same machine + + private static const SUCCESS:String = "success"; + private static const ERROR:String = "error"; + private static const FAILURE:String = "failure"; + private static const IGNORE:String = "ignore"; + + private static const START_OF_TEST_RUN_ACK : String = ""; + private static const END_OF_TEST_ACK : String =""; + private static const END_OF_TEST_RUN : String = ""; + + private var socket:XMLSocket; + private var connectTimeout:Timer; + + protected var messageQueue:Array; + + private var startTime : int; + + public function FlexUnitCIPrinter() + { + this.port = port; + this.server = server; + messageQueue = []; + + socket = new XMLSocket(); + socket.addEventListener(Event.CONNECT, onConnect); + socket.addEventListener(DataEvent.DATA, onData); + socket.addEventListener(IOErrorEvent.IO_ERROR, onErrorEvent); + socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onErrorEvent); + socket.addEventListener(Event.CLOSE, onErrorEvent); + + connectTimeout = new Timer(5000, 1); + connectTimeout.addEventListener(TimerEvent.TIMER_COMPLETE, onConnectTimeout); + connectTimeout.start(); + + connect(); + } + + protected function connect(ip:String = DEFAULT_SERVER, port:uint = DEFAULT_PORT):void { + try { + socket.connect(ip, port); + } + catch (e:Error) { + trace('## Error connecting to socket: ' + e.message); + } + } + + private function onConnectTimeout(event:TimerEvent):void { + throw new Error('Timed out waiting to connect to socket.'); + } + + public function onTestIgnored(method:Method):void { + var xmlMessageIgnore:String = "" + + "" + + ""; + sendMessage(xmlMessageIgnore); + } + + protected static function xmlEscapeMessage(message:String):String { + if (!message) return ''; + + var escape:XML = ; + escape.setChildren( message ); + return escape.children()[0].toXMLString(); + } + + public function onTestFailure(failure:ITestFailure):void { + sendMessage(getFailureMessage(failure)); + } + + protected function getFailureMessage(failure:ITestFailure):String { + var status:String = failure.isFailure ? FAILURE : ERROR; +// var stackTrace:String = xmlEscapeMessage(failure.thrownException.getStackTrace()); + var stackTrace:String = failure.thrownException.getStackTrace(); + var xml:String = + "" + + + "" + + "" + + "" + + + ""; + + return xml; + } + + protected function sendMessage(message:String):void { + if (!socket.connected) { + messageQueue.push(message); + return; + } + socket.send(message); + } + + protected function onConnect(event:Event):void { + connectTimeout.stop(); + sendQueuedMessages(); + } + + protected function sendQueuedMessages():void { + while (messageQueue.length) { + sendMessage(messageQueue.shift()); + } + } + + private function onData( event : DataEvent ) : void + { + if (event.data == END_OF_TEST_ACK) { + exit(); + } + } + + protected function onErrorEvent(event:Event):void { + trace('FlexUnitCIPrinter::onErrorEvent() - event: ' + event); + //throw new Error('FlashBuilderPrinter::onErrorEvent() - event: ' + event); + } + + public function onRunStarted():void { + } + + public function onTestStarted(test:Object):void { + startTime = getTimer(); + } + + public function onTestCompleted(test:Object):void { +// testTimes.push({test:test, duration:duration}); + } + + public function onTestSuccess(success:ITestSuccess):void + { + //TODO: move test time into ITestSuccess + var duration:Number = (getTimer() - startTime) / 1000; + var xmlMessageSuccess:String = ""; + sendMessage(xmlMessageSuccess); + } + + public function onRunCompleted(result:IResult):void { + sendMessage(END_OF_TEST_RUN); + } + + protected function exit():void + { + socket.close(); + fscommand("quit"); + } + + public function onWarning(warning:ITestWarning) : void { + } + } +} diff --git a/asunit-4.0/src/asunit/runners/SuiteRunner.as b/asunit-4.0/src/asunit/runners/SuiteRunner.as index 41b0902..16eda19 100644 --- a/asunit-4.0/src/asunit/runners/SuiteRunner.as +++ b/asunit-4.0/src/asunit/runners/SuiteRunner.as @@ -1,89 +1,89 @@ -package asunit.runners { - - import asunit.framework.IResult; - import asunit.framework.IRunner; - import asunit.framework.IRunnerFactory; - import asunit.framework.Result; - import asunit.framework.RunnerFactory; - import asunit.framework.SuiteIterator; - import asunit.util.Iterator; - import org.swiftsuspenders.Injector; - - import flash.display.DisplayObjectContainer; - import flash.events.Event; - import flash.events.EventDispatcher; - import flash.events.TimerEvent; - import flash.utils.Timer; - - public class SuiteRunner extends EventDispatcher implements IRunner { - - public var result:IResult; - - protected var testClasses:Iterator; - protected var timer:Timer; - protected var visualContext:DisplayObjectContainer; - protected var testMethod:String; - protected var injector:Injector; - protected var factory:IRunnerFactory; - - public function SuiteRunner(factory:IRunnerFactory = null, result:IResult = null, injector:Injector = null) { - timer = new Timer(0, 1); - - this.injector = injector ||= new Injector(); - injector.mapValue(Injector, injector); - this.result = result ||= new Result(); - injector.mapValue(IResult, result); - this.factory = factory ||= injector.instantiate(RunnerFactory); - injector.mapValue(IRunnerFactory, factory); - } - - public function run(suite:Class, testMethod:String=null, visualContext:DisplayObjectContainer=null):void { - this.visualContext = visualContext; - this.testMethod = testMethod; - runSuite(suite); - } - - protected function runSuite(suite:*):void { - testClasses = new SuiteIterator(suite); - timer.addEventListener(TimerEvent.TIMER, runNextTest); - - runNextTest(); - } - - protected function runNextTest(e:TimerEvent = null):void{ - if (!testClasses.hasNext()) { - onSuiteCompleted(); - return; - } - - var testClass:Class = testClasses.next(); - // [luke] TODO: This runnerFor call can throw exceptions, - // we need to handle them in some way. - var runner:IRunner = factory.runnerFor(testClass); - runner.addEventListener(Event.COMPLETE, onTestCompleted); - // [luke] TODO: There should be a clear search, - // and clear failure when testMethod is provided, - // but not found... - runner.run(testClass, testMethod, visualContext); - } - - protected function onTestCompleted(e:Event):void { - e.target.removeEventListener(Event.COMPLETE, onTestCompleted); - // Start a new green thread. - timer.reset(); - timer.start(); - } - - protected function onSuiteCompleted():void { - timer.removeEventListener(TimerEvent.TIMER, runNextTest); - dispatchEvent(new Event(Event.COMPLETE)); - } - - /** - * Template method that subclasses can override to perform some - * operation when the run is complete. - */ - protected function onRunCompleted():void { - } - } -} +package asunit.runners { + + import asunit.framework.IResult; + import asunit.framework.IRunner; + import asunit.framework.IRunnerFactory; + import asunit.framework.Result; + import asunit.framework.RunnerFactory; + import asunit.framework.SuiteIterator; + import asunit.util.Iterator; + import org.swiftsuspenders.Injector; + + import flash.display.DisplayObjectContainer; + import flash.events.Event; + import flash.events.EventDispatcher; + import flash.events.TimerEvent; + import flash.utils.Timer; + + public class SuiteRunner extends EventDispatcher implements IRunner { + + public var result:IResult; + + protected var testClasses:Iterator; + protected var timer:Timer; + protected var visualContext:DisplayObjectContainer; + protected var testMethod:String; + protected var injector:Injector; + protected var factory:IRunnerFactory; + + public function SuiteRunner(factory:IRunnerFactory = null, result:IResult = null, injector:Injector = null) { + timer = new Timer(0, 1); + + this.injector = injector ||= new Injector(); + injector.mapValue(Injector, injector); + this.result = result ||= new Result(); + injector.mapValue(IResult, result); + this.factory = factory ||= injector.instantiate(RunnerFactory); + injector.mapValue(IRunnerFactory, factory); + } + + public function run(suite:Class, testMethod:String=null, visualContext:DisplayObjectContainer=null):void { + this.visualContext = visualContext; + this.testMethod = testMethod; + runSuite(suite); + } + + protected function runSuite(suite:*):void { + testClasses = new SuiteIterator(suite); + timer.addEventListener(TimerEvent.TIMER, runNextTest); + + runNextTest(); + } + + protected function runNextTest(e:TimerEvent = null):void{ + if (!testClasses.hasNext()) { + onSuiteCompleted(); + return; + } + + var testClass:Class = testClasses.next(); + // [luke] TODO: This runnerFor call can throw exceptions, + // we need to handle them in some way. + var runner:IRunner = factory.runnerFor(testClass); + runner.addEventListener(Event.COMPLETE, onTestCompleted); + // [luke] TODO: There should be a clear search, + // and clear failure when testMethod is provided, + // but not found... + runner.run(testClass, testMethod, visualContext); + } + + protected function onTestCompleted(e:Event):void { + e.target.removeEventListener(Event.COMPLETE, onTestCompleted); + // Start a new green thread. + timer.reset(); + timer.start(); + } + + protected function onSuiteCompleted():void { + timer.removeEventListener(TimerEvent.TIMER, runNextTest); + dispatchEvent(new Event(Event.COMPLETE)); + } + + /** + * Template method that subclasses can override to perform some + * operation when the run is complete. + */ + protected function onRunCompleted():void { + } + } +} diff --git a/asunit-4.0/test/AsUnitCIRunner.as b/asunit-4.0/test/AsUnitCIRunner.as index b5db877..81a4517 100644 --- a/asunit-4.0/test/AsUnitCIRunner.as +++ b/asunit-4.0/test/AsUnitCIRunner.as @@ -1,18 +1,18 @@ -package { - - import asunit.core.FlexUnitCICore; - import asunit.core.TextCore; - - import flash.display.MovieClip; - - [SWF(width="1024", height="640", backgroundColor="#000000", frameRate="61")] - public class AsUnitCIRunner extends MovieClip { - - private var core:TextCore; - - public function AsUnitCIRunner() { - core = new FlexUnitCICore(); - core.start(AllTests, null, this); - } - } +package { + + import asunit.core.FlexUnitCICore; + import asunit.core.TextCore; + + import flash.display.MovieClip; + + [SWF(width="1024", height="640", backgroundColor="#000000", frameRate="61")] + public class AsUnitCIRunner extends MovieClip { + + private var core:TextCore; + + public function AsUnitCIRunner() { + core = new FlexUnitCICore(); + core.start(AllTests, null, this); + } + } } \ No newline at end of file diff --git a/asunit-4.0/test/AsUnitRunner.as b/asunit-4.0/test/AsUnitRunner.as index b155de6..b659fdb 100755 --- a/asunit-4.0/test/AsUnitRunner.as +++ b/asunit-4.0/test/AsUnitRunner.as @@ -1,17 +1,17 @@ -package { - - import asunit.core.TextCore; - import flash.display.MovieClip; - - [SWF(width="1024", height="640", backgroundColor="#000000", frameRate="61")] - public class AsUnitRunner extends MovieClip { - - private var core:TextCore; - - public function AsUnitRunner() { - core = new TextCore(); - core.textPrinter.hideLocalPaths = true; - core.start(AllTests, null, this); - } - } +package { + + import asunit.core.TextCore; + import flash.display.MovieClip; + + [SWF(width="1024", height="640", backgroundColor="#000000", frameRate="61")] + public class AsUnitRunner extends MovieClip { + + private var core:TextCore; + + public function AsUnitRunner() { + core = new TextCore(); + core.textPrinter.hideLocalPaths = true; + core.start(AllTests, null, this); + } + } } \ No newline at end of file diff --git a/asunit-4.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as b/asunit-4.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as index b974881..cb6c619 100755 --- a/asunit-4.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as +++ b/asunit-4.0/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as @@ -1,102 +1,102 @@ -package asunit.framework -{ - import asunit.errors.AssertionFailedError; - import asunit.framework.TestCase; - import asunit.framework.Assert; - import flash.display.Sprite; - - /** - * Tests assertEqualsArraysIgnoringOrder - * - * @author Bastian Krol - */ - public class AssertEqualsArraysIgnoringOrderTest extends TestCase { - - public function AssertEqualsArraysIgnoringOrderTest(testMethod:String = null) { - super(testMethod); - } - - public function testNullEqualsNull():void { - assertEqualsArraysIgnoringOrder(Assert.assertEqualsArraysIgnoringOrder, null, null); - } - - public function testNullDoesNotEqualNotNull():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, null, []); - } - - public function testNotNullDoesNotEqualNull():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, [], null); - } - - public function testEmptyArrayEqualsEmptyArray():void { - assertEqualsArraysIgnoringOrder([], []); - } - - public function testArrayWithOneStringEquals():void { - assertEqualsArraysIgnoringOrder(["abcdefg"], ["abcdefg"]); - } - - public function testArrayWithOneStringNotEquals():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abcdefg"], ["12345"]); - } - - public function testArrayWithOneFunctionEquals():void { - assertEqualsArraysIgnoringOrder([tearDown], [tearDown]); - } - - public function testArrayWithOneFunctionNotEquals():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, [setUp], [tearDown]); - } - - public function testArrayWithOneNullMemberEquals():void { - assertEqualsArraysIgnoringOrder([null], [null]); - } - - public function testArrayWithOneNullMemberNotEquals1():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["..."], [null]); - } - - public function testArrayWithOneNullMemberNotEquals2():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, [null], ["..."]); - } - - public function testArrayEqualsSameOrder():void { - assertEqualsArraysIgnoringOrder(["abc", "def", "ghi"], ["abc", "def", "ghi"]); - } - - public function testArrayNotEquals():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def", "ghi"], ["abc", "xyz", "ghi"]); - } - - public function testArrayEqualsDifferentOrder1():void { - assertEqualsArraysIgnoringOrder(["abc", "def", "ghi"], ["def", "abc", "ghi"]); - } - - public function testArrayEqualsDifferentTypes():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, - ["abc", "def", "ghi"], - ["abc", setUp, "ghi"]); - } - - public function testArrayDifferentLength1():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def", "ghi"], ["abc", "def"]); - } - - public function testArrayDifferentLength2():void { - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def"], ["abc", "def", "ghi"]); - } - - public function testArrayWithRepeatedItems():void { - var spr1:Sprite = new Sprite(); - var spr2:Sprite = new Sprite(); - var spr3:Sprite = new Sprite(); - - var controlArray:Array = [spr1, spr2, spr3, spr1]; - var matchingArray:Array = [spr1, spr2, spr1, spr3]; - var nonMatchingArray:Array = [spr1, spr2, spr3, spr2]; - - assertEqualsArraysIgnoringOrder('these arrays should match', controlArray, matchingArray); - assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, controlArray, nonMatchingArray); - } - } +package asunit.framework +{ + import asunit.errors.AssertionFailedError; + import asunit.framework.TestCase; + import asunit.framework.Assert; + import flash.display.Sprite; + + /** + * Tests assertEqualsArraysIgnoringOrder + * + * @author Bastian Krol + */ + public class AssertEqualsArraysIgnoringOrderTest extends TestCase { + + public function AssertEqualsArraysIgnoringOrderTest(testMethod:String = null) { + super(testMethod); + } + + public function testNullEqualsNull():void { + assertEqualsArraysIgnoringOrder(Assert.assertEqualsArraysIgnoringOrder, null, null); + } + + public function testNullDoesNotEqualNotNull():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, null, []); + } + + public function testNotNullDoesNotEqualNull():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, [], null); + } + + public function testEmptyArrayEqualsEmptyArray():void { + assertEqualsArraysIgnoringOrder([], []); + } + + public function testArrayWithOneStringEquals():void { + assertEqualsArraysIgnoringOrder(["abcdefg"], ["abcdefg"]); + } + + public function testArrayWithOneStringNotEquals():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abcdefg"], ["12345"]); + } + + public function testArrayWithOneFunctionEquals():void { + assertEqualsArraysIgnoringOrder([tearDown], [tearDown]); + } + + public function testArrayWithOneFunctionNotEquals():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, [setUp], [tearDown]); + } + + public function testArrayWithOneNullMemberEquals():void { + assertEqualsArraysIgnoringOrder([null], [null]); + } + + public function testArrayWithOneNullMemberNotEquals1():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["..."], [null]); + } + + public function testArrayWithOneNullMemberNotEquals2():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, [null], ["..."]); + } + + public function testArrayEqualsSameOrder():void { + assertEqualsArraysIgnoringOrder(["abc", "def", "ghi"], ["abc", "def", "ghi"]); + } + + public function testArrayNotEquals():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def", "ghi"], ["abc", "xyz", "ghi"]); + } + + public function testArrayEqualsDifferentOrder1():void { + assertEqualsArraysIgnoringOrder(["abc", "def", "ghi"], ["def", "abc", "ghi"]); + } + + public function testArrayEqualsDifferentTypes():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, + ["abc", "def", "ghi"], + ["abc", setUp, "ghi"]); + } + + public function testArrayDifferentLength1():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def", "ghi"], ["abc", "def"]); + } + + public function testArrayDifferentLength2():void { + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, ["abc", "def"], ["abc", "def", "ghi"]); + } + + public function testArrayWithRepeatedItems():void { + var spr1:Sprite = new Sprite(); + var spr2:Sprite = new Sprite(); + var spr3:Sprite = new Sprite(); + + var controlArray:Array = [spr1, spr2, spr3, spr1]; + var matchingArray:Array = [spr1, spr2, spr1, spr3]; + var nonMatchingArray:Array = [spr1, spr2, spr3, spr2]; + + assertEqualsArraysIgnoringOrder('these arrays should match', controlArray, matchingArray); + assertAssertionFailed(Assert.assertEqualsArraysIgnoringOrder, controlArray, nonMatchingArray); + } + } } \ No newline at end of file diff --git a/asunit-4.0/test/asunit/framework/AsyncTest.as b/asunit-4.0/test/asunit/framework/AsyncTest.as index 3caee8a..5466678 100644 --- a/asunit-4.0/test/asunit/framework/AsyncTest.as +++ b/asunit-4.0/test/asunit/framework/AsyncTest.as @@ -1,100 +1,100 @@ -package asunit.framework { - - import asunit.asserts.*; - import asunit.events.TimeoutCommandEvent; - import asunit.framework.Async; - import asunit.framework.IAsync; - import asunit.framework.TestCase; - - import flash.events.Event; - import flash.utils.setTimeout; - - public class AsyncTest { - - [Inject] - public var async:IAsync; - - private var orphanAsync:IAsync; - private var command:TimeoutCommand; - - [Before] - public function createOrphanAsync():void { - orphanAsync = new Async(); - } - - [After] - public function destroyOrphanAsync():void { - orphanAsync = null; - } - - [Test] - public function asyncHandlerCanBeRetrievedByTestInstance():void { - var cancelTimeout:Function = async.add(foo); - - var commands:Array = async.getPending(); - assertEquals("one command for test after addAsync()", 1, commands.length); - - var command:TimeoutCommand = commands[0]; - assertSame("handler is the same function passed to addAsync", foo, command.handler); - - cancelTimeout(); - - assertEquals("no commands for test after handler called", 0, async.getPending().length); - } - - [Test] - public function addAsyncShouldSendCALLEDEventIfDelegateCalledInTime():void { - var cancelTimeout:Function = async.add(foo, 50); - - command = async.getPending()[0]; - - // Use AsUnit 3's addAsync() to verify onAsyncMethodCalled is called. - command.addEventListener(TimeoutCommandEvent.CALLED, async.add(onAsyncMethodCalled)); - - // If all goes well, the ErrorEvent won't be dispatched. - command.addEventListener(TimeoutCommandEvent.TIMED_OUT, failIfCalled); - - // cancelTimeout is called faster than async.add duration - setTimeout(cancelTimeout, 0); - } - - private function onAsyncMethodCalled(e:Event):void { - assertEquals("event type", TimeoutCommandEvent.CALLED, e.type); - } - - [Ignore(description="Async failure, but I'm no longer convinced that there is any value in this test case. Do we care if the TimeoutCommand can throw events? So long as we verify our failure state from the runner?")] - [Test] - public function addAsyncShouldSendErrorEventIfDelegateNotCalledInTime():void { - - // This should be called by the orphanAsync instance when the timeout is exceeded: - var asyncMethodFailedHandler:Function = function(event:TimeoutCommandEvent):void { - assertEquals("event type", TimeoutCommandEvent.TIMED_OUT, event.type); - command.removeEventListener(TimeoutCommandEvent.CALLED, failIfCalled); - command.removeEventListener(TimeoutCommandEvent.TIMED_OUT, asyncMethodFailedHandler); - } - - var timeoutHandler:Function = orphanAsync.add(null, 1); - // Set a timeout on the orphanAsync, but also pass this - // to the actual, outer test run async - when this is called, - // the outer test run can continue. - var cancelTimeout:Function = async.add(timeoutHandler, 500); - - // Add subscriptions to the timeout command: - command = orphanAsync.getPending()[0]; - command.addEventListener(TimeoutCommandEvent.CALLED, failIfCalled); - command.addEventListener(TimeoutCommandEvent.TIMED_OUT, orphanAsync.add(asyncMethodFailedHandler)); - - // we should attempt to call the async handler AFTER the timeout - // has already expired. The handler should NOT get called... - setTimeout(cancelTimeout, 10); - } - - - private function failIfCalled(event:Event=null):void { - fail("AsyncTest: This function should not have been called"); - } - //TODO: You might want to delete this since it is basically a no-op handler. You could send instead now. - private function foo():void {}; - } -} - +package asunit.framework { + + import asunit.asserts.*; + import asunit.events.TimeoutCommandEvent; + import asunit.framework.Async; + import asunit.framework.IAsync; + import asunit.framework.TestCase; + + import flash.events.Event; + import flash.utils.setTimeout; + + public class AsyncTest { + + [Inject] + public var async:IAsync; + + private var orphanAsync:IAsync; + private var command:TimeoutCommand; + + [Before] + public function createOrphanAsync():void { + orphanAsync = new Async(); + } + + [After] + public function destroyOrphanAsync():void { + orphanAsync = null; + } + + [Test] + public function asyncHandlerCanBeRetrievedByTestInstance():void { + var cancelTimeout:Function = async.add(foo); + + var commands:Array = async.getPending(); + assertEquals("one command for test after addAsync()", 1, commands.length); + + var command:TimeoutCommand = commands[0]; + assertSame("handler is the same function passed to addAsync", foo, command.handler); + + cancelTimeout(); + + assertEquals("no commands for test after handler called", 0, async.getPending().length); + } + + [Test] + public function addAsyncShouldSendCALLEDEventIfDelegateCalledInTime():void { + var cancelTimeout:Function = async.add(foo, 50); + + command = async.getPending()[0]; + + // Use AsUnit 3's addAsync() to verify onAsyncMethodCalled is called. + command.addEventListener(TimeoutCommandEvent.CALLED, async.add(onAsyncMethodCalled)); + + // If all goes well, the ErrorEvent won't be dispatched. + command.addEventListener(TimeoutCommandEvent.TIMED_OUT, failIfCalled); + + // cancelTimeout is called faster than async.add duration + setTimeout(cancelTimeout, 0); + } + + private function onAsyncMethodCalled(e:Event):void { + assertEquals("event type", TimeoutCommandEvent.CALLED, e.type); + } + + [Ignore(description="Async failure, but I'm no longer convinced that there is any value in this test case. Do we care if the TimeoutCommand can throw events? So long as we verify our failure state from the runner?")] + [Test] + public function addAsyncShouldSendErrorEventIfDelegateNotCalledInTime():void { + + // This should be called by the orphanAsync instance when the timeout is exceeded: + var asyncMethodFailedHandler:Function = function(event:TimeoutCommandEvent):void { + assertEquals("event type", TimeoutCommandEvent.TIMED_OUT, event.type); + command.removeEventListener(TimeoutCommandEvent.CALLED, failIfCalled); + command.removeEventListener(TimeoutCommandEvent.TIMED_OUT, asyncMethodFailedHandler); + } + + var timeoutHandler:Function = orphanAsync.add(null, 1); + // Set a timeout on the orphanAsync, but also pass this + // to the actual, outer test run async - when this is called, + // the outer test run can continue. + var cancelTimeout:Function = async.add(timeoutHandler, 500); + + // Add subscriptions to the timeout command: + command = orphanAsync.getPending()[0]; + command.addEventListener(TimeoutCommandEvent.CALLED, failIfCalled); + command.addEventListener(TimeoutCommandEvent.TIMED_OUT, orphanAsync.add(asyncMethodFailedHandler)); + + // we should attempt to call the async handler AFTER the timeout + // has already expired. The handler should NOT get called... + setTimeout(cancelTimeout, 10); + } + + + private function failIfCalled(event:Event=null):void { + fail("AsyncTest: This function should not have been called"); + } + //TODO: You might want to delete this since it is basically a no-op handler. You could send instead now. + private function foo():void {}; + } +} + diff --git a/asunit-4.0/test/asunit/framework/ProceedOnEventTest.as b/asunit-4.0/test/asunit/framework/ProceedOnEventTest.as index d67f5c1..99ce4f6 100644 --- a/asunit-4.0/test/asunit/framework/ProceedOnEventTest.as +++ b/asunit-4.0/test/asunit/framework/ProceedOnEventTest.as @@ -1,108 +1,108 @@ -package asunit.framework { - - import asunit.asserts.*; - import asunit.events.TimeoutCommandEvent; - import asunit.framework.ErrorEvent; - import asunit.framework.TestCase; - - import flash.events.Event; - import flash.events.EventDispatcher; - import flash.events.IEventDispatcher; - import flash.utils.clearTimeout; - import flash.utils.setTimeout; - - public class ProceedOnEventTest { - - [Inject] - public var async:IAsync; - public var dispatcher:EventDispatcher; - - private var orphanAsync:IAsync; - private var command:TimeoutCommand; - private var timeoutID:int = -1; - - [Before] - public function setUp():void { - orphanAsync = new Async(); - dispatcher = new EventDispatcher(); - } - - [After] - public function tearDown():void { - command = null; - orphanAsync = null; - timeoutID = -1; - } - - protected function foo():void { } - - [Test] - public function proceedOnEventShouldDispatchCorrectEventAndClearPendingCommands():void { - orphanAsync.proceedOnEvent(dispatcher, Event.COMPLETE, 10); - - var commands:Array = orphanAsync.getPending(); - assertEquals("one pending command for test after proceedOnEvent()", 1, commands.length); - - // send the correct event synchronously - dispatchCompleteEvent(); - - var message:String = "No pending commands for test after correct Event dispatched."; - assertEquals(message, 0, orphanAsync.getPending().length); - } - - protected function dispatchCompleteEvent():void { - dispatcher.dispatchEvent(new Event(Event.COMPLETE)); - } - - [Test] - public function proceedOnEventShouldTimeoutAppropriately():void { - - // Grab a reference to the Dispatcher so that we still have - // it after the test run (Fixing uncaught RTE null pointer exception) - var source:IEventDispatcher = dispatcher; - - // This is the initial setup, we want test execution to pause - // for 1ms OR until the COMPLETE event fires: - orphanAsync.proceedOnEvent(source, Event.COMPLETE, 1); - - // Get the Command so that we can just wait for the TIMED_OUT event: - var commands:Array = orphanAsync.getPending(); - var command:TimeoutCommand = commands[0]; - command.addEventListener(TimeoutCommandEvent.TIMED_OUT, async.add(onAsyncMethodFailed, 500)); - - // send the correct event too slowly - timeoutID = setTimeout(function():void { - source.dispatchEvent(new Event(Event.COMPLETE)); - }, 10); - } - - protected function onAsyncMethodFailed(event:TimeoutCommandEvent):void { - assertEquals("event type", TimeoutCommandEvent.TIMED_OUT, event.type); - clearTimeout(timeoutID); - } - - [Test] - public function proceedOnEventShouldSendCALLEDEventAsExpected():void { - orphanAsync.proceedOnEvent(dispatcher, Event.COMPLETE, 10); - - command = orphanAsync.getPending()[0]; - - // Use AsUnit 3's orphanAsync.add() to verify onAsyncMethodCalled is called. - command.addEventListener(TimeoutCommandEvent.CALLED, async.add(onAsyncMethodCalled)); - - // If all goes well, the ErrorEvent won't be dispatched. - command.addEventListener(ErrorEvent.ERROR, failIfCalled); - - // send the correct event faster than orphanAsync.proceedOnEvent duration - setTimeout(dispatchCompleteEvent, 0); - } - - protected function onAsyncMethodCalled(e:Event):void { - assertEquals("event type", TimeoutCommandEvent.CALLED, e.type); - } - - protected function failIfCalled(e:Event = null):void { - fail("ProceedOnEventTest: This function should not have been called"); - } - } -} +package asunit.framework { + + import asunit.asserts.*; + import asunit.events.TimeoutCommandEvent; + import asunit.framework.ErrorEvent; + import asunit.framework.TestCase; + + import flash.events.Event; + import flash.events.EventDispatcher; + import flash.events.IEventDispatcher; + import flash.utils.clearTimeout; + import flash.utils.setTimeout; + + public class ProceedOnEventTest { + + [Inject] + public var async:IAsync; + public var dispatcher:EventDispatcher; + + private var orphanAsync:IAsync; + private var command:TimeoutCommand; + private var timeoutID:int = -1; + + [Before] + public function setUp():void { + orphanAsync = new Async(); + dispatcher = new EventDispatcher(); + } + + [After] + public function tearDown():void { + command = null; + orphanAsync = null; + timeoutID = -1; + } + + protected function foo():void { } + + [Test] + public function proceedOnEventShouldDispatchCorrectEventAndClearPendingCommands():void { + orphanAsync.proceedOnEvent(dispatcher, Event.COMPLETE, 10); + + var commands:Array = orphanAsync.getPending(); + assertEquals("one pending command for test after proceedOnEvent()", 1, commands.length); + + // send the correct event synchronously + dispatchCompleteEvent(); + + var message:String = "No pending commands for test after correct Event dispatched."; + assertEquals(message, 0, orphanAsync.getPending().length); + } + + protected function dispatchCompleteEvent():void { + dispatcher.dispatchEvent(new Event(Event.COMPLETE)); + } + + [Test] + public function proceedOnEventShouldTimeoutAppropriately():void { + + // Grab a reference to the Dispatcher so that we still have + // it after the test run (Fixing uncaught RTE null pointer exception) + var source:IEventDispatcher = dispatcher; + + // This is the initial setup, we want test execution to pause + // for 1ms OR until the COMPLETE event fires: + orphanAsync.proceedOnEvent(source, Event.COMPLETE, 1); + + // Get the Command so that we can just wait for the TIMED_OUT event: + var commands:Array = orphanAsync.getPending(); + var command:TimeoutCommand = commands[0]; + command.addEventListener(TimeoutCommandEvent.TIMED_OUT, async.add(onAsyncMethodFailed, 500)); + + // send the correct event too slowly + timeoutID = setTimeout(function():void { + source.dispatchEvent(new Event(Event.COMPLETE)); + }, 10); + } + + protected function onAsyncMethodFailed(event:TimeoutCommandEvent):void { + assertEquals("event type", TimeoutCommandEvent.TIMED_OUT, event.type); + clearTimeout(timeoutID); + } + + [Test] + public function proceedOnEventShouldSendCALLEDEventAsExpected():void { + orphanAsync.proceedOnEvent(dispatcher, Event.COMPLETE, 10); + + command = orphanAsync.getPending()[0]; + + // Use AsUnit 3's orphanAsync.add() to verify onAsyncMethodCalled is called. + command.addEventListener(TimeoutCommandEvent.CALLED, async.add(onAsyncMethodCalled)); + + // If all goes well, the ErrorEvent won't be dispatched. + command.addEventListener(ErrorEvent.ERROR, failIfCalled); + + // send the correct event faster than orphanAsync.proceedOnEvent duration + setTimeout(dispatchCompleteEvent, 0); + } + + protected function onAsyncMethodCalled(e:Event):void { + assertEquals("event type", TimeoutCommandEvent.CALLED, e.type); + } + + protected function failIfCalled(e:Event = null):void { + fail("ProceedOnEventTest: This function should not have been called"); + } + } +} diff --git a/asunit-4.0/test/asunit/framework/VisualTestCaseTest.as b/asunit-4.0/test/asunit/framework/VisualTestCaseTest.as index 7db71f1..f7ac4e3 100644 --- a/asunit-4.0/test/asunit/framework/VisualTestCaseTest.as +++ b/asunit-4.0/test/asunit/framework/VisualTestCaseTest.as @@ -1,19 +1,19 @@ -package asunit.framework { - - import asunit.asserts.*; - - import flash.display.Sprite; - - public class VisualTestCaseTest { - - [Inject] - public var context:Sprite; - - [Test] - public function instantiated():void { - assertTrue(context is Sprite); - } - - } -} - +package asunit.framework { + + import asunit.asserts.*; + + import flash.display.Sprite; + + public class VisualTestCaseTest { + + [Inject] + public var context:Sprite; + + [Test] + public function instantiated():void { + assertTrue(context is Sprite); + } + + } +} + diff --git a/asunit-4.0/test/asunit/support/SingleSuccessSuite.as b/asunit-4.0/test/asunit/support/SingleSuccessSuite.as index 588d3ee..6ee5780 100644 --- a/asunit-4.0/test/asunit/support/SingleSuccessSuite.as +++ b/asunit-4.0/test/asunit/support/SingleSuccessSuite.as @@ -1,7 +1,7 @@ -package asunit.support { - - [Suite] - public class SingleSuccessSuite { - public var succeedAssertTrue:SucceedAssertTrue; - } -} +package asunit.support { + + [Suite] + public class SingleSuccessSuite { + public var succeedAssertTrue:SucceedAssertTrue; + } +} diff --git a/asunit-4.0/test/asunit/support/SuiteOfTwoSuites.as b/asunit-4.0/test/asunit/support/SuiteOfTwoSuites.as index c6cb5f3..392fe1c 100644 --- a/asunit-4.0/test/asunit/support/SuiteOfTwoSuites.as +++ b/asunit-4.0/test/asunit/support/SuiteOfTwoSuites.as @@ -1,8 +1,8 @@ -package asunit.support { - - [Suite] - public class SuiteOfTwoSuites { - public var singleSuccessSuite:SingleSuccessSuite; - public var doubleFailSuite:DoubleFailSuite; - } -} +package asunit.support { + + [Suite] + public class SuiteOfTwoSuites { + public var singleSuccessSuite:SingleSuccessSuite; + public var doubleFailSuite:DoubleFailSuite; + } +} From 708ed0052f2faeb0caa8768f3e86bb6ab5fe9bfe Mon Sep 17 00:00:00 2001 From: lukebayes Date: Sat, 26 Mar 2011 10:44:12 -0700 Subject: [PATCH 45/54] Replaced CRLF with LF in Method.as - autocorrect from Git --- asunit-4.0/src/asunit/framework/Method.as | 160 +++++++++++----------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/asunit-4.0/src/asunit/framework/Method.as b/asunit-4.0/src/asunit/framework/Method.as index 93a642d..b002405 100644 --- a/asunit-4.0/src/asunit/framework/Method.as +++ b/asunit-4.0/src/asunit/framework/Method.as @@ -1,80 +1,80 @@ -package asunit.framework { - - import p2.reflect.Reflection; - import p2.reflect.ReflectionMethod; - import p2.reflect.ReflectionMetaData; - - public class Method { - - private var _scopeName:String; - - public var expects:String; - public var ignore:Boolean; - public var ignoreDescription:String; - public var metadata:ReflectionMetaData; - public var name:String; - public var order:int = 0; - public var scope:Object; - public var timeout:int = -1; - public var value:Function; - - public function Method(scope:Object, reflection:ReflectionMethod) { - this.scope = scope; - this.name = reflection.name; - this.value = scope[reflection.name]; - - metadata = reflection.getMetaDataByName('Test'); - - if(metadata != null) { - var ignoreReflection:ReflectionMetaData = reflection.getMetaDataByName('Ignore'); - if(ignoreReflection) { - ignore = true; - ignoreDescription = ignoreReflection.getValueFor('description'); - } - - handleTimeoutMetaData(); - applyMetaData('expects'); - applyMetaData('order'); - } - } - - public function get scopeName():String { - return _scopeName ||= Reflection.create(scope).name - } - - private function handleTimeoutMetaData():void { - var value:* = metadata.getValueFor('timeout'); - if(value != null) { - var message:String = "It seems you're using [Test(timeout=n)] for " + name + ", but this has been deprecated.\n"; - message += "If you'd like to set a different timeout value, please send it to your Async instance methods like: async.add(null, timeoutInMilliseconds)"; - trace("[DEPRECATION WARNING] " + message); - } - } - - // The null response for timeout was updating the - // int field to zero when it needs to be -1... - private function applyMetaData(name:String):void { - var value:* = metadata.getValueFor(name); - if(value != null) { - this[name] = value; - } - } - - public function execute():void { - value.call(scope); - } - - public function get isTest():Boolean { - return (metadata != null || isLegacyTest); - } - - public function get isLegacyTest():Boolean { - return (metadata == null && name.match(/^test/)); - } - - public function toString():String { - return name; - } - } -} - +package asunit.framework { + + import p2.reflect.Reflection; + import p2.reflect.ReflectionMethod; + import p2.reflect.ReflectionMetaData; + + public class Method { + + private var _scopeName:String; + + public var expects:String; + public var ignore:Boolean; + public var ignoreDescription:String; + public var metadata:ReflectionMetaData; + public var name:String; + public var order:int = 0; + public var scope:Object; + public var timeout:int = -1; + public var value:Function; + + public function Method(scope:Object, reflection:ReflectionMethod) { + this.scope = scope; + this.name = reflection.name; + this.value = scope[reflection.name]; + + metadata = reflection.getMetaDataByName('Test'); + + if(metadata != null) { + var ignoreReflection:ReflectionMetaData = reflection.getMetaDataByName('Ignore'); + if(ignoreReflection) { + ignore = true; + ignoreDescription = ignoreReflection.getValueFor('description'); + } + + handleTimeoutMetaData(); + applyMetaData('expects'); + applyMetaData('order'); + } + } + + public function get scopeName():String { + return _scopeName ||= Reflection.create(scope).name + } + + private function handleTimeoutMetaData():void { + var value:* = metadata.getValueFor('timeout'); + if(value != null) { + var message:String = "It seems you're using [Test(timeout=n)] for " + name + ", but this has been deprecated.\n"; + message += "If you'd like to set a different timeout value, please send it to your Async instance methods like: async.add(null, timeoutInMilliseconds)"; + trace("[DEPRECATION WARNING] " + message); + } + } + + // The null response for timeout was updating the + // int field to zero when it needs to be -1... + private function applyMetaData(name:String):void { + var value:* = metadata.getValueFor(name); + if(value != null) { + this[name] = value; + } + } + + public function execute():void { + value.call(scope); + } + + public function get isTest():Boolean { + return (metadata != null || isLegacyTest); + } + + public function get isLegacyTest():Boolean { + return (metadata == null && name.match(/^test/)); + } + + public function toString():String { + return name; + } + } +} + From 7c976b1c1a66b626a377c7ae5641364fa22eb418 Mon Sep 17 00:00:00 2001 From: lukebayes Date: Sat, 26 Mar 2011 10:52:58 -0700 Subject: [PATCH 46/54] Fixed missing 'message' field from bad merge --- asunit-4.0/src/asunit/framework/Method.as | 2 ++ 1 file changed, 2 insertions(+) diff --git a/asunit-4.0/src/asunit/framework/Method.as b/asunit-4.0/src/asunit/framework/Method.as index b002405..6135ccd 100644 --- a/asunit-4.0/src/asunit/framework/Method.as +++ b/asunit-4.0/src/asunit/framework/Method.as @@ -9,6 +9,7 @@ private var _scopeName:String; public var expects:String; + public var message:String; public var ignore:Boolean; public var ignoreDescription:String; public var metadata:ReflectionMetaData; @@ -34,6 +35,7 @@ handleTimeoutMetaData(); applyMetaData('expects'); + applyMetaData('message'); applyMetaData('order'); } } From dcb4c4a7ccd717dae1118247d04ff12529fd5406 Mon Sep 17 00:00:00 2001 From: lukebayes Date: Sat, 26 Mar 2011 12:52:30 -0700 Subject: [PATCH 47/54] Added support for XMLPrinter Extracted base class out of FlashBuilderPrinter and exposed as XMLPrinter Added tests for XMLPrinter output Added assertMatches assertion --- .../src/asunit/asserts/assertMatches.as | 6 + asunit-4.0/src/asunit/framework/Assert.as | 24 ++++ .../asunit/printers/FlashBuilderPrinter.as | 118 +++++----------- asunit-4.0/src/asunit/printers/XMLPrinter.as | 127 +++++++++++++++++ asunit-4.0/test/AllTests.as | 2 + .../test/asunit/printers/XMLPrinterTest.as | 131 ++++++++++++++++++ 6 files changed, 321 insertions(+), 87 deletions(-) create mode 100644 asunit-4.0/src/asunit/asserts/assertMatches.as create mode 100644 asunit-4.0/src/asunit/printers/XMLPrinter.as create mode 100644 asunit-4.0/test/asunit/printers/XMLPrinterTest.as diff --git a/asunit-4.0/src/asunit/asserts/assertMatches.as b/asunit-4.0/src/asunit/asserts/assertMatches.as new file mode 100644 index 0000000..dcdcb1a --- /dev/null +++ b/asunit-4.0/src/asunit/asserts/assertMatches.as @@ -0,0 +1,6 @@ + +package asunit.asserts { + import asunit.framework.Assert; + + public const assertMatches:Function = Assert.assertMatches; +} diff --git a/asunit-4.0/src/asunit/framework/Assert.as b/asunit-4.0/src/asunit/framework/Assert.as index b229bfb..29cd403 100644 --- a/asunit-4.0/src/asunit/framework/Assert.as +++ b/asunit-4.0/src/asunit/framework/Assert.as @@ -219,6 +219,30 @@ package asunit.framework { throw new AssertionFailedError(message + "expected not null but was:<" + actual + ">"); } } + + static public function assertMatches(...args:Array):void { + var message:String; + var expr:RegExp; + var content:String; + + if(args.length == 2) { + message = ""; + expr = args[0]; + content = args[1]; + } + else if(args.length == 3) { + message = args[0]; + expr = args[1]; + content = args[2]; + } + else { + throw new IllegalOperationError("Invalid argument count"); + } + if(!content.match(expr)) { + fail("Unable to match [" + expr + "] in content: [" + content + "]"); + } + } + /** * Asserts that an object is null. If it is not * an AssertionFailedError is thrown with the given message. diff --git a/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as b/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as index 73876b7..9303e98 100644 --- a/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as +++ b/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as @@ -1,27 +1,31 @@ package asunit.printers { - import asunit.framework.ITestFailure; - import asunit.framework.ITestWarning; - import asunit.framework.IResult; - import asunit.framework.IRunListener; - import asunit.framework.ITestSuccess; - import asunit.framework.Method; - import flash.events.Event; - import flash.events.IOErrorEvent; - import flash.events.SecurityErrorEvent; + import asunit.errors.AssertionFailedError; + import asunit.framework.Test; + import asunit.framework.TestListener; + import asunit.framework.TestResult; + import flash.events.EventDispatcher; import flash.net.XMLSocket; - import flash.utils.getQualifiedClassName; - - public class FlashBuilderPrinter implements IRunListener { - protected var projectName:String; - protected var contextName:String; - protected var messageQueue:Array; + import flash.utils.setTimeout; + import flash.utils.Dictionary; + + /** + * FlashBuilderPrinter should connect to the running Flash Builder test result + * view over an XMLSocket and send it test results as they accumulate. + */ + public class FlashBuilderPrinter extends XMLResultPrinter { + protected var socket:XMLSocket; - + public function FlashBuilderPrinter(projectName:String = '', contextName:String = '') { - this.projectName = projectName; - this.contextName = contextName; - messageQueue = []; + testPrefix = null; + testSuffix = null; + traceResults = false; + super(projectName, contextName); + connectToSocket(); + } + + protected function connectToSocket():void { socket = new XMLSocket(); socket.addEventListener(Event.CONNECT, onConnect); socket.addEventListener(IOErrorEvent.IO_ERROR, onErrorEvent); @@ -30,41 +34,8 @@ package asunit.printers { connect(); } - public function onRunStarted():void { - sendMessage(""); - } - - public function onTestStarted(test:Object):void { - } - - public function onTestCompleted(test:Object):void { - } - - // works for both errors and failures - public function onTestFailure(failure:ITestFailure):void { - sendMessage(getFailureMessage(failure)); - } - - public function onTestSuccess(success:ITestSuccess):void { - var xmlMessageSuccess:String = ""; - sendMessage(xmlMessageSuccess); - } - - public function onTestIgnored(method:Method):void { - var xmlMessageIgnore:String = ""; - sendMessage(xmlMessageIgnore); - } - - public function onWarning(warning:ITestWarning):void { - //TODO: is there any way to send a warning to Flash Builder? - } - - public function onRunCompleted(result:IResult):void { - sendMessage(''); - socket.close(); + protected function onErrorEvent(event:Event):void { + trace('FlashBuilderPrinter::onErrorEvent() - event: ' + event); } protected function connect(ip:String = '127.0.0.1', port:uint = 8765):void { @@ -75,6 +46,11 @@ package asunit.printers { trace('## Error connecting to Flash Builder socket: ' + e.message); } } + + override public function onRunCompleted(result:IResult):void { + super.onRunCompleted(result); + socket.close(); + } protected function onConnect(event:Event):void { sendQueuedMessages(); @@ -93,37 +69,5 @@ package asunit.printers { } socket.send(message); } - - protected function getFailureMessage(failure:ITestFailure):String { - var status:String = failure.isFailure ? 'failure' : 'error'; - var xml:String = - "" - + "" - - + "" + xmlEscapeMessage(failure.exceptionMessage) - + "" - - + "" + xmlEscapeMessage(failure.thrownException.getStackTrace()) - + "" - - + "" - + ""; - - return xml; - } - - protected function onErrorEvent(event:Event):void { - trace('FlashBuilderPrinter::onErrorEvent() - event: ' + event); - } - - protected static function xmlEscapeMessage(message:String):String { - if (!message) return ''; - - var escape:XML = ; - escape.setChildren( message ); - return escape.children()[0].toXMLString(); - } - } + } } diff --git a/asunit-4.0/src/asunit/printers/XMLPrinter.as b/asunit-4.0/src/asunit/printers/XMLPrinter.as new file mode 100644 index 0000000..7ab054d --- /dev/null +++ b/asunit-4.0/src/asunit/printers/XMLPrinter.as @@ -0,0 +1,127 @@ + +package asunit.printers { + import asunit.framework.ITestFailure; + import asunit.framework.ITestWarning; + import asunit.framework.IResult; + import asunit.framework.IRunListener; + import asunit.framework.ITestSuccess; + import asunit.framework.Method; + + import flash.events.Event; + import flash.events.IOErrorEvent; + import flash.events.SecurityErrorEvent; + import flash.utils.getQualifiedClassName; + + /** + * The XMLPrinter is used to transform AsUnit test results + * to JUnit-compatible XML content. + * + * This printer will send JUnit-compatible XML content to trace output. The XML content + * will be enclosed by '<TestResults/>' tags. + **/ + public class XMLPrinter implements IRunListener { + public var traceResults:Boolean = true; + + protected var projectName:String; + protected var contextName:String; + protected var messageQueue:Array; + protected var testPrefix:String = ""; + protected var testSuffix:String = ""; + + public function XMLPrinter(projectName:String = '', contextName:String = '') { + this.projectName = projectName; + this.contextName = contextName; + messageQueue = []; + } + + public function onRunStarted():void { + if (testPrefix) { + sendMessage(testPrefix); + } + sendMessage(""); + } + + public function onRunCompleted(result:IResult):void { + sendMessage(''); + + if (testSuffix) { + sendMessage(""); + } + + if (traceResults) { + trace(toString()); + } + } + + public function onTestStarted(test:Object):void { + } + + public function onTestCompleted(test:Object):void { + } + + // works for both errors and failures + public function onTestFailure(failure:ITestFailure):void { + sendMessage(getFailureMessage(failure)); + } + + public function onTestSuccess(success:ITestSuccess):void { + var xmlMessageSuccess:String = ""; + sendMessage(xmlMessageSuccess); + } + + public function onTestIgnored(method:Method):void { + var xmlMessageIgnore:String = ""; + sendMessage(xmlMessageIgnore); + } + + public function onWarning(warning:ITestWarning):void { + var xmlMessage:String = ""; + sendMessage(xmlMessage); + } + + public function toString():String { + return messageQueue.join("\n"); + } + + protected function sendMessage(message:String):void { + messageQueue.push(message); + } + + protected function getFailureMessage(failure:ITestFailure):String { + var status:String = failure.isFailure ? 'failure' : 'error'; + var xml:String = + "" + + "" + + + "" + xmlEscapeMessage(failure.exceptionMessage) + + "" + + + "" + xmlEscapeMessage(failure.thrownException.getStackTrace()) + + "" + + + "" + + ""; + + return xml; + } + + protected static function xmlEscapeMessage(message:String):String { + if (!message) return ''; + + var escape:XML = ; + escape.setChildren( message ); + return escape.children()[0].toXMLString(); + } + } +} + + + + + diff --git a/asunit-4.0/test/AllTests.as b/asunit-4.0/test/AllTests.as index 3c108d7..6c4636b 100644 --- a/asunit-4.0/test/AllTests.as +++ b/asunit-4.0/test/AllTests.as @@ -27,6 +27,7 @@ package { import asunit.framework.TestIteratorSingleMethodTest; import asunit.framework.VisualTestCaseTest; import asunit.printers.TextPrinterTest; + import asunit.printers.XMLPrinterTest; import asunit.runners.LegacyRunnerTest; import asunit.runners.SuiteRunnerTest; import asunit.runners.TestRunnerAsyncMethodTest; @@ -61,6 +62,7 @@ package { public var asunit_framework_TestIteratorSingleMethodTest:asunit.framework.TestIteratorSingleMethodTest; public var asunit_framework_VisualTestCaseTest:asunit.framework.VisualTestCaseTest; public var asunit_printers_TextPrinterTest:asunit.printers.TextPrinterTest; + public var asunit_printers_XMLPrinterTest:asunit.printers.XMLPrinterTest; public var asunit_runners_LegacyRunnerTest:asunit.runners.LegacyRunnerTest; public var asunit_runners_SuiteRunnerTest:asunit.runners.SuiteRunnerTest; public var asunit_runners_TestRunnerAsyncMethodTest:asunit.runners.TestRunnerAsyncMethodTest; diff --git a/asunit-4.0/test/asunit/printers/XMLPrinterTest.as b/asunit-4.0/test/asunit/printers/XMLPrinterTest.as new file mode 100644 index 0000000..0685508 --- /dev/null +++ b/asunit-4.0/test/asunit/printers/XMLPrinterTest.as @@ -0,0 +1,131 @@ +package asunit.printers { + + import asunit.asserts.*; + import asunit.errors.AssertionFailedError; + import asunit.framework.ITestFailure; + import asunit.framework.TestCase; + + import asunit.framework.IResult; + import asunit.framework.ITestSuccess; + import asunit.framework.ITestWarning; + import asunit.framework.Method; + import asunit.framework.Result; + import asunit.framework.TestFailure; + import asunit.framework.TestSuccess; + import asunit.framework.TestWarning; + + import p2.reflect.Reflection; + import p2.reflect.ReflectionMethod; + + + public class XMLPrinterTest extends TestCase { + + private var printer:XMLPrinter; + private var test:*; + private var testSuccess:ITestSuccess; + private var testError:ITestFailure; + private var testFailure:ITestFailure; + private var testResult:IResult; + private var testWarning:ITestWarning; + + public function XMLPrinterTest(method:String=null) { + super(method); + } + + override protected function setUp():void { + super.setUp(); + printer = new XMLPrinter(); + printer.traceResults = false; + + test = new FakeTestCase(); + var reflect:Reflection = Reflection.create(test); + var methodReflection:ReflectionMethod = reflect.methods[0]; + var method:Method = new Method(test, methodReflection); + + testResult = new Result(); + testError = new TestFailure(test, 'testSomethingThatErrors', new Error('Fake Error')); + testFailure = new TestFailure(test, 'testSomethingThatFails', new AssertionFailedError('Fake Failure')); + testSuccess = new TestSuccess(test, 'testSomethingThatSucceeds'); + testWarning = new TestWarning(test, method); + testResult.addListener(printer); + } + + private function executeTestWith(handler:Function):void { + testResult.onRunStarted(); + testResult.onTestStarted(test); + handler.call(this); + testResult.onTestCompleted(test); + testResult.onRunCompleted(null); + } + + private function executeASucceedingTest():String { + executeTestWith(function():void { + testResult.onTestSuccess(testSuccess); + }); + return printer.toString(); + } + + private function executeASucceedingTestWithWarning():String { + executeTestWith(function():void { + testResult.onWarning(testWarning); + testResult.onTestSuccess(testSuccess); + }); + testResult.onRunStarted(); + testResult.onTestStarted(test); + testResult.onTestCompleted(test); + testResult.onRunCompleted(null); + return printer.toString(); + } + + private function executeAFailingTest():String { + executeTestWith(function():void { + testResult.onTestFailure(testFailure); + }); + return printer.toString(); + } + + private function executeAnErrorTest():String { + executeTestWith(function():void { + testResult.onTestFailure(testError); + }); + return printer.toString(); + } + + public function testPrinterStartAndFinish():void { + var actual:String = executeASucceedingTest(); + assertMatches(//, actual); + assertMatches(/startTestRun/, actual); + assertMatches(//, actual); + assertMatches(/<\/TestResults>/, actual); + + assertMatches(/status='success'/, actual); + } + + public function testPrinterFailure():void { + var actual:String = executeAFailingTest(); + assertMatches(/status='failure'/, actual); + assertMatches(/stackTraceInfo/, actual); + assertMatches(/asunit\/printers\/XMLPrinterTest.as/, actual); + } + + public function testPrinterError():void { + var actual:String = executeAnErrorTest(); + assertMatches(/status='error'/, actual); + assertMatches(/stackTraceInfo/, actual); + assertMatches(/asunit\/printers\/XMLPrinterTest.as/, actual); + } + + public function testPrinterWarning():void { + var actual:String = executeASucceedingTestWithWarning(); + assertMatches(/status='warning'/, actual); + assertMatches(/status='success'/, actual); + } + } +} + +class FakeTestCase { + + [Test] + public function testSomething():void { + } +} From cb6c0b550e45d190087c15d90985e4128d2c39de Mon Sep 17 00:00:00 2001 From: lukebayes Date: Sat, 26 Mar 2011 12:55:38 -0700 Subject: [PATCH 48/54] Added performanceCount configuration variable to TextPrinter Set default performanceCount to 10 so that test result times no longer push the results off screen in a normal terminal --- asunit-4.0/src/asunit/printers/TextPrinter.as | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/asunit-4.0/src/asunit/printers/TextPrinter.as b/asunit-4.0/src/asunit/printers/TextPrinter.as index 66c2ce6..f3a1721 100644 --- a/asunit-4.0/src/asunit/printers/TextPrinter.as +++ b/asunit-4.0/src/asunit/printers/TextPrinter.as @@ -24,6 +24,7 @@ package asunit.printers { public static const DEFAULT_HEADER:String = "AsUnit 4.0 by Luke Bayes, Ali Mills and Robert Penner\n\nFlash Player version: " + Capabilities.version public static const DEFAULT_FOOTER:String = ""; public static const DEFAULT_FONT_SIZE:int = 12; + public static const DEFAULT_PERFORMANCE_COUNT:int = 10; public static const DEFAULT_TEXT_COLOR:uint = 0xffffff; public var header:String = DEFAULT_HEADER; @@ -34,6 +35,7 @@ package asunit.printers { public var traceOnComplete:Boolean = true; public var hideLocalPaths:Boolean = false; public var localPathPattern:RegExp = LOCAL_PATH_PATTERN; + public var performanceCount:int = DEFAULT_PERFORMANCE_COUNT; protected var textDisplay:TextField; @@ -187,7 +189,7 @@ package asunit.printers { println(); println('Time Summary:'); println(); - var len:Number = testTimes.length; + var len:Number = Math.min(performanceCount, testTimes.length); var total:Number = 0; var testTime:Object; for (var i:Number = 0; i < len; i++) { From b793b15eb18783df65b9b6e14bb757c62bd2fd3f Mon Sep 17 00:00:00 2001 From: lukebayes Date: Sat, 26 Mar 2011 13:16:38 -0700 Subject: [PATCH 49/54] Added simple FlashBuilder test to ensure that it compiles --- .../asunit/printers/FlashBuilderPrinter.as | 25 +++++++++++-------- asunit-4.0/test/AllTests.as | 3 ++- .../printers/FlashBuilderPrinterTest.as | 18 +++++++++++++ 3 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 asunit-4.0/test/asunit/printers/FlashBuilderPrinterTest.as diff --git a/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as b/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as index 9303e98..951cb4e 100644 --- a/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as +++ b/asunit-4.0/src/asunit/printers/FlashBuilderPrinter.as @@ -1,19 +1,22 @@ package asunit.printers { + import asunit.framework.ITestFailure; + import asunit.framework.ITestWarning; + import asunit.framework.IResult; + import asunit.framework.IRunListener; + import asunit.framework.ITestSuccess; + import asunit.framework.Method; + + import flash.events.Event; + import flash.events.IOErrorEvent; + import flash.events.SecurityErrorEvent; + import flash.utils.getQualifiedClassName; + import flash.net.XMLSocket; - import asunit.errors.AssertionFailedError; - import asunit.framework.Test; - import asunit.framework.TestListener; - import asunit.framework.TestResult; - import flash.events.EventDispatcher; - import flash.net.XMLSocket; - import flash.utils.setTimeout; - import flash.utils.Dictionary; - /** * FlashBuilderPrinter should connect to the running Flash Builder test result * view over an XMLSocket and send it test results as they accumulate. */ - public class FlashBuilderPrinter extends XMLResultPrinter { + public class FlashBuilderPrinter extends XMLPrinter { protected var socket:XMLSocket; @@ -62,7 +65,7 @@ package asunit.printers { } } - protected function sendMessage(message:String):void { + override protected function sendMessage(message:String):void { if (!socket.connected) { messageQueue.push(message); return; diff --git a/asunit-4.0/test/AllTests.as b/asunit-4.0/test/AllTests.as index 6c4636b..98f0f66 100644 --- a/asunit-4.0/test/AllTests.as +++ b/asunit-4.0/test/AllTests.as @@ -28,6 +28,7 @@ package { import asunit.framework.VisualTestCaseTest; import asunit.printers.TextPrinterTest; import asunit.printers.XMLPrinterTest; + import asunit.printers.FlashBuilderPrinterTest; import asunit.runners.LegacyRunnerTest; import asunit.runners.SuiteRunnerTest; import asunit.runners.TestRunnerAsyncMethodTest; @@ -62,7 +63,7 @@ package { public var asunit_framework_TestIteratorSingleMethodTest:asunit.framework.TestIteratorSingleMethodTest; public var asunit_framework_VisualTestCaseTest:asunit.framework.VisualTestCaseTest; public var asunit_printers_TextPrinterTest:asunit.printers.TextPrinterTest; - public var asunit_printers_XMLPrinterTest:asunit.printers.XMLPrinterTest; + public var asunit_printers_FlashBuilderPrinterTest:asunit.printers.FlashBuilderPrinterTest; public var asunit_runners_LegacyRunnerTest:asunit.runners.LegacyRunnerTest; public var asunit_runners_SuiteRunnerTest:asunit.runners.SuiteRunnerTest; public var asunit_runners_TestRunnerAsyncMethodTest:asunit.runners.TestRunnerAsyncMethodTest; diff --git a/asunit-4.0/test/asunit/printers/FlashBuilderPrinterTest.as b/asunit-4.0/test/asunit/printers/FlashBuilderPrinterTest.as new file mode 100644 index 0000000..bf0e5e6 --- /dev/null +++ b/asunit-4.0/test/asunit/printers/FlashBuilderPrinterTest.as @@ -0,0 +1,18 @@ + +package asunit.printers { + + import asunit.asserts.*; + import asunit.framework.TestCase; + + public class FlashBuilderPrinterTest extends TestCase { + + public function FlashBuilderPrinterTest(method:String=null) { + super(method); + } + + private function testInstantiable():void { + var printer:FlashBuilderPrinter = new FlashBuilderPrinter(); + } + } +} + From 985a2655f4018edee437531cd384a3f47f206559 Mon Sep 17 00:00:00 2001 From: lukebayes Date: Sat, 26 Mar 2011 13:20:11 -0700 Subject: [PATCH 50/54] Incremented revision and rebuilt gem distribution --- asunit-4.0/rakefile.rb | 3 ++- asunit-4.0/sprout/lib/asunit4.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/asunit-4.0/rakefile.rb b/asunit-4.0/rakefile.rb index c3276e8..a767a33 100644 --- a/asunit-4.0/rakefile.rb +++ b/asunit-4.0/rakefile.rb @@ -139,6 +139,7 @@ def configure_test_task(t) apply_as3_meta_data_args(t) end +desc "Build the SWC file for #{AsUnit::VERSION}" task :swc => "bin/AsUnit-#{AsUnit::VERSION}.swc" ########################################## @@ -173,7 +174,7 @@ def configure_test_task(t) desc "Create the gem package" -task :package_gem => :swc do +task :package => :swc do sh "gem build asunit4.gemspec" end diff --git a/asunit-4.0/sprout/lib/asunit4.rb b/asunit-4.0/sprout/lib/asunit4.rb index 1132778..e8ba9b0 100644 --- a/asunit-4.0/sprout/lib/asunit4.rb +++ b/asunit-4.0/sprout/lib/asunit4.rb @@ -4,7 +4,7 @@ module AsUnit NAME = 'asunit4' - VERSION = '4.2.2.pre' + VERSION = '4.2.3.pre' end require 'asunit4/test_class_generator' From fac0f691cf9c7913fe12041c41ced2270931448a Mon Sep 17 00:00:00 2001 From: drewbourne Date: Fri, 30 Sep 2011 12:31:21 +1000 Subject: [PATCH 51/54] add ColorTracePrinter to colorise test results - OK in green - FAILURE in red - Ignore in yellow - Warning in yellow --- .../src/asunit/printers/ColorTracePrinter.as | 290 ++++++++++++++++++ asunit-4.0/test/AllTests.as | 2 + .../asunit/printers/ColorTracePrinterTest.as | 121 ++++++++ 3 files changed, 413 insertions(+) create mode 100644 asunit-4.0/src/asunit/printers/ColorTracePrinter.as create mode 100644 asunit-4.0/test/asunit/printers/ColorTracePrinterTest.as diff --git a/asunit-4.0/src/asunit/printers/ColorTracePrinter.as b/asunit-4.0/src/asunit/printers/ColorTracePrinter.as new file mode 100644 index 0000000..4f2cb9f --- /dev/null +++ b/asunit-4.0/src/asunit/printers/ColorTracePrinter.as @@ -0,0 +1,290 @@ +package asunit.printers { + + import asunit.framework.IResult; + import asunit.framework.IRunListener; + import asunit.framework.ITestFailure; + import asunit.framework.ITestSuccess; + import asunit.framework.ITestWarning; + import asunit.framework.Method; + + import flash.system.Capabilities; + import flash.utils.getQualifiedClassName; + import flash.utils.getTimer; + + public class ColorTracePrinter implements IRunListener { + public static const LOCAL_PATH_PATTERN:RegExp = /([A-Z]:\\[^\/:\*\?<>\|]+\.\w{2,6})|(\\{2}[^\/:\*\?<>\|]+\.\w{2,6})/g; + public static const DEFAULT_HEADER:String = "AsUnit 4.0 by Luke Bayes, Ali Mills and Robert Penner\n\nFlash Player version: " + Capabilities.version + public static const DEFAULT_FOOTER:String = ""; + public static const DEFAULT_PERFORMANCE_COUNT:int = 10; + + public var header:String = DEFAULT_HEADER; + public var footer:String = DEFAULT_FOOTER; + public var displayPerformanceDetails:Boolean = true; + public var hideLocalPaths:Boolean = false; + public var localPathPattern:RegExp = LOCAL_PATH_PATTERN; + public var performanceCount:int = DEFAULT_PERFORMANCE_COUNT; + + private var dots:Array; + private var failures:Array; + private var ignores:Array; + private var runCompleted:Boolean; + private var startTime:Number; + private var successes:Array; + private var testTimes:Array; + private var warnings:Array; + + public function ColorTracePrinter() { + initialize(); + } + + private function initialize():void { + dots = []; + failures = []; + ignores = []; + successes = []; + testTimes = []; + warnings = []; + } + + public function onRunStarted():void { + } + + public function onTestFailure(failure:ITestFailure):void { + var s:String = ''; + s += red(getQualifiedClassName(failure.failedTest)); + s += red('.' + failure.failedMethod) + ' : '; + s += getFailureStackTrace(failure); + + failures.push(s); + dots.push(failure.isFailure ? red('F') : red('E')); + } + + private function getFailureStackTrace(failure:ITestFailure):String { + var stack:String = ""; + stack = failure.thrownException.getStackTrace(); + if (hideLocalPaths) + stack = stack.replace(localPathPattern, ''); + stack = stack.replace(/AssertionFailedError: /, ''); + stack += "\n\n"; + return stack; + } + + public function onTestSuccess(success:ITestSuccess):void { + dots.push('.'); + } + + public function onTestIgnored(method:Method):void { + dots.push(yellow('I')); + ignores.push(getIgnoreFromMethod(method)); + } + + private function getIgnoreFromMethod(method:Method):String { + var message:String + = "[" + yellow("Ignore") + "] " + + yellow(method.scopeName + "." + method.toString()); + + if (method.ignoreDescription) { + message += " (" + method.ignoreDescription + ")"; + } + return message; + } + + public function onWarning(warning:ITestWarning):void { + warnings.push(getWarning(warning)); + } + + private function getWarning(warning:ITestWarning):String { + var message:String + = "[" + yellow("Warning") + "] " + + (warning.method ? yellow(warning.method.scopeName + "." + warning.method.toString()) : "") + + warning.message; + return message; + } + + public function onTestStarted(test:Object):void { + startTime = getTimer(); + } + + public function onTestCompleted(test:Object):void { + var duration:Number = getTimer() - startTime; + testTimes.push({test:test, duration:duration}); + } + + public function onRunCompleted(result:IResult):void { + runCompleted = true; + printRunSummary(result); + printTimeSummary(); + printPerformanceDetails(); + logResult(); + } + + protected function logResult():void { + trace(toString()); + } + + private function print(str:String):void { + footer += str; + } + + private function println(str:String = ""):void { + print(str + "\n"); + } + + private function printRunSummary(result:IResult):void { + if (result.runCount == 0) { + println(yellow("[WARNING] No tests were found or executed.")); + println(); + return; + } + + if (result.wasSuccessful) { + println("[ " + green("OK") + " ]"); + println(); + println("Tests run: " + result.runCount); + } + else { + println("[ " + red("FAILURE") + " ]"); + println(); + println("Tests run: " + result.runCount + + ", Failures: " + result.failureCount + + ", Errors: " + result.errorCount + + ", Ignored: " + result.ignoredTestCount + ); + } + } + + private function printTimeSummary():void { + testTimes.sortOn('duration', Array.NUMERIC | Array.DESCENDING); + var totalTime:Number = 0; + var len:Number = testTimes.length; + for (var i:uint; i < len; i++) { + totalTime += testTimes[i].duration; + } + println("Total Time: " + totalTime + ' ms'); + println(); + } + + private function printPerformanceDetails():void { + if (!displayPerformanceDetails) + return; + + testTimes.sortOn('duration', Array.NUMERIC | Array.DESCENDING); + println('Time Summary:'); + println(); + var len:Number = Math.min(performanceCount, testTimes.length); + var total:Number = 0; + var testTime:Object; + for (var i:Number = 0; i < len; i++) { + testTime = testTimes[i]; + println(testTime.duration + ' ms : ' + cyan(getQualifiedClassName(testTime.test))); + } + } + + public function toString():String { + var parts:Array = []; + parts.push(header); + var len:int = dots.length; + var str:String = ''; + for (var i:int; i < len; i++) { + str += dots[i]; + } + parts.push(str); + + if (runCompleted) { + if (failures.length > 0) { + parts = parts.concat(failures); + } + if (warnings.length > 0) { + parts = parts.concat(warnings); + } + if (ignores.length > 0) { + // Tighten up the ignores line breaks: + parts.push(ignores.join("\n")); + } + parts.push(footer); + } + return parts.join("\n\n") + "\n\n"; + } + } +} + +import flash.system.Capabilities; + +// foreground +// +// 31 red +// 32 green +// 33 yellow +// 34 blue +// 35 purple +// 36 cyan +// 37 gray +// +// background +// +// 40 black +// 41 red +// 42 green +// 43 yellow +// 44 blue +// 45 purple +// 46 cyan +// 47 gray +// +// modifiers +// +// \e[1;{fg};{bg}m bold fg +// \e[4;{fg};{bg}m bold bg +// \e[5;{fg};{bg}m bold fg bg +// +// see http://kpumuk.info/ruby-on-rails/colorizing-console-ruby-script-output/ +internal const ASCII_ESCAPE_CHARACTER:String = String.fromCharCode(27); + +internal const RESET:String = "0"; +internal const RED:String = "31"; +internal const GREEN:String = "32"; +internal const YELLOW:String = "33"; +internal const BLUE:String = "34"; +internal const PURPLE:String = "35"; +internal const CYAN:String = "36"; +internal const colorise:Boolean = (!Capabilities.os.match(/Windows/)); + +internal function color(value:String):String +{ + return colorise ? ASCII_ESCAPE_CHARACTER + "[" + value + "m" : ""; +} + +internal function reset():String +{ + return color(RESET); +} + +internal function red(message:String):String +{ + return color(RED) + message + color(RESET); +} + +internal function green(message:String):String +{ + return color(GREEN) + message + color(RESET); +} + +internal function yellow(message:String):String +{ + return color(YELLOW) + message + color(RESET); +} + +internal function blue(message:String):String +{ + return color(BLUE) + message + color(RESET); +} + +internal function purple(message:String):String +{ + return color(PURPLE) + message + color(RESET); +} + +internal function cyan(message:String):String +{ + return color(CYAN) + message + color(RESET); +} \ No newline at end of file diff --git a/asunit-4.0/test/AllTests.as b/asunit-4.0/test/AllTests.as index 98f0f66..eeb0dbe 100644 --- a/asunit-4.0/test/AllTests.as +++ b/asunit-4.0/test/AllTests.as @@ -26,6 +26,7 @@ package { import asunit.framework.TestIteratorOrderedTestMethodTest; import asunit.framework.TestIteratorSingleMethodTest; import asunit.framework.VisualTestCaseTest; + import asunit.printers.ColorTracePrinterTest; import asunit.printers.TextPrinterTest; import asunit.printers.XMLPrinterTest; import asunit.printers.FlashBuilderPrinterTest; @@ -64,6 +65,7 @@ package { public var asunit_framework_VisualTestCaseTest:asunit.framework.VisualTestCaseTest; public var asunit_printers_TextPrinterTest:asunit.printers.TextPrinterTest; public var asunit_printers_FlashBuilderPrinterTest:asunit.printers.FlashBuilderPrinterTest; + public var asunit_printers_ColorTracePrinterTest:asunit.printers.ColorTracePrinterTest; public var asunit_runners_LegacyRunnerTest:asunit.runners.LegacyRunnerTest; public var asunit_runners_SuiteRunnerTest:asunit.runners.SuiteRunnerTest; public var asunit_runners_TestRunnerAsyncMethodTest:asunit.runners.TestRunnerAsyncMethodTest; diff --git a/asunit-4.0/test/asunit/printers/ColorTracePrinterTest.as b/asunit-4.0/test/asunit/printers/ColorTracePrinterTest.as new file mode 100644 index 0000000..10d3e14 --- /dev/null +++ b/asunit-4.0/test/asunit/printers/ColorTracePrinterTest.as @@ -0,0 +1,121 @@ +package asunit.printers { + + import asunit.framework.ITestFailure; + import asunit.framework.TestCase; + + import asunit.framework.IResult; + import asunit.framework.ITestSuccess; + import asunit.framework.ITestWarning; + import asunit.framework.Result; + import asunit.framework.TestFailure; + import asunit.framework.TestSuccess; + import asunit.framework.TestWarning; + + public class ColorTracePrinterTest extends TestCase { + + private var printer:FakeTextPrinter; + private var test:*; + private var success:ITestSuccess; + private var failure:ITestFailure; + private var testResult:IResult; + + public function ColorTracePrinterTest(method:String=null) { + super(method); + } + + override protected function setUp():void { + super.setUp(); + printer = new FakeTextPrinter(); + + testResult = new Result(); + test = new TestCase(); + failure = new TestFailure(test, 'testSomethingThatFails', new Error('Fake Failure')); + success = new TestSuccess(test, 'testSomethingThatSucceeds'); + testResult.addListener(printer); + } + + override protected function tearDown():void { + super.tearDown(); + failure = null; + printer = null; + testResult = null; + success = null; + test = null; + } + + private function executeASucceedingTest():void { + testResult.onRunStarted(); + testResult.onTestStarted(test); + testResult.onTestSuccess(success); + testResult.onTestCompleted(test); + testResult.onRunCompleted(null); + } + + private function executeASucceedingTestWithWarning(warning:ITestWarning):void { + testResult.onRunStarted(); + testResult.onTestStarted(test); + testResult.onWarning(warning); + testResult.onTestSuccess(success); + testResult.onTestCompleted(test); + testResult.onRunCompleted(null); + } + + private function executeAFailingTest():void { + testResult.onRunStarted(); + testResult.onTestStarted(test); + testResult.onTestFailure(failure); + testResult.onTestCompleted(test); + testResult.onRunCompleted(null); + } + + public function testPrinterOnTestSuccess():void { + executeASucceedingTest(); + var actual:String = printer.toString(); + const GREEN:String = String.fromCharCode(27) + "[32m"; + const RESET:String = String.fromCharCode(27) + "[0m" + + assertTrue("Printer should print OK in green", actual.indexOf( GREEN + 'OK' + RESET ) > -1); + assertTrue("Printer should include Tests run: ", actual.match(/Tests run: 1/)); + } + + public function testPrinterFailure():void { + executeAFailingTest(); + var expected:String = "Fake Failure"; + var actual:String = printer.toString(); + const RED:String = String.fromCharCode(27) + "[31m"; + const RESET:String = String.fromCharCode(27) + "[0m" + + assertTrue("Printer should print FAILURE in red", actual.indexOf(RED + 'FAILURE' + RESET) > -1); + assertTrue("Printer should fail", actual.indexOf(expected) > -1); + assertTrue("Printer should include Test Duration: ", actual.match(/Total Time: \d/)); + } + + public function testPrinterWithNoTests():void { + testResult.onRunStarted(); + testResult.onRunCompleted(null); + assertTrue("Printer should include Warning for no tests", printer.toString().indexOf("[WARNING]") > -1); + } + + public function testDisplaysWarnings():void { + var message:String = "problem" + executeASucceedingTestWithWarning(new TestWarning(message)); + + var actual:String = printer.toString(); + + const YELLOW:String = String.fromCharCode(27) + "[33m"; + const RESET:String = String.fromCharCode(27) + "[0m" + assertTrue("Printer should print Warning in yellow", actual.indexOf(YELLOW + 'Warning' + RESET) > -1); + assertTrue("Printer displays warnings", actual.indexOf(message) > -1); + } + } +} + +import asunit.printers.ColorTracePrinter; + +class FakeTextPrinter extends ColorTracePrinter { + + // Prevent the printer from tracing results: + override protected function logResult():void { + } +} + From 1617436d0b3dcc04e2f3154ba0a737e435472a26 Mon Sep 17 00:00:00 2001 From: drewbourne Date: Fri, 30 Sep 2011 12:33:32 +1000 Subject: [PATCH 52/54] modify TextCore to use ColorTracePrinter --- asunit-4.0/src/asunit/core/TextCore.as | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/asunit-4.0/src/asunit/core/TextCore.as b/asunit-4.0/src/asunit/core/TextCore.as index c5ac4b5..352c357 100644 --- a/asunit-4.0/src/asunit/core/TextCore.as +++ b/asunit-4.0/src/asunit/core/TextCore.as @@ -1,5 +1,6 @@ package asunit.core { + import asunit.printers.ColorTracePrinter; import asunit.printers.TextPrinter; import flash.display.DisplayObjectContainer; @@ -23,7 +24,10 @@ package asunit.core { super.initializeObservers(); textPrinter = new TextPrinter(); + textPrinter.traceOnComplete = false; addListener(textPrinter); + + addListener(new ColorTracePrinter()); } override public function set visualContext(context:DisplayObjectContainer):void { From 84163b3a1351d48c38f9b020a6f4a080ba96240b Mon Sep 17 00:00:00 2001 From: Weyert de Boer Date: Fri, 21 Oct 2011 01:17:28 +0200 Subject: [PATCH 53/54] Fixed problems in the FlexUnitCIPrinter.as class. Now working with more recent flexunit ant task versions. Problem was invalid xml being sent. Like times containing decimals whlie unexpected by the ant task. All tasks get run before the ant task acknowledges it ready for test results. --- .../src/asunit/printers/FlexUnitCIPrinter.as | 436 +++++++++++------- 1 file changed, 270 insertions(+), 166 deletions(-) diff --git a/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as b/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as index 9b0cea7..0d04ea5 100644 --- a/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as +++ b/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as @@ -1,181 +1,285 @@ package asunit.printers { - import asunit.framework.IResult; - import asunit.framework.IRunListener; - import asunit.framework.ITestFailure; - import asunit.framework.ITestSuccess; - import asunit.framework.ITestWarning; - import asunit.framework.Method; - - import flash.events.DataEvent; - import flash.events.Event; - import flash.events.EventDispatcher; - import flash.events.IOErrorEvent; - import flash.events.SecurityErrorEvent; - import flash.events.TimerEvent; - import flash.net.XMLSocket; - import flash.system.fscommand; - import flash.utils.Timer; - import flash.utils.getQualifiedClassName; - import flash.utils.getTimer; - - public class FlexUnitCIPrinter extends EventDispatcher implements IRunListener - { - protected static const DEFAULT_SERVER:String = "127.0.0.1"; - protected static const DEFAULT_PORT:uint = 1024; - - public var port:uint; - public var server:String; //this is local host. same machine - - private static const SUCCESS:String = "success"; - private static const ERROR:String = "error"; - private static const FAILURE:String = "failure"; - private static const IGNORE:String = "ignore"; - - private static const START_OF_TEST_RUN_ACK : String = ""; - private static const END_OF_TEST_ACK : String =""; - private static const END_OF_TEST_RUN : String = ""; - - private var socket:XMLSocket; - private var connectTimeout:Timer; - - protected var messageQueue:Array; - - private var startTime : int; - - public function FlexUnitCIPrinter() - { - this.port = port; - this.server = server; - messageQueue = []; - - socket = new XMLSocket(); - socket.addEventListener(Event.CONNECT, onConnect); - socket.addEventListener(DataEvent.DATA, onData); - socket.addEventListener(IOErrorEvent.IO_ERROR, onErrorEvent); - socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onErrorEvent); - socket.addEventListener(Event.CLOSE, onErrorEvent); - - connectTimeout = new Timer(5000, 1); - connectTimeout.addEventListener(TimerEvent.TIMER_COMPLETE, onConnectTimeout); - connectTimeout.start(); - - connect(); - } - - protected function connect(ip:String = DEFAULT_SERVER, port:uint = DEFAULT_PORT):void { - try { - socket.connect(ip, port); - } - catch (e:Error) { - trace('## Error connecting to socket: ' + e.message); - } - } - - private function onConnectTimeout(event:TimerEvent):void { - throw new Error('Timed out waiting to connect to socket.'); - } - - public function onTestIgnored(method:Method):void { - var xmlMessageIgnore:String = "" - + "" - + ""; - sendMessage(xmlMessageIgnore); - } - - protected static function xmlEscapeMessage(message:String):String { - if (!message) return ''; - - var escape:XML = ; - escape.setChildren( message ); - return escape.children()[0].toXMLString(); - } - - public function onTestFailure(failure:ITestFailure):void { - sendMessage(getFailureMessage(failure)); - } - protected function getFailureMessage(failure:ITestFailure):String { + import asunit.framework.IResult; + import asunit.framework.IRunListener; + import asunit.framework.ITestFailure; + import asunit.framework.ITestSuccess; + import asunit.framework.ITestWarning; + import asunit.framework.Method; + + import flash.events.DataEvent; + import flash.events.Event; + import flash.events.EventDispatcher; + import flash.events.IOErrorEvent; + import flash.events.SecurityErrorEvent; + import flash.events.TimerEvent; + import flash.net.XMLSocket; + import flash.system.fscommand; + import flash.utils.Timer; + import flash.utils.getQualifiedClassName; + import flash.utils.getTimer; + + public class FlexUnitCIPrinter extends EventDispatcher implements IRunListener + { + protected static const DEFAULT_PORT: uint = 1024; + protected static const DEFAULT_SERVER: String = "127.0.0.1"; + private static const SUCCESS: String = "success"; + private static const ERROR: String = "error"; + private static const FAILURE: String = "failure"; + private static const IGNORE: String = "ignore"; + + private var messageQueue: Array = []; + + private var _ready: Boolean = false; + + private static const END_OF_TEST_ACK: String =""; + private static const END_OF_TEST_RUN: String = ""; + private static const START_OF_TEST_RUN_ACK: String = ""; + + private var socket: XMLSocket; + + public var port: uint; + + public var server: String; //this is local host. same machine + + private var timeOut: Timer; + private var lastTestTime: Number = 0; + private var startTime: Number; + + /** + * + */ + public function FlexUnitCIPrinter(port: uint = DEFAULT_PORT, server: String = DEFAULT_SERVER) + { + this.port = port; + this.server = server; + + messageQueue = []; + + socket = new XMLSocket (); + socket.addEventListener( DataEvent.DATA, dataHandler ); + socket.addEventListener( Event.CONNECT, handleConnect ); + socket.addEventListener( IOErrorEvent.IO_ERROR, errorHandler); + socket.addEventListener( SecurityErrorEvent.SECURITY_ERROR,errorHandler); + socket.addEventListener( Event.CLOSE,errorHandler); + + timeOut = new Timer( 2000, 1 ); + timeOut.addEventListener(TimerEvent.TIMER_COMPLETE, declareBroken, false, 0, true ); + timeOut.start(); + + try + { + socket.connect( server, port ); + timeOut.stop(); + } catch (e:Error) { + //This needs to be more than a trace + trace (e.message); + } + } + + /** + * Invoked when the timeout has been met, cancel everything + */ + private function declareBroken( event:TimerEvent ):void { + errorHandler( new Event( "broken") ); + } + + /** + * + */ + protected function sendResults(msg:String):void + { + if(socket.connected) + { + trace("sending message") + socket.send( msg ); + } else { + // queue to message for when we are connected to the server + trace("sendResults(): Queuing message: " + msg); + messageQueue.push(msg); + } + + trace(msg); + } + + /** + * + */ + private function handleConnect(event:Event):void + { + trace("handleConnect()"); + } + + private function sendQueueTestResults(): void + { + trace("sendQueueTestResults()"); + for each ( var message: String in messageQueue ) + { + trace("sendQueueTestResults(): msg=" + message); + sendResults(message); + } + } + + /** + * + */ + private function errorHandler(event:Event):void + { + trace("errorHandler()"); + if ( !ready ) { + //If we are not yet ready and received this, just inform the core so it can move on +// dispatchEvent( new Event( AsyncListenerWatcher.LISTENER_FAILED ) ); + } else { + //If on the other hand we were ready once, then the core is counting on us... so, if something goes + //wrong now, we are likely hung up. For now we are simply going to bail out of this process + exit(); + } + } + + /** + * + */ + private function dataHandler( event : DataEvent ) : void + { + var data : String = event.data; + trace("FlexUnitCIPrinter#dataHandler: " + data); + + // If we received an acknowledgement on startup, the java server is read and we can start sending. + if ( data == START_OF_TEST_RUN_ACK ) { + setStatusReady(); + } else if ( data == END_OF_TEST_ACK ) { + // If we received an acknowledgement finish-up. + // Close the socket. + socket.close(); + exit(); + } + } + + public function get ready():Boolean + { + return _ready; + } + + protected function setStatusReady(): void + { + trace("FlexUnitCIPrinter#setStatusReady()"); + _ready = true; + + clientConnected(); + } + + protected function clientConnected(): void + { + trace("FlexUnitCIPrinter#clientConnected()"); + + // now that we are connectd lets send all the test results which are already available + sendQueueTestResults(); + } + + protected function exit(): void + { + trace("FlexUnitCIPrinter#exit()"); + fscommand("quit"); + } + + /////////// + + public function onRunStarted(): void + { + trace("onRunStarted()"); + } + + public function onTestStarted(test:Object):void + { + trace("onTestStarted()"); + startTime = getTimer(); + lastTestTime = getTimer(); // for the first test being run + } + + public function onTestCompleted(test:Object):void + { + var duration:Number = getTimer() - startTime; + var className: String = getQualifiedClassName(test); + + trace("onTestCompleted(): className=" + className + " duration=" + duration); + } + + public function onTestFailure(failure:ITestFailure):void + { + trace("onTestFailure()"); + sendResults(getFailureMessage(failure)); + lastTestTime = getTimer(); + + } + + private function getFailureMessage(failure:ITestFailure): String + { + var duration:Number = getTimer() - startTime; var status:String = failure.isFailure ? FAILURE : ERROR; -// var stackTrace:String = xmlEscapeMessage(failure.thrownException.getStackTrace()); var stackTrace:String = failure.thrownException.getStackTrace(); var xml:String = "" - + + "' time='" + duration + "' status='" + status + "'>" + + "" + "" + "" - + + ""; return xml; - } - - protected function sendMessage(message:String):void { - if (!socket.connected) { - messageQueue.push(message); - return; - } - socket.send(message); - } - - protected function onConnect(event:Event):void { - connectTimeout.stop(); - sendQueuedMessages(); - } - - protected function sendQueuedMessages():void { - while (messageQueue.length) { - sendMessage(messageQueue.shift()); - } - } - - private function onData( event : DataEvent ) : void - { - if (event.data == END_OF_TEST_ACK) { - exit(); - } - } - - protected function onErrorEvent(event:Event):void { - trace('FlexUnitCIPrinter::onErrorEvent() - event: ' + event); - //throw new Error('FlashBuilderPrinter::onErrorEvent() - event: ' + event); - } - - public function onRunStarted():void { - } - - public function onTestStarted(test:Object):void { - startTime = getTimer(); } - - public function onTestCompleted(test:Object):void { -// testTimes.push({test:test, duration:duration}); - } - - public function onTestSuccess(success:ITestSuccess):void - { - //TODO: move test time into ITestSuccess - var duration:Number = (getTimer() - startTime) / 1000; - var xmlMessageSuccess:String = ""; - sendMessage(xmlMessageSuccess); - } - - public function onRunCompleted(result:IResult):void { - sendMessage(END_OF_TEST_RUN); - } - - protected function exit():void - { - socket.close(); - fscommand("quit"); - } - - public function onWarning(warning:ITestWarning) : void { - } - } -} + + protected static function xmlEscapeMessage(message:String):String { + if (!message) return ''; + + var escape:XML = ; + escape.setChildren( message ); + return escape.children()[0].toXMLString(); + } + + public function onTestSuccess(success:ITestSuccess):void + { + var duration:Number = getTimer() - lastTestTime; + var methodName: String = success.method; + var featureName: String = success.feature; + var className: String = getQualifiedClassName(success.test); + + trace("onTestSuccess(): methodName=" +methodName + " featureName=" + featureName + " className=" + className + " duration=" + duration); + + sendResults(""); + + + lastTestTime = getTimer(); + } + + public function onTestIgnored(method:Method):void + { + trace("onTestIgnored()"); + var duration:Number = getTimer() - lastTestTime; + var methodName: String = method.name; + var className: String = getQualifiedClassName(method.scope); + + var xml:String = + "" + + "" + + ""; + sendResults(xml); + + lastTestTime = getTimer(); + } + + public function onWarning(warning:ITestWarning):void + { + trace("onWarning()"); + } + + public function onRunCompleted(result:IResult):void + { + trace("onRunCompleted()"); + sendResults(END_OF_TEST_RUN); + } + } +} \ No newline at end of file From 7b17a726187ee1524c33cb71b86a057a8e54d485 Mon Sep 17 00:00:00 2001 From: Weyert de Boer Date: Fri, 21 Oct 2011 11:29:38 +0200 Subject: [PATCH 54/54] Applied the changes to the original FlexUnitCIPrinter class --- .../src/asunit/printers/FlexUnitCIPrinter.as | 438 +++++++----------- 1 file changed, 175 insertions(+), 263 deletions(-) diff --git a/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as b/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as index 0d04ea5..463ad6e 100644 --- a/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as +++ b/asunit-4.0/src/asunit/printers/FlexUnitCIPrinter.as @@ -1,285 +1,197 @@ package asunit.printers { - - import asunit.framework.IResult; - import asunit.framework.IRunListener; - import asunit.framework.ITestFailure; - import asunit.framework.ITestSuccess; - import asunit.framework.ITestWarning; - import asunit.framework.Method; - - import flash.events.DataEvent; - import flash.events.Event; - import flash.events.EventDispatcher; - import flash.events.IOErrorEvent; - import flash.events.SecurityErrorEvent; - import flash.events.TimerEvent; - import flash.net.XMLSocket; - import flash.system.fscommand; - import flash.utils.Timer; - import flash.utils.getQualifiedClassName; - import flash.utils.getTimer; - - public class FlexUnitCIPrinter extends EventDispatcher implements IRunListener - { - protected static const DEFAULT_PORT: uint = 1024; - protected static const DEFAULT_SERVER: String = "127.0.0.1"; - private static const SUCCESS: String = "success"; - private static const ERROR: String = "error"; - private static const FAILURE: String = "failure"; - private static const IGNORE: String = "ignore"; - - private var messageQueue: Array = []; - - private var _ready: Boolean = false; - + import asunit.framework.IResult; + import asunit.framework.IRunListener; + import asunit.framework.ITestFailure; + import asunit.framework.ITestSuccess; + import asunit.framework.ITestWarning; + import asunit.framework.Method; + + import flash.events.DataEvent; + import flash.events.Event; + import flash.events.EventDispatcher; + import flash.events.IOErrorEvent; + import flash.events.SecurityErrorEvent; + import flash.events.TimerEvent; + import flash.net.XMLSocket; + import flash.system.fscommand; + import flash.utils.Timer; + import flash.utils.getQualifiedClassName; + import flash.utils.getTimer; + + public class FlexUnitCIPrinter extends EventDispatcher implements IRunListener + { + protected static const DEFAULT_SERVER:String = "127.0.0.1"; + protected static const DEFAULT_PORT:uint = 1024; + + public var port:uint; + public var server:String; //this is local host. same machine + + private static const SUCCESS:String = "success"; + private static const ERROR:String = "error"; + private static const FAILURE:String = "failure"; + private static const IGNORE:String = "ignore"; + private static const END_OF_TEST_ACK: String =""; private static const END_OF_TEST_RUN: String = ""; private static const START_OF_TEST_RUN_ACK: String = ""; + + private var socket:XMLSocket; + private var connectTimeout:Timer; + + protected var messageQueue:Array; + + private var startTime : int; + + public function FlexUnitCIPrinter() + { + this.port = port; + this.server = server; + messageQueue = []; + + socket = new XMLSocket(); + socket.addEventListener(Event.CONNECT, onConnect); + socket.addEventListener(DataEvent.DATA, onData); + socket.addEventListener(IOErrorEvent.IO_ERROR, onErrorEvent); + socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onErrorEvent); + socket.addEventListener(Event.CLOSE, onErrorEvent); + + connectTimeout = new Timer(5000, 1); + connectTimeout.addEventListener(TimerEvent.TIMER_COMPLETE, onConnectTimeout); + connectTimeout.start(); + + connect(); + } + + protected function connect(ip:String = DEFAULT_SERVER, port:uint = DEFAULT_PORT):void { + try { + socket.connect(ip, port); + } + catch (e:Error) { + trace('## Error connecting to socket: ' + e.message); + } + } + + private function onConnectTimeout(event:TimerEvent):void { + throw new Error('Timed out waiting to connect to socket.'); + } + + public function onTestIgnored(method:Method):void { + var xmlMessageIgnore:String = "" + + "" + + ""; + sendMessage(xmlMessageIgnore); + } + + protected static function xmlEscapeMessage(message:String):String { + if (!message) return ''; + + var escape:XML = ; + escape.setChildren( message ); + return escape.children()[0].toXMLString(); + } + + public function onTestFailure(failure:ITestFailure):void { + sendMessage(getFailureMessage(failure)); + } - private var socket: XMLSocket; - - public var port: uint; - - public var server: String; //this is local host. same machine - - private var timeOut: Timer; - private var lastTestTime: Number = 0; - private var startTime: Number; - - /** - * - */ - public function FlexUnitCIPrinter(port: uint = DEFAULT_PORT, server: String = DEFAULT_SERVER) - { - this.port = port; - this.server = server; - - messageQueue = []; - - socket = new XMLSocket (); - socket.addEventListener( DataEvent.DATA, dataHandler ); - socket.addEventListener( Event.CONNECT, handleConnect ); - socket.addEventListener( IOErrorEvent.IO_ERROR, errorHandler); - socket.addEventListener( SecurityErrorEvent.SECURITY_ERROR,errorHandler); - socket.addEventListener( Event.CLOSE,errorHandler); - - timeOut = new Timer( 2000, 1 ); - timeOut.addEventListener(TimerEvent.TIMER_COMPLETE, declareBroken, false, 0, true ); - timeOut.start(); - - try - { - socket.connect( server, port ); - timeOut.stop(); - } catch (e:Error) { - //This needs to be more than a trace - trace (e.message); - } - } - - /** - * Invoked when the timeout has been met, cancel everything - */ - private function declareBroken( event:TimerEvent ):void { - errorHandler( new Event( "broken") ); - } - - /** - * - */ - protected function sendResults(msg:String):void - { - if(socket.connected) - { - trace("sending message") - socket.send( msg ); - } else { - // queue to message for when we are connected to the server - trace("sendResults(): Queuing message: " + msg); - messageQueue.push(msg); - } - - trace(msg); - } - - /** - * - */ - private function handleConnect(event:Event):void - { - trace("handleConnect()"); - } - - private function sendQueueTestResults(): void - { - trace("sendQueueTestResults()"); - for each ( var message: String in messageQueue ) - { - trace("sendQueueTestResults(): msg=" + message); - sendResults(message); - } - } - - /** - * - */ - private function errorHandler(event:Event):void - { - trace("errorHandler()"); - if ( !ready ) { - //If we are not yet ready and received this, just inform the core so it can move on -// dispatchEvent( new Event( AsyncListenerWatcher.LISTENER_FAILED ) ); - } else { - //If on the other hand we were ready once, then the core is counting on us... so, if something goes - //wrong now, we are likely hung up. For now we are simply going to bail out of this process - exit(); - } - } - - /** - * - */ - private function dataHandler( event : DataEvent ) : void - { - var data : String = event.data; - trace("FlexUnitCIPrinter#dataHandler: " + data); - - // If we received an acknowledgement on startup, the java server is read and we can start sending. - if ( data == START_OF_TEST_RUN_ACK ) { - setStatusReady(); - } else if ( data == END_OF_TEST_ACK ) { - // If we received an acknowledgement finish-up. - // Close the socket. - socket.close(); - exit(); - } - } - - public function get ready():Boolean - { - return _ready; - } - - protected function setStatusReady(): void - { - trace("FlexUnitCIPrinter#setStatusReady()"); - _ready = true; - - clientConnected(); - } - - protected function clientConnected(): void - { - trace("FlexUnitCIPrinter#clientConnected()"); - - // now that we are connectd lets send all the test results which are already available - sendQueueTestResults(); - } - - protected function exit(): void - { - trace("FlexUnitCIPrinter#exit()"); - fscommand("quit"); - } - - /////////// - - public function onRunStarted(): void - { - trace("onRunStarted()"); - } - - public function onTestStarted(test:Object):void - { - trace("onTestStarted()"); - startTime = getTimer(); - lastTestTime = getTimer(); // for the first test being run - } - - public function onTestCompleted(test:Object):void - { - var duration:Number = getTimer() - startTime; - var className: String = getQualifiedClassName(test); - - trace("onTestCompleted(): className=" + className + " duration=" + duration); - } - - public function onTestFailure(failure:ITestFailure):void - { - trace("onTestFailure()"); - sendResults(getFailureMessage(failure)); - lastTestTime = getTimer(); - - } - - private function getFailureMessage(failure:ITestFailure): String - { - var duration:Number = getTimer() - startTime; + protected function getFailureMessage(failure:ITestFailure):String { var status:String = failure.isFailure ? FAILURE : ERROR; +// var stackTrace:String = xmlEscapeMessage(failure.thrownException.getStackTrace()); var stackTrace:String = failure.thrownException.getStackTrace(); var xml:String = "" - + + "' time='0' status='" + status + "'>" + + "" + "" + "" - + + ""; return xml; - } - - protected static function xmlEscapeMessage(message:String):String { - if (!message) return ''; - - var escape:XML = ; - escape.setChildren( message ); - return escape.children()[0].toXMLString(); - } - - public function onTestSuccess(success:ITestSuccess):void - { - var duration:Number = getTimer() - lastTestTime; - var methodName: String = success.method; - var featureName: String = success.feature; - var className: String = getQualifiedClassName(success.test); - - trace("onTestSuccess(): methodName=" +methodName + " featureName=" + featureName + " className=" + className + " duration=" + duration); - - sendResults(""); - - - lastTestTime = getTimer(); - } - - public function onTestIgnored(method:Method):void - { - trace("onTestIgnored()"); - var duration:Number = getTimer() - lastTestTime; - var methodName: String = method.name; - var className: String = getQualifiedClassName(method.scope); - - var xml:String = - "" - + "" - + ""; - sendResults(xml); + } + + protected function sendMessage(message:String):void { + if (!socket.connected) { + messageQueue.push(message); + return; + } + + socket.send(message); + trace(message); + } + + protected function onConnect(event:Event):void { + connectTimeout.stop(); + } + + protected function sendQueuedMessages():void { + trace("sendQueuedMessages()"); + while (messageQueue.length) { + sendMessage(messageQueue.shift()); + } + } + + protected function serverReady(): void + { + // now that we are connectd lets send all the test results which are already available + sendQueuedMessages(); + } - lastTestTime = getTimer(); - } + private function onData( event : DataEvent ) : void + { + var data : String = event.data; - public function onWarning(warning:ITestWarning):void - { - trace("onWarning()"); + // If we received an acknowledgement on startup, the java server is read and we can start sending. + if ( data == START_OF_TEST_RUN_ACK ) { + serverReady(); + } else if ( data == END_OF_TEST_ACK ) { + // If we received an acknowledgement finish-up. + // Close the socket. + socket.close(); + exit(); + } + } + + protected function onErrorEvent(event:Event):void { + trace('FlexUnitCIPrinter::onErrorEvent() - event: ' + event); + //throw new Error('FlashBuilderPrinter::onErrorEvent() - event: ' + event); + } + + public function onRunStarted():void { + } + + public function onTestStarted(test:Object):void { + startTime = getTimer(); } - - public function onRunCompleted(result:IResult):void - { - trace("onRunCompleted()"); - sendResults(END_OF_TEST_RUN); + + public function onTestCompleted(test:Object):void { +// testTimes.push({test:test, duration:duration}); } - } + + public function onTestSuccess(success:ITestSuccess):void + { + //TODO: move test time into ITestSuccess + var testTime:Number = (getTimer() - startTime); // flexunit doesn't accept float numbers + var className: String = getQualifiedClassName(success.test); + var methodName: String = success.method; + var xmlMessageSuccess:String = ""; + sendMessage(xmlMessageSuccess); + } + + public function onRunCompleted(result:IResult):void { + sendMessage(END_OF_TEST_RUN); + } + + protected function exit():void + { + fscommand("quit"); + } + + public function onWarning(warning:ITestWarning) : void { + } + } } \ No newline at end of file

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