You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by jo...@apache.org on 2019/09/25 20:36:13 UTC

[royale-asjs] branch develop updated: RoyaleUnit: added Async.requireEvent() and Async.failOnEvent()

This is an automated email from the ASF dual-hosted git repository.

joshtynjala pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new a22ca2f  RoyaleUnit: added Async.requireEvent() and Async.failOnEvent()
a22ca2f is described below

commit a22ca2f40c537b7a85720322b4b09bf4cf07e434
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Wed Sep 25 13:35:56 2019 -0700

    RoyaleUnit: added Async.requireEvent() and Async.failOnEvent()
---
 .../royale/org/apache/royale/test/async/Async.as   |  74 +++++++++++
 .../RoyaleUnit/src/test/royale/tests/AsyncTests.as | 136 +++++++++++++++++++++
 2 files changed, 210 insertions(+)

diff --git a/frameworks/projects/RoyaleUnit/src/main/royale/org/apache/royale/test/async/Async.as b/frameworks/projects/RoyaleUnit/src/main/royale/org/apache/royale/test/async/Async.as
index 206d330..fe97961 100644
--- a/frameworks/projects/RoyaleUnit/src/main/royale/org/apache/royale/test/async/Async.as
+++ b/frameworks/projects/RoyaleUnit/src/main/royale/org/apache/royale/test/async/Async.as
@@ -18,11 +18,18 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.test.async
 {
+	import org.apache.royale.events.Event;
+	import org.apache.royale.events.EventDispatcher;
+	import org.apache.royale.test.Assert;
+
 	/**
 	 * Helper functions for tests marked with <code>[Test(async)]</code> metadata.
 	 */
 	public class Async
 	{
+		/**
+		 * Calls a function after a delay, measured in milliseconds.
+		 */
 		public static function delayCall(testCase:Object, delayedFunction:Function, delayMS:int):void
 		{
 			var handler:IAsyncHandler = AsyncLocator.getAsyncHandlerForTest(testCase);
@@ -31,5 +38,72 @@ package org.apache.royale.test.async
 				delayedFunction();
 			}, delayMS);
 		}
+		
+		/**
+		 * If an event is not dispatched within the specified delay (measured in
+		 * milliseconds), the test will fail.
+		 */
+		public static function requireEvent(testCase:Object, dispatcher:EventDispatcher, eventName:String, timeout:int):void
+		{
+			handleEvent(testCase, dispatcher, eventName, null, timeout);
+		}
+		
+		/**
+		 * Similar to <code>requireEvent()</code>, requires an event to be
+		 * dispatched for the test to pass, but the arguments are also passed to
+		 * a custom event handler that may perform additional checks.
+		 */
+		public static function handleEvent(testCase:Object, dispatcher:EventDispatcher, eventName:String, eventHandler:Function, timeout:int):void
+		{
+			var eventDispatched:Boolean = false;
+			function handleDispatch(...rest:Array):void
+			{
+				eventDispatched = true;
+				if(eventHandler != null)
+				{
+					eventHandler.apply(null, rest);
+				}
+			}
+			dispatcher.addEventListener(eventName, handleDispatch);
+			var handler:IAsyncHandler = AsyncLocator.getAsyncHandlerForTest(testCase);
+			handler.asyncHandler(function():void
+			{
+				dispatcher.removeEventListener(eventName, handleDispatch);
+				if(!eventDispatched)
+				{
+					Assert.fail("Timeout occurred before expected event: " + eventName);
+				}
+			}, timeout);
+		}
+		
+		/**
+		 * If an event is dispatched within the specified delay, the test case
+		 * will fail.
+		 */
+		public static function failOnEvent(testCase:Object, dispatcher:EventDispatcher, eventName:String, timeout:int):void
+		{
+			var savedEvent:Event = null;
+			var eventDispatched:Boolean = false;
+			function handleDispatch(event:Event, ...rest:Array):void
+			{
+				savedEvent = event;
+				eventDispatched = true;
+			}
+			dispatcher.addEventListener(eventName, handleDispatch);
+			var handler:IAsyncHandler = AsyncLocator.getAsyncHandlerForTest(testCase);
+			handler.asyncHandler(function():void
+			{
+				dispatcher.removeEventListener(eventName, handleDispatch);
+				if(eventDispatched)
+				{
+					var message:String = "Unexpected event " + eventName + "dispatched";
+					if(savedEvent != null)
+					{
+						message += " " + String(savedEvent);
+					}
+					Assert.fail(message);
+				}
+			}, timeout);
+		}
 	}
 }
