blob: e29c0b18a69a6e61f0002302a709e97bf47b6985 [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.events.*;
import mx.utils.*;
[Event(name="valueExpression", type="RunCodeEvent")]
public class ConditionalValue extends EventDispatcher
{
// Asserts such as AssertPropertyValue use value=...
public var value:Object = null;
// CompareBitmap uses url=...
public var url:String = null;
/**
* These are possibilities for the environment.
* Use Inspectable so that test authoring is a little easier.
* For details: https://zerowing.corp.adobe.com/display/flexmobile/Multiple+Device%2C+DPI%2C+OS+Support
**/
[Inspectable(enumeration="win,mac,android,iphone,ios,qnx")]
public var os:String = null;
[Inspectable(enumeration="android22,android23,android234,android31,iphone421,iphone50,ios4,ios5,ios6")]
public var osVersion:String = null;
/**
* The targetOS is either null or set in the UnitTester's cv as the value to match
* against the os properties from <ConditionalValue> elements present in the test
* cases. See MultiResult.chooseCV()
*/
[Inspectable(enumeration="android,ios")]
public var targetOS:String = null;
// General, "marketing number" pixel density
[Inspectable(enumeration="120,160,240,320,480,640")]
public var deviceDensity:Number = -1;
// Exact pixel density reported by AIR's Capabilities.screenDPI
public var screenDPI:Number = -1;
// Exact
public var deviceWidth:Number = -1;
// Exact
public var deviceHeight:Number = -1;
[Inspectable(enumeration="16,32")]
public var color:Number = -1;
[Inspectable(enumeration="air,desire,droid,droid2,droidPro,droidX,evo,incredible,iPad,iPad2,iPodTouch3GS,iPodTouch4G,nexusOne,playbook,xoom")]
public var device:String = null;
/**
* These are used to make file name legible to humans and allow
* parsing of them.
**/
public static const SCREENDPI_SUFFIX:String = "scrDPI";
public static const DENSITY_SUFFIX:String = "ppi";
public static const WIDTH_SUFFIX:String = "w";
public static const HEIGHT_SUFFIX:String = "h";
public static const COLOR_SUFFIX:String = "bit";
public static const PNG_SUFFIX:String = ".png";
public static const DELIMITER1:String = "@"; // between testID and settings
public static const DELIMITER2:String = "_"; // between settings
/**
* Constructor
**/
public function ConditionalValue(){}
/**
* Returns true if all items are at default values (e.g. the default, catch-all CV).
**/
public function isDefault():Boolean{
return ((os == null) &&
(osVersion == null) &&
(screenDPI == -1) &&
(deviceDensity == -1) &&
(deviceWidth == -1) &&
(deviceHeight == -1) &&
(color == -1) &&
(device == null) &&
(targetOS == null)
);
}
/**
* Uses the properties which are set to create a file name for a baseline image.
**/
public function createFilename(testID:String):String{
var ret:String = null;
var consistent:Boolean = false;
var testCV:ConditionalValue = new ConditionalValue();
ret = testID + DELIMITER1;
if( os != null ) {
ret += os + DELIMITER2;
}
/* if( targetOS != null ) {
ret += targetOS + DELIMITER2;
}*/
if( osVersion != null ){
ret += osVersion + DELIMITER2;
}
if( screenDPI > -1 ){
ret += screenDPI.toString() + SCREENDPI_SUFFIX + DELIMITER2;
}
if( deviceDensity > -1 ){
ret += deviceDensity.toString() + DENSITY_SUFFIX + DELIMITER2;
}
if( deviceWidth > -1 ){
ret += deviceWidth.toString() + WIDTH_SUFFIX + DELIMITER2;
}
if( deviceHeight > -1 ){
ret += deviceHeight.toString() + HEIGHT_SUFFIX + DELIMITER2;
}
if( color > -1 ){
ret += color.toString() + COLOR_SUFFIX + DELIMITER2;
}
if( device != null ){
ret += device;
}else{
// Remove last DELIMITER2.
if( ret.lastIndexOf(DELIMITER2) == ret.length - 1 ){
ret = ret.substr(0, ret.length - 1);
}
}
ret += PNG_SUFFIX;
trace("ConditionalValue ret="+ret+"; screenDPI="+screenDPI+"; density="+deviceDensity);
// Be sure we'll be able to parse what we wrote when we read it later.
if( testCV.parseFilename( ret ) ){
consistent = (testCV.os == os &&
testCV.osVersion == osVersion &&
testCV.screenDPI == screenDPI &&
testCV.deviceDensity == deviceDensity &&
testCV.deviceWidth == deviceWidth &&
testCV.deviceHeight == deviceHeight &&
testCV.color == color &&
testCV.device == device );
}
if( consistent ){
return ret;
}else{
trace("ConditionalValue inconsistency:");
trace("\twhat\ttestCV\tactualCV");
trace("\tos\t" + testCV.os + "\t" + os);
trace("\tosVersion\t" + testCV.osVersion + "\t" + osVersion);
trace("\tscreenDPI\t" + testCV.screenDPI + "\t" + screenDPI);
trace("\tdeviceDensity\t" + testCV.deviceDensity + "\t" + deviceDensity);
trace("\tdeviceWidth\t" + testCV.deviceWidth + "\t" + deviceWidth);
trace("\tdeviceHeight\t" + testCV.deviceHeight + "\t" + deviceHeight);
trace("\tcolor\t" + testCV.color + "\t" + color);
trace("\tdevice\t" + testCV.device + "\t" + device);
return null;
}
}
/**
* Populate values from a filename.
**/
public function parseFilename(filename:String):Boolean{
var tokens:Array = null;
var curToken:String = null;
var tokenDone:Boolean = false;
var i:int = 0;
var j:int = 0;
if( filename != null ){
// Remove the extension.
if( filename.indexOf( PNG_SUFFIX ) > -1 ){
filename = filename.substring( 0, filename.indexOf( PNG_SUFFIX ) );
}
if( (filename != null) && (StringUtil.trim( filename ) != "") ){
tokens = filename.split( DELIMITER1 );
}
// tokens[0] is the test case, and tokens[1] is the data.
tokens = tokens[1].split( DELIMITER2 );
if( (tokens != null) && (tokens.length > 0) ){
for( i = 0; i < tokens.length; ++i ){
curToken = tokens[ i ];
tokenDone = false;
// Look for os.
for( j = 0; j < DeviceNames.OS_VALUES.length; ++j ){
if( curToken == DeviceNames.OS_VALUES[ j ] ){
os = curToken;
targetOS = curToken;
tokenDone = true;
break;
}
}
if( !tokenDone ){
// Look for os version.
for( j = 0; j < DeviceNames.OS_VERSION_VALUES.length; ++j ){
if( curToken == DeviceNames.OS_VERSION_VALUES[ j ] ){
osVersion = curToken;
tokenDone = true;
break;
}
}
}
if( !tokenDone ){
// Look for screenDPI
if( curToken.indexOf( SCREENDPI_SUFFIX ) > -1 ){
curToken = curToken.substring( 0, curToken.indexOf( SCREENDPI_SUFFIX ) );
if( (curToken != null) && (StringUtil.trim( curToken ) != "") ){
screenDPI = new Number( curToken );
tokenDone = true;
}
}
}
if( !tokenDone ){
// Look for density.
if( curToken.indexOf( DENSITY_SUFFIX ) > -1 ){
curToken = curToken.substring( 0, curToken.indexOf( DENSITY_SUFFIX ) );
if( (curToken != null) && (StringUtil.trim( curToken ) != "") ){
deviceDensity = new Number( curToken );
tokenDone = true;
}
}
}
if( !tokenDone ){
// Look for width.
if( curToken.indexOf( WIDTH_SUFFIX ) > -1 ){
curToken = curToken.substring( 0, curToken.indexOf( WIDTH_SUFFIX ) );
if( (curToken != null) && (StringUtil.trim( curToken ) != "") ){
deviceWidth = new Number( curToken );
tokenDone = true;
}
}
}
if( !tokenDone ){
// Look for height.
if( curToken.indexOf( HEIGHT_SUFFIX ) > -1 ){
curToken = curToken.substring( 0, curToken.indexOf( HEIGHT_SUFFIX ) );
if( (curToken != null) && (StringUtil.trim( curToken ) != "") ){
deviceHeight = new Number( curToken );
tokenDone = true;
}
}
}
if( !tokenDone ){
// Look for color.
if( curToken.indexOf( COLOR_SUFFIX ) > -1 ){
curToken = curToken.substring( 0, curToken.indexOf( COLOR_SUFFIX ) );
if( (curToken != null) && (StringUtil.trim( curToken ) != "") ){
color = new Number( curToken );
tokenDone = true;
}
}
}
if( !tokenDone ){
// Look for device.
for( j = 0; j < DeviceNames.DEVICE_VALUES.length; ++j ){
if( curToken == DeviceNames.DEVICE_VALUES[ j ] ){
device = curToken;
tokenDone = true;
break;
}
}
}
if( !tokenDone ){
trace("trouble with token: " + curToken);
}
}
}
}
// If anything went wrong, tokenDone will be false.
return tokenDone;
}
/**
* Return a list of the properties.
**/
override public function toString():String{
var ret:String;
ret = "\tvalue=" + String(value);
ret += "\n\turl=" + url;
ret += "\n\tos=" + os;
ret += "\n\ttargetOS=" + targetOS;
ret += "\n\tosVersion=" + osVersion;
ret += "\n\tscreenDPI=" + screenDPI;
ret += "\n\tdeviceDensity=" + deviceDensity;
ret += "\n\tdeviceWidth=" + deviceWidth;
ret += "\n\tdeviceHeight=" + deviceHeight;
ret += "\n\tcolor=" + color;
ret += "\n\tdevice=" + device;
return ret;
}
}
}