blob: 32030bc925611db575215a4c1ac13208a5d8c435 [file] [log] [blame]
<?xml version="1.0" encoding="utf-8"?>
<!--
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.
-->
<!--Flow from one frame to another -->
<s:Application
xmlns="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:flexunit="flexunit.flexui.*"
xmlns:local="UnitTest.*"
explicitMinWidth="100"
explicitMinHeight="100"
width="1100"
height="800"
applicationComplete="handleCreationComplete()"
fontFamily="Verdana">
<Script>
<![CDATA[
import mx.collections.ListCollectionView;
include "UnitTest/General_Functions.as";
import UnitTest.Fixtures.FileRepository;
import flashx.textLayout.TextLayoutVersion;
import flashx.textLayout.debug.Debugging;
import flashx.textLayout.edit.EditManager;
import flashx.textLayout.edit.SelectionManager;
import flashx.textLayout.elements.Configuration;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.formats.BlockProgression;
import flashx.textLayout.formats.Direction;
import flashx.textLayout.tlf_internal;
import flexunit.utils.Collection;
import mx.collections.ArrayCollection;
import mx.collections.ListCollectionView;
import mx.collections.Sort;
import mx.collections.SortField;
import mx.collections.XMLListCollection;
import mx.controls.Alert;
import mx.rpc.AsyncResponder;
import mx.utils.LoaderUtil;
use namespace tlf_internal;
import flash.system.System;
import flash.system.Security;
import mx.managers.PopUpManager;
import mx.managers.SystemManager;
import UnitTest.ExtendedClasses.TestDescriptor;
import UnitTest.ExtendedClasses.TestSuiteExtended;
import UnitTest.ExtendedClasses.VellumTestCase;
import UnitTest.Fixtures.TestApp;
import UnitTest.Fixtures.TestConfig;
import UnitTest.TestRunnerWindow;
import UnitTest.TestDescriptorRunner;
import UnitTest.RunTests;
import UnitTest.MenuItemObj;
import UnitTest.Tests.*
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.utils.ByteArray;
import flashx.textLayout.debug.assert;
private var socket:XMLSocket;
private var curDialog:Object;
private var treeData:XMLList;
private var runTestsDialog:RunTests;
private var testCasesList:ArrayCollection;
private var useTestSelectDialog:Boolean = false;
// private var snapshotSaveDialog:SaveSnapshot;
// test control data from testMachine.txt
public var testMachineName:String = "unspecified";
public var testOwner:String = "tcalias";
public var buildType:String = "Private";
public var snapshotsOn:String = "false";
public var normalizedURL:String = ""; // for reading control files
public var generateReport:String = "false";
public var antSkipTestFile:String = "";
public var testStartIndex:Number = 0;
public var testEndIndex:Number = 0;
public var rangeOfTests:Boolean = false;
public var testRunDate:String = "";
public var testPropertiesPath:String = "";
private var doSnapshotData:Object;
private var curTest:VellumTestCase;
private var beforeTestCallback:Function;
private var afterTestCallback:Function;
private var checkMemoryIntervalID:uint = setInterval(checkMemoryUsage,1000);
private var snapshotStack:Array;
private var curURL:String;
private var myLoader:URLLoader = new URLLoader();
private var myXMLURL:URLRequest = new URLRequest();
private var urlReqSnapShotStore:URLRequest = new URLRequest();
private var curSnapshotTypeToStore:String;
private var tryToStoreCount:Number = 0;
private var maxTryToStoreCount:Number = 5;
//Set this option to have the test run do the visual compare before and after a test.
[Bindable]
public var doBeforeAfterCompare:Boolean = false;
[Bindable]
public var currentlyUsedMemory:uint = 0;
public var debugOrRelease:String;
public var vellumDebugOrRelease:String;
public var testXMLStore:Object = null;
public var skipList:Array;
//private var snapshotStack:Array;
[Bindable]
private var canRun:Boolean = true;
// The data from these files is read on creationcomplete and
// placed into the store. The raw XML can be accessed using
// the filename as a property name
// Examples:
// XFLStore.simple
// XFLStore.tableExample
public var XFLFileNameList: Array = [
"simple.xml",
"tableExample.xml",
"asknot.xml",
"empty.xml",
"sampleArabic.xml",
"aliceExcerpt.xml"
];
public var reportXMLResults:Boolean = false;
// this testApp object needs to be used to set
// the static testApp member of VellumTestCase
// before any VellumTestCase constructors are called.
public var testApp:TestApp = new TestApp();
public function checkMemoryUsage():void
{
currentlyUsedMemory = Math.round(System.totalMemory/1000000);
}
/**
* Loads Arial font
*/
private function loadEmbeddedFont(baseURL:String):void
{
var fontLoader:Loader = new Loader();
fontLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleLoadEmbeddedFont);
fontLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, handleLoadEmbeddedFontIOError);
fontLoader.load(new URLRequest(LoaderUtil.createAbsoluteURL(baseURL,"../../test/testFiles/assets/ARIAL_FONT.swf")));
}
private function handleLoadEmbeddedFontIOError(evtObj:IOErrorEvent):void
{
trace("Unable to load Arial Font.");
}
private function handleLoadEmbeddedFont(evtObj:Event):void
{
var arialFont:Class = evtObj.target.applicationDomain.getDefinition("Arial_DF4");
Font.registerFont(arialFont);
var arialFontBlack:Class = evtObj.target.applicationDomain.getDefinition("Arial_Black_DF4");
Font.registerFont(arialFontBlack);
var arialFontNarrow:Class = evtObj.target.applicationDomain.getDefinition("Arial_Narrow_DF4");
Font.registerFont(arialFontNarrow);
var arialFontRoundedMTBold:Class = evtObj.target.applicationDomain.getDefinition("Arial_Rounded_MT_Bold_DF4");
Font.registerFont(arialFontRoundedMTBold);
}
public function onSuiteFileRead(evtObj:Event):void
{
testXMLStore = new Object();
testXMLStore.suiteList = XML(evtObj.target.data);
testXMLStore.suiteIndex = 0;
readTestCaseFiles();
}
/**
* If the testcase counter hasn't reached the end, read another
* testcase XML file. Otherwise load up the tests and start testing
*/
public function readTestCaseFiles():void
{
while (testXMLStore.suiteIndex < testXMLStore.suiteList.children().length())
{
var fileName:String = testXMLStore.suiteList.*[testXMLStore.suiteIndex].@fileName;
if (fileName.length > 0)
{
FileRepository.readFile(normalizedURL, "../../test/" + fileName, onTestCaseFileRead, null, null, true);
break;
}
++testXMLStore.suiteIndex;
}
if (testXMLStore.suiteIndex >= testXMLStore.suiteList.children().length())
{
if (antSkipTestFile != "")
{
FileRepository.readFile(normalizedURL, "../../test/" + antSkipTestFile, readSkipList, loadAndRunTests, loadAndRunTests, true);
}
else
{
loadAndRunTests();
}
}
}
public function readSkipList(evtObj:Event):void
{
var fileContents:String = evtObj.target.data;
var lineSeparator:String;
if (fileContents.search("\r") == -1)
{
lineSeparator = "\n";
}
else
{
lineSeparator = "\r\n";
}
skipList = evtObj.target.data.split(lineSeparator);
loadAndRunTests();
}
private function loadAndRunTests():void
{
// Set up all of the application dependencies that the tests
// use and store them in a static member of VellumTestCase
testApp.getTextFlow = function ():TextFlow {
return SystemManager(loadedSWF.content).application["activeFlow"];
}
testApp.getDisplayObject = function ():DisplayObject {
return SystemManager(loadedSWF.content).application["rootPanel"];
}
testApp.setInteractionManager = SystemManager(loadedSWF.content).application["setInteractionManager"];
testApp.contentChange = SystemManager(loadedSWF.content).application["changeContent"];
testApp.detachActiveFlow = SystemManager(loadedSWF.content).application["detachActiveFlow"];
testApp.changeContainerSetup = SystemManager(loadedSWF.content).application["changeContainerSetup"];
VellumTestCase.testApp = testApp;
SystemManager(loadedSWF.content).application["visiblePanels"] = [];
SystemManager(loadedSWF.content).application["rulerVisible"] = false;
collectTextLayoutVersion();
testRunDate = MakeMySQLDate(new Date());
// ************* This code is for the snapshot application ******************//
// It gathers up the test to create a selectable list of tests to run.
// Set the type of containers on which the tests should be run.
var arContainers:Array = ["sprite"];
var arWritingDirections:Array = [
[BlockProgression.TB,Direction.LTR],
[BlockProgression.TB,Direction.RTL],
[BlockProgression.RL,Direction.LTR] ];
// Create the test suite based on those containers.
var vellumTests:TestSuiteExtended = createSuite(arContainers, arWritingDirections);
if (useTestSelectDialog == true)
{
useTestSelectDialog = false;
var testSuiteTests:Array = vellumTests.getTests();
// Initialize the test case object list.
if (testCasesList == null)
testCasesList = new ArrayCollection();
treeData = createXMLTree(testSuiteTests).children();
if (rangeOfTests)
{
runUnitTests();
rangeOfTests = false;
}
else
{
// Booga - This is this code that brings up the run test dialog.
runTestsDialog = new RunTests();
runTestsDialog.treeData = treeData;
runTestsDialog.closeFunction = closeRunTestDialog;
runTestsDialog.runTestFunction = runUnitTests;
PopUpManager.addPopUp(runTestsDialog,this, true);
PopUpManager.centerPopUp(runTestsDialog);
}
}
else
{
testRunner.reportXML = reportXMLResults;
if (reportXMLResults)
{
// Call the function to make sure the MachineID is in the DB.
// This can be aynchronous, because the test does not depend on it.
doSnapshotData = new Object();
// It needs to put the Machine ID in here from the automation machine.
doSnapshotData.machineID = testMachineName + ":" + TextLayoutVersion.BRANCH;
/*
//var testRunnerJ:JUnitTestRunner = new JUnitTestRunner(this);
testRunner.beforeTest = beforeSnapshotTest;
testRunner.afterTest = afterSnapshotTest;
var minimalSuite:TestSuiteExtended = createMinimalSuite (vellumTests);
testRunner.test = minimalSuite;
testRunner.startTest();*/
}
else
{
// don't think we should ever get here - astearns 8/15/08
testRunner.test = vellumTests;
testRunner.startTest();
}
}
}
private var xmlRoot:XML = null;
private function createXMLTree(testSuiteTests:Array):XML
{
if (xmlRoot)
return xmlRoot;
xmlRoot = <root/>;
var curContainer:XML;
var curTestCase:XML;
var testCaseIndex:int = 0;
var curContainerName:String = null;
var containerCount:int = 0;
var menuCollection:ListCollectionView = createMenuCollection(testSuiteTests);
if (testEndIndex < 0)
testEndIndex = menuCollection.length;
for (var i:int = 0; i < menuCollection.length; i++)
{
// Store the list of tests in a structure so they can be called upon later.
// Need to be stored so they can be executed.
var menuItem:MenuItemObj = MenuItemObj(menuCollection.getItemAt(i));
if (curContainerName != menuItem.testGroupName)
{
curContainer = <Container/>;
curContainer.@["label"] = menuItem.testGroupName;
xmlRoot.appendChild(curContainer);
curContainerName = menuItem.testGroupName;
++containerCount;
}
curTestCase = <TestCase/>;
curTestCase.@["label"] = menuItem.testName;
curTestCase.@["testID"] = testCaseIndex;
testCasesList.addItem(menuItem.testCase);
if (rangeOfTests)
{
curTestCase.@["selected"] = (testCaseIndex >= testStartIndex) && (testCaseIndex <= testEndIndex)
}
else
{
curTestCase.@["selected"] = false;
}
curContainer.appendChild(curTestCase);
testCaseIndex++;
}
return xmlRoot;
}
private function createMenuCollection(testSuiteTests:Array):ArrayCollection
{
// Create and populate the list
var menuCollection:ArrayCollection = new ArrayCollection();
// so far I've flattened the test descriptor list. Seems as arbitrary as expecting one
// level of test suites.
var groupName:String = null; // Force the groupName to be regenerated for the suite
for (var caseIndex:int = 0; caseIndex < testSuiteTests.length; caseIndex++)
{
var testDesc:TestDescriptor = testSuiteTests[caseIndex];
groupName = testDesc.className();
// Store the list of tests in a structure so they can be called upon later.
// Need to be stored so they can be executed.
var menuItem:MenuItemObj = new MenuItemObj();
var strTmp:String = testDesc.testID;
//menuItem.testName = strTmp;
menuItem.testName = strTmp.substr(strTmp.lastIndexOf(":")+1);
menuItem.testGroupName = groupName;
menuItem.testCase = testDesc;
menuItem.writingDirection = testDesc.config.writingDirection;
menuCollection.addItem(menuItem);
}
// Sort the list
/* Create the SortField object for the "data" field in the ArrayCollection object, and make sure we do a numeric sort. */
var dataSortField1:SortField = new SortField();
dataSortField1.name = "testGroupName";
dataSortField1.numeric = false;
var dataSortField2:SortField = new SortField();
dataSortField2.name = "testName";
dataSortField2.numeric = false;
/* Create the Sort object and add the SortField object created earlier to the array of fields to sort on. */
var numericDataSort:Sort = new Sort();
numericDataSort.fields = [dataSortField1, dataSortField2];
/* Set the ArrayCollection object's sort property to our custom sort, and refresh the ArrayCollection. */
menuCollection.sort = numericDataSort;
menuCollection.refresh();
return menuCollection;
}
private function doJUnitRun(runID:int):void
{
doSnapshotData.runID = runID;
var arContainers:Array = ["sprite"];
var arWritingDirections:Array = [
[BlockProgression.TB,Direction.LTR],
[BlockProgression.TB,Direction.RTL],
[BlockProgression.RL,Direction.LTR] ];
// Create the test suite based on those containers.
var vellumTests:TestSuiteExtended = createSuite(arContainers, arWritingDirections);
var minimalSuite:TestSuiteExtended = createMinimalSuite (vellumTests);
testRunner.test = minimalSuite;
testRunner.startTest();
}
/**
* Set properties in testRunner that describe the build
* for use in the XML report.
*/
public function collectTextLayoutVersion():void
{
var buildAndChangelist:String = TextLayoutVersion.BUILD_NUMBER;
testRunner.suiteMetaData.vellumBranch = TextLayoutVersion.BRANCH;
testRunner.suiteMetaData.vellumVersion = TextLayoutVersion.getVersionString(TextLayoutVersion.CURRENT_VERSION);
testRunner.suiteMetaData.vellumBuild = Number(buildAndChangelist.split(" ")[0]);
testRunner.suiteMetaData.vellumChangelistNumber = Number((buildAndChangelist.split("(")[1]).split(")")[0]);
testRunner.suiteMetaData.vellumDescription = vellumDebugOrRelease;
testRunner.suiteMetaData.vellumSDKVersion = "SDK 4.5.0.19786";
testRunner.suiteMetaData.vellumPlayerGlobals = "";
testRunner.suiteMetaData.testMachineName = testMachineName;
testRunner.suiteMetaData.testOwner = testOwner;
testRunner.suiteMetaData.buildType = buildType;
}
/**
* This is the callback function used to run the tests that are selected.
* It is supplied on the initial creation of the dialog.
*/
public function runUnitTests (doBeforeAndAfterTest:Boolean = false, iterations:int = 1):void
{
doBeforeAfterCompare = doBeforeAndAfterTest;
// Close the select test dialog.
PopUpManager.removePopUp(runTestsDialog);
// Determine which items are checked and which are not.
var testsToRun:Array = new Array();
if (treeData.children().length() > 0)
walkTests(treeData, testsToRun);
var ts:TestSuiteExtended = new TestSuiteExtended(this);
var lengthOfTests:int = testsToRun.length;
for (var i:int = 0; i < lengthOfTests; i++)
{
for (var j:int = 0; j < iterations; j++)
ts.addTestDescriptor( testCasesList[testsToRun[i]] );
}
if (rangeOfTests)
{
ts = createMinimalSuite (ts);
}
if (ts.getTests().length > 0)
{
// Add the event listener to listen for put the TestComplete event.
addEventListener("TestComplete",onSuiteDone, false, 0, true);
testRunner.reportXML = reportXMLResults;
testRunner.test = ts;
testRunner.beforeTest = beforeRunTest;
//testRunner.afterTest = afterSnapshotTest;
testRunner.startTest();
}
}
public function beforeRunTest(testCase:VellumTestCase, callBack:Function):void
{
beforeTestCallback = callBack;
testCase.doBeforeAfterCompare = doBeforeAfterCompare;
beforeTestCallback(testCase);
}
/**
* This function walks the test data set from the tree to determine
* what items are selected to be run.
*/
private function walkTests(data:Object, testsToRun:Array):void
{
for each (var f:XML in data)
{
if (f.children().length() > 0)
walkTests(f.children(), testsToRun);
if (f.@selected == true && f.@testID.length() > 0)
testsToRun.push(int(f.@testID));
}
}
/**
* callback function of HandleRunInfo
* **/
private function finishHandleRunInfo(runID:int):void
{
doSnapshotData.runID = runID;
}
private function errorWithMachineID(info:Object, token:Object):void
{
//trace ("could not retrieve machine ID: snapshot tests aborted");
Alert.show(info.toString());
}
private function handleError(info:Object, token:Object):void
{
Alert.show(info.toString());
}
private function ioErrorPutBaseline(evtObj:IOErrorEvent):void
{
// Remove the event listeners to plug up memory leaks.
if (evtObj)
{
evtObj.target.removeEventListener("complete", doSnapShotStoreStack);
evtObj.target.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorPutBaseline);
evtObj.target.removeEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatus);
}
trace ("Error trying to put the baseline.");
/*
if (tryToStoreCount < maxTryToStoreCount)
{
// Put it back on the stack and try again.
snapshotStack.push(curSnapshotTypeToStore);
// Increment the count of the number of tries.
tryToStoreCount ++;
trace ("Attempt #" + tryToStoreCount.toString() + " to store it again.");
}
else if (tryToStoreCount == maxTryToStoreCount)
{
trace("Max Try Count Exceeded - Snapshot failed to be stored. " + evtObj.text)
// Reset the tryToStoreCount for the next run.
tryToStoreCount = 0;
}
else
{
// Reset the tryToStoreCount for the next run.
tryToStoreCount = 0;
}
*/
// Continue doing the snapshots.
doSnapShotStoreStack(null);
}
private function doSnapShotStoreStack(evtObj:Event):void
{
if (evtObj)
{
evtObj.target.removeEventListener("complete", doSnapShotStoreStack);
evtObj.target.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorPutBaseline);
evtObj.target.removeEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatus);
}
var snapshotType:String = snapshotStack.shift();
if (snapshotType != null)
{
//store result after test
}
else
afterTestCallback(curTest);
}
//*********************************************************************/
/**
* This is the callback function used to close the run tests dialog.
* It is supplied on the initial creation of the dialog.
*/
private function closeRunTestDialog():void
{
PopUpManager.removePopUp(runTestsDialog);
canRun = true;
}
/**
* Add testcaseXML to testXMLStore with a property name from the
* suiteXML file, then go to the next entry
*/
public function onTestCaseFileRead(evtObj:Event):void
{
testXMLStore[testXMLStore.suiteList.*[testXMLStore.suiteIndex].@suiteName] = XML(evtObj.target.data);
testXMLStore.suiteIndex++;
readTestCaseFiles();
}
/**
* Add all the tests to the test suite
*/
public function createSuite(arContainers:Array = null, arWritingDirections:Array = null):TestSuiteExtended
{
// In debug builds set extra check flags
CONFIG::debug {
// throw if vellum internal asserts occur
flashx.textLayout.debug.Debugging.tlf_internal::throwOnAssert = true;
// enables TextFlow.debugCheckTextFlow calls - these are scattered through the code
flashx.textLayout.debug.Debugging.tlf_internal::debugCheckTextFlow = true;
}
var ts:TestSuiteExtended = new TestSuiteExtended(this);
var config:TestConfig = new TestConfig();
config.baseURL = normalizedURL;
//config.useEmbeddedFonts = true;
for (var i:int = 0; i < arContainers.length; i++)
{
config.containerType = arContainers[i];
for (var j:int = 0; j < arWritingDirections.length; j++)
{
config.writingDirection = arWritingDirections[j];
// Add tests defined in the classes using suite() or suiteFromXML()
AccessibilityMethodsTest.suite(config, ts);
AllCharAttributeTest.suite(config, ts);
AllContAttributeTest.suite(config, ts);
AllEventTest.suiteFromXML(testXMLStore.AllEventTest, config, ts);
AllParaAttributeTest.suite(config, ts);
AttributeTest.suite(config, ts); //KJT
BoundsAndAlignmentTest.suite(config, ts);
BoxTest.suite(config, ts);
CompositionTest.suite(config, ts);
ContainerAttributeTest.suiteFromXML(testXMLStore.ContainerAttributeTest, config, ts);
ContainerTypeTest.suiteFromXML(testXMLStore.ContainerTypeTest, config, ts);
ElementOperationTests.suite(config, ts);
EventOverrideTest.suiteFromXML(testXMLStore.EventOverrideTest, config, ts);
FactoryImportTest.suiteFromXML(testXMLStore.FactoryImportTest, config, ts);
FETest.suiteFromXML(testXMLStore.FETest, config, ts);
FloatTest.suite(config, ts);
FlowModelTest.suite(config, ts);
GeneralFunctionsTest.suite(config, ts);
HorizontalScrollingTest.suiteFromXML(testXMLStore.HorizontalScrollingTest, config, ts);
ImportAPITest.suite(config, ts);
ImportTest.suiteFromXML(testXMLStore.ImportTest, config, ts);
KeyboardGestureTest.suiteFromXML(testXMLStore.KeyboardGestureTest, config, ts);
LeadingTest.suite(config, ts);
LinkTest.suite(config, ts);
ListTest.suite(config, ts);
LocaleTests.suiteFromXML(testXMLStore.LocaleTests, config, ts);
MeasurementGridTest.suite(config, ts);
MeasurementTest.suiteFromXML(testXMLStore.MeasurementTest, config, ts);
//MXMLCompilationTest.suiteFromXML(testXMLStore.MXMLCompilationTest,config, ts);
OperationTest.suiteFromXML(testXMLStore.OperationTest, config, ts);
ParagraphTest.suiteFromXML(testXMLStore.ParagraphTest, config, ts);
ScrollToRangeTest.suiteFromXML(testXMLStore.ScrollToRangeTest, config, ts);
ScrollingTest.suiteFromXML(testXMLStore.ScrollingTest, config, ts);
SelectionTest.suiteFromXML(testXMLStore.SelectionTest, config, ts);
SpacingTest.suite(config, ts);
StyleTest.suiteFromXML(testXMLStore.StyleTest, config, ts);
SWFTest.suiteFromXML(testXMLStore.SWFTest, config, ts);
ImpliedParagraphTest.suiteFromXML(testXMLStore.ImpliedParagraphTest, config, ts);
UndoRedoTest.suiteFromXML(testXMLStore.UndoRedoTest, config, ts);
TabTest.suiteFromXML(testXMLStore.TabTest, config, ts);
TCYTests.suiteFromXML(testXMLStore.TCYTests, config, ts);
TextContainerManagerTest.suiteFromXML(testXMLStore.TextContainerManagerTest, config, ts);
TextFlowEditTest.suite(config, ts); //HBS
TextFlowTextLineFactoryTest.suiteFromXML(testXMLStore.TextFlowTextLineFactoryTest, config, ts);
TextLineFilterTest.suiteFromXML(testXMLStore.TextLineFilterTest, config, ts);
//VerticalScrollingTest.suiteFromXML(testXMLStore.VerticalScrollingTest, config, ts);
WritingModeTest.suiteFromXML(testXMLStore.WritingModeTest, config, ts);
}
}
// Add the event listener to listen for the TestComplete event.
addEventListener("TestComplete",onSuiteDone, false, 0, true);
return ts;
}
/**
* Read through a test suite and return a new suite of tests
* that have the minimal flag set and are not in the skip list.
*/
public function createMinimalSuite (fullSuite:TestSuiteExtended):TestSuiteExtended
{
// the way we iterate through tests here and in readTestCaseFiles
// assumes we have only one level of nesting of test suites,
// which may not always be true.
var minimalSuite:TestSuiteExtended = new TestSuiteExtended(this);
var suiteList:Array = fullSuite.getTests();
for (var i1:int = 0; i1 < suiteList.length; i1++)
{
if (suiteList[i1].minimal)
{
if (skipList)
{
if (skipList.indexOf(suiteList[i1].testID) == -1)
{
minimalSuite.addTestDescriptor(suiteList[i1]);
}
}
else
{
minimalSuite.addTestDescriptor(suiteList[i1]);
}
}
}
return minimalSuite;
}
/**
* The machine name is stored in a file named testMachine.txt
* This is updated from the init task in the ant build. Once
* we've retrieved the machine name we generate a file read
* error to determine where VellumUnit is being run from
*/
public function readMachineName(event:Event):void
{
var fileContents:String = FileRepository.getFile(normalizedURL, "../../test/testMachine.txt");
if (fileContents)
{
var namePattern:RegExp = /testMachineName=(.*)/;
if (fileContents.match(namePattern))
{
var nameLine:String = fileContents.match(namePattern)[0];
testMachineName = nameLine.replace (namePattern, "$1");
}
var typePattern:RegExp = /buildType=(.*)/;
if (fileContents.match(typePattern))
{
var typeLine:String = fileContents.match(typePattern)[0];
buildType = typeLine.replace (typePattern, "$1");
}
var ownerPattern:RegExp = /testOwner=(.*)/;
if (fileContents.match(ownerPattern))
{
var ownerLine:String = fileContents.match(ownerPattern)[0];
testOwner = ownerLine.replace (ownerPattern, "$1");
}
var snapPattern:RegExp = /snapshots=(.*)/;
if (fileContents.match(snapPattern))
{
var snapLine:String = fileContents.match(snapPattern)[0];
snapshotsOn = snapLine.replace (snapPattern, "$1");
}
var genPattern:RegExp = /generateReport=(.*)/;
if (fileContents.match(genPattern))
{
var genLine:String = fileContents.match(genPattern)[0];
generateReport = genLine.replace (genPattern, "$1");
}
var skipFilePattern:RegExp = /antSkipTestFile=(.*)/;
if (fileContents.match(skipFilePattern))
{
var skipLine:String = fileContents.match(skipFilePattern)[0];
antSkipTestFile = skipLine.replace (skipFilePattern, "$1");
}
var startPattern:RegExp = /startTest=(.*)/;
if (fileContents.match(startPattern))
{
var startLine:String = fileContents.match(startPattern)[0];
testStartIndex = Number(startLine.replace (startPattern, "$1"));
}
var endPattern:RegExp = /endTest=(.*)/;
if (fileContents.match(endPattern))
{
var endLine:String = fileContents.match(endPattern)[0];
testEndIndex = Number(endLine.replace (endPattern, "$1"));
}
rangeOfTests = (testStartIndex != 0) && (testEndIndex !=0);
/* var filePrefixPattern:RegExp = /testOwner=(.*)/;
if (fileContents.match(filePrefixPattern))
{
var filePrefixLine:String = fileContents.match(filePrefixPattern)[0];
filePrefix = filePrefixLine.replace (filePrefixPattern, "$1");
} */
}
readTestPropertiesFromProject();
}
public function readTestPropertiesFromProject(event:Event = null):void
{
testPropertiesPath = "../../build/test.properties";
FileRepository.readFile(normalizedURL, testPropertiesPath, getTestProperties, readTestPropertiesFromDist);
}
public function readTestPropertiesFromDist(event:Event = null):void
{
testPropertiesPath = "../../../../../../build/test.properties";
FileRepository.readFile(normalizedURL, testPropertiesPath, getTestProperties, turnOffSnapshots);
}
public function turnOffSnapshots(event:Event = null):void
{
snapshotsOn = "false";
chooseTestRunner();
}
public function getTestProperties(event:Event = null):void
{
var testPropContents:String = FileRepository.getFile(normalizedURL, testPropertiesPath);
if (testPropContents)
{
}
chooseTestRunner();
}
/**
* Use JUnit runner if it has been specified in testMachine.txt
*/
public function chooseTestRunner(evtObj:IOErrorEvent = null):void
{
canRun = true;
// if it was specified in testMachine.txt, run the tests with Junit
if (generateReport == "true")
{
reportXMLResults = true;
// If we haven't read in all the tests, do that first. onSuiteFileRead will also call loadAndRunTests().
// Else tests have already been read in, we just need to run them.
if (testXMLStore == null)
FileRepository.readFile(normalizedURL, "../../test/testSuites.xml", onSuiteFileRead, onSuiteFileReadError, onSuiteFileSecurityError, true);
else
loadAndRunTests();
}
if (rangeOfTests)
{
callLater(startRangeTests);
}
}
public function securityHandler(evtObj:SecurityErrorEvent):void
{
trace("ERROR",evtObj.toString());
}
/**
* If we've read in a test index range from testMachine.txt, then go
* right to running that range of tests
*/
private function startRangeTests():void
{
useTestSelectDialog = true; // we select the range in the XML for this dialog
if (testXMLStore == null)
FileRepository.readFile(normalizedURL, "../../test/testSuites.xml", onSuiteFileRead, onSuiteFileReadError, onSuiteFileSecurityError, true);
else
loadAndRunTests();
}
private function onSuiteDone(evtObj:Event):void
{
if (evtObj)
{
evtObj.target.removeEventListener("complete", onSuiteDone);
}
// Remove the Event Listener because it has fired.
this.removeEventListener("TestComplete",onSuiteDone);
canRun = true;
if (rangeOfTests) testRunner.sendResults();
if (reportXMLResults)
{
myLoader.load(new URLRequest("CoverageManagerExit.swf"));
myLoader.addEventListener(Event.COMPLETE, onLoad_Coverage);
myLoader.addEventListener(IOErrorEvent.IO_ERROR, onLoad_Flow);
}
}
private function onLoad_Flow(ev:IOErrorEvent):void
{
myLoader.removeEventListener(IOErrorEvent.IO_ERROR, onLoad_Flow);
}
private function onLoad_Coverage(ev:Event):void
{
loadedSWF.load("CoverageManagerExit.swf");
}
private function onRunTest():void
{
/*
* In the VellumPerformance tests a timer had to be added after the
* FileRepository.readFile method in order to provide time necessary for loading.
* This has yet to be a problem in VellumUnit, but may be in the future.
* Refer to the VellumPerformance.mxml.
*/
canRun = false;
useTestSelectDialog = true;
reportXMLResults = false;
if (testXMLStore == null)
FileRepository.readFile(normalizedURL, "../../test/testSuites.xml", onSuiteFileRead, onSuiteFileReadError, onSuiteFileSecurityError);
else
loadAndRunTests();
}
private function onRunAllTests():void
{
/*
* In the VellumPerformance tests a timer had to be added after the
* FileRepository.readFile method in order to provide time necessary for loading.
* This has yet to be a problem in VellumUnit, but may be in the future.
* Refer to the VellumPerformance.mxml.
*/
useTestSelectDialog = true;
reportXMLResults = false;
testStartIndex = 0;
testEndIndex = -1;
rangeOfTests = true;
if (testXMLStore == null)
FileRepository.readFile(normalizedURL, "../../test/testSuites.xml", onSuiteFileRead, onSuiteFileReadError, onSuiteFileSecurityError);
else
loadAndRunTests();
}
private function onSuiteFileReadError(o:Object):void
{
trace(o.toString());
}
private function onSuiteFileSecurityError(o:Object):void
{
trace(o.toString());
}
private function onCloseTestWindow():void
{
PopUpManager.removePopUp(TestRunnerWindow(curDialog));
curDialog = null;
}
private function createXMLElement(xmlDoc:XMLDocument, nodeName:String, nodeValue:String):XMLNode
{
var tmpNode:XMLNode = xmlDoc.createElement(nodeName);
var tmpNodeText:XMLNode = xmlDoc.createTextNode(nodeValue);
tmpNode.appendChild(tmpNodeText);
return (tmpNode);
}
private function setDebugOrRelease():void
{
var e:Error = new Error();
var s:String = e.getStackTrace();
debugOrRelease=s;
try
{
var i:int = s.indexOf("setDebugOrRelease");
if (s.charAt(i + 19) == '[')
{
debugOrRelease = "Debug Player";
}
else
{
debugOrRelease = "Release Player";
}
}
catch (err:Error)
{
debugOrRelease = "Release Player";
}
if (Configuration.tlf_internal::debugCodeEnabled)
{ vellumDebugOrRelease = "Debug"; }
else { vellumDebugOrRelease = "Release"; }
}
//*********************************************************
public function handleCreationComplete(): void
{
setDebugOrRelease();
normalizedURL = LoaderUtil.normalizeURL(loaderInfo);
// if we're in the AIR runtime, we get app:/VellumUnit.swf instead of
// a file:/// URL. This checks for that and changes it to file:///
if (normalizedURL.charAt(0) == "a")
{
var c:Class = Class(ApplicationDomain.currentDomain.getDefinition("flash.filesystem.File"));
normalizedURL = new c(new c(normalizedURL)["nativePath"])["url"];
}
//Security.loadPolicyFile("http://flashqa.macromedia.com/crossdomain.xml");
for (var i:int = 0; i < XFLFileNameList.length; ++i)
FileRepository.readFile(normalizedURL, "../../test/testFiles/markup/tlf/" + XFLFileNameList[i]);
// We're going to look for the machine.txt, to fill out default machine name.
// If we don't find it, go ahead and start the test runner.
FileRepository.readFile(normalizedURL, "../../test/testMachine.txt", readMachineName, readTestPropertiesFromProject, securityHandler, true);
// Load Arial Font SWF to Embed it in the application.
loadEmbeddedFont(normalizedURL);
}
]]>
</Script>
<mx:VBox height="100%" width="100%">
<mx:HBox>
<mx:Button label="Run Tests" id="cmdRunTests" click="onRunTest()" enabled="{canRun}"/>
<mx:Button label="Run Minimal Tests" id="cmdRunAllTests" click="onRunAllTests()" enabled="{canRun}"/>
<!-- <mx:Button label="Run Selected Tests" id="cmdRunSelectedTests" click="onRunTest()" enabled="{canRun}"/> -->
<mx:Label text="memory usage:"/>
<mx:Text text="{currentlyUsedMemory}" width="71" height="20"/>
</mx:HBox>
<local:TestDescriptorRunner id="testRunner" height = "30%" width="100%"/>
<mx:SWFLoader id = "loadedSWF" source="../../testApps/bin/Flow.swf" height="536" width="1100"/>
</mx:VBox>
</s:Application>