\ No newline at end of file
diff --git a/frameworks/projects/RoyaleUnit/src/test/royale/tests/AsyncTests.as b/frameworks/projects/RoyaleUnit/src/test/royale/tests/AsyncTests.as
index 3d817c7..68d2a34 100644
--- a/frameworks/projects/RoyaleUnit/src/test/royale/tests/AsyncTests.as
+++ b/frameworks/projects/RoyaleUnit/src/test/royale/tests/AsyncTests.as
@@ -73,6 +73,7 @@ package tests
 				Assert.assertStrictlyEquals(listener.failureCount, 0);
 				Assert.assertStrictlyEquals(listener.ignoreCount, 0);
 				Assert.assertNull(listener.active);
+				Assert.assertTrue(listener.result.successful);
 			}, 400);
 		}
 
@@ -90,6 +91,7 @@ package tests
 			Assert.assertStrictlyEquals(listener.failureCount, 1);
 			Assert.assertStrictlyEquals(listener.ignoreCount, 0);
 			Assert.assertNull(listener.active);
+			Assert.assertFalse(listener.result.successful);
 		}
 
 		[Test(async)]
@@ -108,6 +110,87 @@ package tests
 				Assert.assertStrictlyEquals(listener.failureCount, 1);
 				Assert.assertStrictlyEquals(listener.ignoreCount, 0);
 				Assert.assertNull(listener.active);
+				Assert.assertFalse(listener.result.successful);
+			}, 400);
+		}
+
+		[Test(async)]
+		public function testAsyncTestFinishesWithFailOnEventAndNoDispatch():void
+		{
+			var notifier:RunNotifier = new RunNotifier();
+			var listener:AsyncListener = new AsyncListener();
+			notifier.addListener(listener);
+			_runner = new MetadataRunner(AsyncFailOnEventWithoutDispatchFixture);
+			_runner.run(notifier);
+			Async.delayCall(this, function():void
+			{
+				Assert.assertTrue(listener.runStarted);
+				Assert.assertTrue(listener.runFinished);
+				Assert.assertStrictlyEquals(listener.finishedCount, 1);
+				Assert.assertStrictlyEquals(listener.failureCount, 0);
+				Assert.assertStrictlyEquals(listener.ignoreCount, 0);
+				Assert.assertNull(listener.active);
+				Assert.assertTrue(listener.result.successful);
+			}, 400);
+		}
+
+		[Test(async)]
+		public function testAsyncTestFailsWithFailOnEventAndDispatch():void
+		{
+			var notifier:RunNotifier = new RunNotifier();
+			var listener:AsyncListener = new AsyncListener();
+			notifier.addListener(listener);
+			_runner = new MetadataRunner(AsyncFailOnEventWithDispatchFixture);
+			_runner.run(notifier);
+			Async.delayCall(this, function():void
+			{
+				Assert.assertTrue(listener.runStarted);
+				Assert.assertTrue(listener.runFinished);
+				Assert.assertStrictlyEquals(listener.finishedCount, 1);
+				Assert.assertStrictlyEquals(listener.failureCount, 1);
+				Assert.assertStrictlyEquals(listener.ignoreCount, 0);
+				Assert.assertNull(listener.active);
+				Assert.assertFalse(listener.result.successful);
+			}, 400);
+		}
+
+		[Test(async)]
+		public function testAsyncTestFinishesWithRequireEventAndDispatch():void
+		{
+			var notifier:RunNotifier = new RunNotifier();
+			var listener:AsyncListener = new AsyncListener();
+			notifier.addListener(listener);
+			_runner = new MetadataRunner(AsyncRequireEventWithDispatchFixture);
+			_runner.run(notifier);
+			Async.delayCall(this, function():void
+			{
+				Assert.assertTrue(listener.runStarted);
+				Assert.assertTrue(listener.runFinished);
+				Assert.assertStrictlyEquals(listener.finishedCount, 1);
+				Assert.assertStrictlyEquals(listener.failureCount, 0);
+				Assert.assertStrictlyEquals(listener.ignoreCount, 0);
+				Assert.assertNull(listener.active);
+				Assert.assertTrue(listener.result.successful);
+			}, 400);
+		}
+
+		[Test(async)]
+		public function testAsyncTestFailsWithRequireEventAndNoDispatch():void
+		{
+			var notifier:RunNotifier = new RunNotifier();
+			var listener:AsyncListener = new AsyncListener();
+			notifier.addListener(listener);
+			_runner = new MetadataRunner(AsyncRequireEventWithoutDispatchFixture);
+			_runner.run(notifier);
+			Async.delayCall(this, function():void
+			{
+				Assert.assertTrue(listener.runStarted);
+				Assert.assertTrue(listener.runFinished);
+				Assert.assertStrictlyEquals(listener.finishedCount, 1);
+				Assert.assertStrictlyEquals(listener.failureCount, 1);
+				Assert.assertStrictlyEquals(listener.ignoreCount, 0);
+				Assert.assertNull(listener.active);
+				Assert.assertFalse(listener.result.successful);
 			}, 400);
 		}
 	}
