blob: 7e7fcd894e65af3604bac9d44ea5e62a4ad5756e [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package {
import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
import flash.utils.getTimer;
import mx.utils.ObjectUtil;
/**
* The base class for all Asserts that the test
* has succeeded or not.
* All asserts should be derived from this class because
* the timing of the wait events is different than that for
* other TestSteps. See AssertPropertyValue for an example.
*
* Asserts don't execute their steps until after the
* waitEvent has been received (if there is one) whereas
* non-Asserts execute their steps and then wait for the
* waitEvent.
*/
public class Assert extends TestStep
{
// list of properties we don't examine in determining equivalence
private static var excludeList:Array = [
"stage",
"systemManager",
"parent",
"owner",
"target",
"currentTarget"
];
/**
* Called by the test case in case you need to set up before execute()
*/
public function preview(root:DisplayObject, context:UnitTester, testCase:TestCase, testResult:TestResult):void
{
this.root = root;
this.context = context;
this.testCase = testCase;
this.testResult = testResult;
if (waitEvent)
{
if (waitTarget == null)
waitTarget = target;
var actualTarget:Object = context.stringToObject(waitTarget);
// it is ok for us to not have an actualTarget during preview
// someone may be waiting for the object to be created.
if (actualTarget)
actualTarget.addEventListener(waitEvent, eventListener);
}
}
/**
* All subclasses should override this method
*/
override public function execute(root:DisplayObject, context:UnitTester, testCase:TestCase, testResult:TestResult):Boolean
{
this.root = root;
this.context = context;
this.testCase = testCase;
this.testResult = testResult;
if (waitEvent)
{
if (waitTarget == null)
waitTarget = target;
var actualTarget:IEventDispatcher = context.stringToObject(waitTarget) as IEventDispatcher;
if (!actualTarget)
{
testResult.doFail("waitTarget " + waitTarget + " not found");
return true;
}
actualTarget.removeEventListener(waitEvent, eventListener);
if (numEvents == 0)
{
actualTarget.addEventListener(waitEvent, waitEventHandler);
testCase.setExpirationTime(getTimer() + timeout);
return false;
}
}
doStep();
return true;
}
/**
* Storage for numEvents
*/
private var numEvents:int = 0;
/**
* The name of the object to test.
*/
public var target:String;
/**
* The method that gets called back when the event we're waiting on fires
*/
override protected function waitEventHandler(event:Event):void
{
doStep();
super.waitEventHandler(event);
}
/**
* The event listener
*/
private function eventListener(event:Event):void
{
testCase.setExpirationTime(0);
numEvents++;
}
/**
* Called by the test case in case you need to clean up after execute()
*/
public function cleanup():void
{
}
/**
* convert everything to strings (like null)
*/
protected function valueToString(value:*):String
{
if (value == null)
return "null";
var s:String;
if (value is Number)
{
if ((value is int) || (value is uint))
s = value.toString();
else
s = value.toFixed(6);
}
else
s = value.toString();
if (s == "[object Object]")
s = ObjectUtil.toString(value, null, excludeList);
return s;
}
protected function contains(value:*, expectedError:ErrorArray):Boolean {
if (expectedError && expectedError.parts && expectedError.parts.length)
for (var i:uint = 0; i < expectedError.parts.length; i++) {
if (valueToString(value).indexOf(valueToString(expectedError.parts[i])) == -1)
return false;
}
return true;
}
}
}