<?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/ButtonBar/Styles/"  xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" testSWF="ButtonBar_Basic.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.bb.dataProvider = myDP;
    }

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

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

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

    ]]>
    </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.ButtonBar;
    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>

<mx:Style>
    .myButtonStyle
    {
       color:red;
       fontFamily:Georgia;
       fontSize:20;
       fontStyle:italic;
       fontWeight:bold;
       paddingLeft:10;
       paddingRight:10;
       textAlign:left;
       textDecoration:underline;
       textIndent:5;
    }

    .verdanaStyle
    {
       color:red;
       fontFamily:EmbeddedVerdana;
       fontSize:20;
       fontStyle:normal;
       fontWeight:normal;
    }
    .verdanaBoldStyle
    {
       color:red;
       fontFamily:EmbeddedVerdana;
       fontSize:20;
       fontStyle:normal;
       fontWeight:bold;
    }
    .verdanaItalicStyle
    {
       color:red;
       fontFamily:EmbeddedVerdana;
       fontSize:20;
       fontStyle:italic;
       fontWeight:normal;
    }

    .fontSizeCustom {
        fontSize: 14;
     }

     .underLineStyle {
        textDecoration: "underline";
     }
</mx:Style>

    <testCases>

        <TestCase testID="TB_Style_Basic_firstButtonStyleName_multiple" description="ButtonBar Basic styles." keywords="[style, ButtonBar, firstButtonStyleName]">
            <setup>
                <ResetComponent target="bb" className="mx.controls.ButtonBar" />
                <RunCode code="addData(0);"  waitEvent="updateComplete" waitTarget="bb"/>
                <SetStyle target="bb" styleName="firstButtonStyleName"  value="fontSizeCustom underLineStyle" waitEvent="updateComplete" waitTarget="bb"/>
            </setup>
            <body>
                <DispatchKeyEvent key="TAB"  />
                <DispatchKeyEvent key="TAB"  />
                <DispatchKeyEvent key="TAB" waitTarget="bb" waitEvent="focusIn" />
                <AssertStyleValue target="bb" styleName="firstButtonStyleName" value="fontSizeCustom underLineStyle"/>
                <CompareBitmap target="bb.getChildAt(0)" url="../Styles/baselines/firstButtonStyleName_multiple.png"  numColorVariances="4" ignoreMaxColorVariance="true" />
            </body>
        </TestCase>
        
        <TestCase testID="TB_Style_Basic_lastButtonStyleName_multiple" description="ButtonBar Basic styles." keywords="[style, ButtonBar, lastButtonStyleName]">
            <setup>
                <ResetComponent target="bb" className="mx.controls.ButtonBar" />
                <RunCode code="addData(0);"  waitEvent="updateComplete" waitTarget="bb"/>
                <SetStyle target="bb" styleName="lastButtonStyleName"  value="fontSizeCustom underLineStyle" waitEvent="updateComplete" waitTarget="bb"/>
            </setup>
            <body>
                <DispatchKeyEvent key="TAB"  />
                <DispatchKeyEvent key="TAB"  />
                <DispatchKeyEvent key="TAB" waitTarget="bb" waitEvent="focusIn" />
                <AssertStyleValue target="bb" styleName="lastButtonStyleName" value="fontSizeCustom underLineStyle"/>
                <CompareBitmap target="bb.getChildAt(2)" url="../Styles/baselines/lastButtonStyleName_multiple.png"  numColorVariances="4" ignoreMaxColorVariance="true"/>
            </body>
        </TestCase>
	 <TestCase testID="TB_Style_Basic_buttonStyleName_multiple" description="ButtonBar Basic styles." keywords="[style, ButtonBar, buttonStyleName]">
            <setup>
                <ResetComponent target="bb" className="mx.controls.ButtonBar" />
                <RunCode code="addData(0);"  waitEvent="updateComplete" waitTarget="bb"/>
                <SetStyle target="bb" styleName="buttonStyleName"  value="fontSizeCustom underLineStyle" waitEvent="updateComplete" waitTarget="bb"/>
            </setup>
            <body>
                <DispatchKeyEvent key="TAB"  />
                <DispatchKeyEvent key="TAB"  />
                <DispatchKeyEvent key="TAB" waitTarget="bb" waitEvent="focusIn" />
                <AssertStyleValue target="bb" styleName="buttonStyleName" value="fontSizeCustom underLineStyle"/>
                <CompareBitmap target="bb.getChildAt(1)" url="../Styles/baselines/buttonStyleName_multiple.png"  numColorVariances="8" ignoreMaxColorVariance="true" />
            </body>
        </TestCase>

    </testCases>
</UnitTester>
