//////////////////////////////////////////////////////////////////////////////// // // 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.*; import mx.core.FlexGlobals; import mx.core.mx_internal; use namespace mx_internal; [DefaultProperty("conditionalValues")] public class MultiResult { private var conditionalValues:Vector.; public function MultiResult(){ } /** * Loop through the conditional values and process the ones which apply to our configuration. * Functionally, it should work like this: * 1) Any number of mismatches will case a CV to be ignored. * 2) Empty CVs will be ignored. * 3) Among device matches, pick the best. * 4) If no match yet, among the remaining, pick the one with the most matches. * 5) If no match yet, the TestStep's is used. * * Called by determineResult() and CompareBitmap's execute(). **/ public function chooseCV(conditionalValues:Vector.):ConditionalValue{ var i:int; var cv:ConditionalValue; //var cvToUse:ConditionalValue = null; var cvUT:ConditionalValue = UnitTester.cv; var bestDeviceMatch:ConditionalValue = null; var bestNonDeviceMatch:ConditionalValue = null; var bestDeviceMatchCount:int = 0; // # matches for the best match, among device matches var bestNonDeviceMatchCount:int = 0; // # matches for the best match var numMatches:int = 0; // When running mobile on desktop, set some items in UnitTester's CV later if( cvUT.deviceWidth == -1 ){ cvUT.deviceWidth = FlexGlobals.topLevelApplication.width; } if( cvUT.deviceHeight == -1 ){ cvUT.deviceHeight = FlexGlobals.topLevelApplication.height; } //trace("MultiResult.chooseCV(): Actual test environment is: \n" + cvUT.toString()); for(i = 0; i < conditionalValues.length; ++i){ cv = conditionalValues[ i ]; // This is an empty one; ignore it. if( cv.isDefault() ){ continue; } numMatches = countMatches( cv, cvUT ); if( numMatches <= 0 ) // -1 is a mismatch, and 0 is no matches. continue; if( cv.device && cvUT.device && (cv.device == cvUT.device) ){ if( numMatches > bestDeviceMatchCount ){ bestDeviceMatchCount = numMatches; bestDeviceMatch = cv; } }else{ if( numMatches > bestNonDeviceMatchCount ){ bestNonDeviceMatchCount = numMatches; bestNonDeviceMatch = cv; } } } /** if( bestDeviceMatch != null ) trace("MultiResult.chooseCV(): bestDeviceMatch:\n" + bestDeviceMatch.toString()); else trace("MultiResult.chooseCV(): bestDeviceMatch: null"); if( bestNonDeviceMatch != null ) trace("MultiResult.chooseCV(): bestNonDeviceMatch:\n" + bestNonDeviceMatch.toString()); else trace("MultiResult.chooseCV(): bestNonDeviceMatch: null"); **/ if( bestDeviceMatch != null ) return bestDeviceMatch; else if( bestNonDeviceMatch != null ) return bestNonDeviceMatch; else return null; } /** * Count the matches between two CVs. * If a value is unset in either, it's not a match or a mismatch. * Returns 0 if no matches. * Returns -1 immediately if a mismatch occurs. **/ private function countMatches( cv1:ConditionalValue, cv2:ConditionalValue ):int{ var ret:int = 0; if( (cv1.os != null) && (cv2.os != null) ){ if( cv1.os != cv2.os ) return -1; else ++ret; } if( (cv1.osVersion != null) && (cv2.osVersion != null) ){ if( cv1.osVersion != cv2.osVersion ) return -1; else ++ret; } if( (cv1.screenDPI > -1) && (cv2.screenDPI > -1) ){ if( cv1.screenDPI != cv2.screenDPI ) return -1; else ++ret; } if( (cv1.deviceDensity > -1) && (cv2.deviceDensity > -1) ){ if( cv1.deviceDensity != cv2.deviceDensity ) return -1; else ++ret; } if( (cv1.deviceWidth > -1) && (cv2.deviceWidth > -1) ){ if( cv1.deviceWidth != cv2.deviceWidth ) return -1; else ++ret; } if( (cv1.deviceHeight > -1) && (cv2.deviceHeight > -1) ){ if( cv1.deviceHeight != cv2.deviceHeight ) return -1; else ++ret; } if( (cv1.color > -1) && (cv2.color > -1) ){ if( cv1.color != cv2.color ) return -1; else ++ret; } if( (cv1.device != null) && (cv2.device != null) ){ if( cv1.device != cv2.device ) return -1; else ++ret; } return ret; } } }