@@ -118,6 +201,8 @@ import org.apache.royale.test.runners.notification.Failure;
 import org.apache.royale.test.runners.notification.Result;
 import org.apache.royale.test.Assert;
 import org.apache.royale.test.async.Async;
+import org.apache.royale.events.EventDispatcher;
+import org.apache.royale.events.Event;
 
 class AsyncFixture
 {
@@ -153,6 +238,55 @@ class AsyncFailWithDelayCallFixture
 	}
 }
 
+class AsyncFailOnEventWithoutDispatchFixture
+{
+	[Test(async,timeout="200")]
+	public function test1():void
+	{
+		var dispatcher:EventDispatcher = new EventDispatcher();
+		Async.failOnEvent(this, dispatcher, Event.CHANGE, 100);
+	}
+}
+
+class AsyncFailOnEventWithDispatchFixture
+{
+	[Test(async,timeout="300")]
+	public function test1():void
+	{
+		var dispatcher:EventDispatcher = new EventDispatcher();
+		Async.failOnEvent(this, dispatcher, Event.CHANGE, 200);
+		Async.delayCall(this, function():void
+		{
+			dispatcher.dispatchEvent(new Event(Event.CHANGE));
+			Assert.fail();
+		}, 100);
+	}
+}
+
+class AsyncRequireEventWithDispatchFixture
+{
+	[Test(async,timeout="300")]
+	public function test1():void
+	{
+		var dispatcher:EventDispatcher = new EventDispatcher();
+		Async.requireEvent(this, dispatcher, Event.CHANGE, 200);
+		Async.delayCall(this, function():void
+		{
+			dispatcher.dispatchEvent(new Event(Event.CHANGE));
+		}, 100);
+	}
+}
+
+class AsyncRequireEventWithoutDispatchFixture
+{
+	[Test(async,timeout="200")]
+	public function test1():void
+	{
+		var dispatcher:EventDispatcher = new EventDispatcher();
+		Async.requireEvent(this, dispatcher, Event.CHANGE, 100);
+	}
+}
+
 class AsyncListener implements IRunListener
 {
 	public var runStarted:Boolean = false;
@@ -161,6 +295,7 @@ class AsyncListener implements IRunListener
 	public var finishedCount:int = 0;
 	public var failureCount:int = 0;
 	public var ignoreCount:int = 0;
+	public var result:Result = null;
 
 	public function testStarted(description:String):void
 	{
@@ -190,6 +325,7 @@ class AsyncListener implements IRunListener
 
 	public function testRunFinished(result:Result):void
 	{
+		this.result = result;
 		runFinished = true;
 	}
 }
\ No newline at end of file