<?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="components/LinkBar/Integration/"  xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" testSWF="LinkBar_Basic_spark.mxml">

    <!-- this set of lines form a template that must be in each unit test -->
    <mx:Script>
    <![CDATA[
    public static function init(o:DisplayObject):void
    {

    }

    public function addData(bool:int):void
    {
        application.lb.dataProvider = myDP;
    }

    public function addObjData():void
    {
        application.lb.dataProvider = iconDP;
    }

    public function changeDP(node:int, bool:String):void
    {
        myDP.node[node].@enabled = bool;
    }


    [Bindable]
    public var iconDP:Array= [{label:"Toys", icon:"dinosaur"},{label:"Dinosaur", icon: "dinosaur"}];

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

    <mx:Script>
    <![CDATA[
    import mx.controls.LinkBar;
    import mx.styles.StyleManager;
    import mx.managers.SystemManager;
    import mx.events.ListEvent;

    [Bindable]
    private var myDP:Array=[{label:"Italy", data:"ITALY"},{label:"England", data:"ENGLAND"},{label:"Slovenia", data:"SLOVENIA"}];
    ]]>
    </mx:Script>
    <testCases>
        <TestCase testID="Spark_LinkBar_Keyboard_Navigation" description="LinkBar  Keyboard Navigation test." keywords="[enabled, LinkBar]">
            <setup>
                    <ResetComponent target="lb" className="mx.controls.LinkBar" waitEvent="updateComplete" waitTarget="lb" />
                    <RunCode code="addData(0);" waitEvent="updateComplete" waitTarget="lb"/>
                    <DispatchKeyEvent keys="[TAB, TAB, TAB, TAB, SPACE]"  />
            </setup>
            <body>
                    <AssertPropertyValue target="lb" propertyName="selectedIndex" value="1" />
            </body>
        </TestCase>
        <TestCase testID="Spark_selectedIndex_MXML_Component" description="LinkBar MXML Component" keywords="[selectedIndex, LinkBar]">
            <setup>
                <ResetComponent target="lb2" className="MyLinkBar" waitEvent="updateComplete" waitTarget="lb2" />
                <DispatchKeyEvent keys="[TAB, TAB, TAB, TAB, TAB, TAB, TAB, SPACE]"  />
            </setup>
            <body>
                    <AssertPropertyValue target="lb2" propertyName="selectedIndex" value="1" />
            </body>
        </TestCase>
        <TestCase testID="Spark_selectedIndex_Selection2" description="LinkBar dataProvider item is set to false test." keywords="[enabled, LinkBar]">
            <body>
                <CompareBitmap numColorVariances="10" ignoreMaxColorVariance="true"   target="lb2" url="../Integration/baselines/loadSWF_spark.png" timeout="5000" />
            </body>
        </TestCase>
    </testCases>
</UnitTester>
