<?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.

-->
<UnitTester testDir="SkinningImprovements/Styles/"  xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" testSWF="SkinImprovements_Tabnavigator_tabOffset.mxml">

	<!-- this set of lines form a template that must be in each unit test -->
	<mx:Script>
	<![CDATA[
	import mx.managers.SystemManager;

	public static function init(o:DisplayObject):void
	{

	}
	public function setTabOffset():void{
		application.componentTabnavigatortabOffset.myTabN.setStyle("tabOffset", 0);
	}
	public function setTabOffset1():void{
		application.componentTabnavigatortabOffset.myTabN.setStyle("tabOffset", 200);
	}

	]]>
	</mx:Script>
	<mx:Metadata>
	<![CDATA[
		[Mixin]
	]]>
	</mx:Metadata>
	<!-- end of set of lines that must be in each unit test -->

	<testCases>
		<TestCase testID="Test_TabNavigator_Offset" description="Skinning Improvements phase I being validated." keywords="[SkinImprovement, TabNavigator, tabOffset]">
			<setup>
				<ResetComponent target="componentTabnavigatortabOffset" className="component_Tabnavigator_tabOffset" waitEvent="updateComplete"/>
				
				<Pause timeout="100" />
				
			</setup>
			<body>
			    	<CompareBitmap target="" url="../Styles/Baselines/TabNavigator_tabOffset.png" />
			</body>
		</TestCase>
		<TestCase testID="Test_TabNavigator_Offset1" description="Skinning Improvements phase I being validated." keywords="[SkinImprovement, TabNavigator, tabOffset]">
			<setup>
				<ResetComponent target="componentTabnavigatortabOffset" className="component_Tabnavigator_tabOffset" waitEvent="updateComplete"/>
				
				<RunCode code="setTabOffset()" timeout="2000" waitTarget="componentTabnavigatortabOffset.myTabN" waitEvent="updateComplete" />
			 
				<Pause timeout="100" />
			</setup>
			<body>
			    	<CompareBitmap target="" url="../Styles/Baselines/TabNavigator_tabOffset1.png" />
			</body>
		</TestCase>
		<TestCase testID="Test_TabNavigator_Offset2" description="Skinning Improvements phase I being validated." keywords="[SkinImprovement, TabNavigator, tabOffset]">
			<setup>
				<ResetComponent target="componentTabnavigatortabOffset" className="component_Tabnavigator_tabOffset" waitEvent="updateComplete"/>
				
				<RunCode code="setTabOffset1()" timeout="2000" waitTarget="componentTabnavigatortabOffset.myTabN" waitEvent="updateComplete" />

				<Pause timeout="100" />
			</setup>
			<body>
			    	<CompareBitmap target="" url="../Styles/Baselines/TabNavigator_tabOffset2.png" />
			</body>
		</TestCase>
	</testCases>
</UnitTester>
