<?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/PopUpButton/Events/"  xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" testSWF="PopUpButton_Basic.mxml">

    <!-- this set of lines form a template that must be in each unit test -->
    <mx:Script>
    <![CDATA[
    import mx.managers.SystemManager;
    import mx.controls.*;
    import mx.containers.*;
    import mx.core.*;
    import flash.events.*;
    use namespace mx_internal;
    private var myMenu:Menu;
    public static function init(o:DisplayObject):void
    {

    }
    private function setDP():void {
	    myMenu = new Menu();
	    var dp:Object = [{label: "New Folder"}, {label: "Sent Items"}, {label: "Inbox"}];        
	    myMenu.dataProvider = dp;
	    application.myPopUpButton.popUp = myMenu;

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

    <testCases>

		<TestCase testID="PopUpButton_events_creationComplete"  keywords="[creationComplete, event, PopUpButton]">
			<setup>
				<ResetComponent target="myPopUpButton" className="mx.controls.PopUpButton" waitEvent="updateComplete" waitTarget="myPopUpButton"/>
				<SetProperty target="myPopUpButton" propertyName="label" value="My PopUpButton." waitEvent="updateComplete" waitTarget="myPopUpButton"/>				
				<RunCode code="setDP()" waitTarget="myPopUpButton" waitEvent="updateComplete"/> 
				<WaitForEffectsToEnd />
			</setup> 
			<body> 
				<AssertPropertyValue target="ti1" propertyName="text" value="PopUpButton Creation Complete fired" />
			</body>
		</TestCase>
		<TestCase testID="PopUpButton_events_initialize"  keywords="[initialize, event, PopUpButton]">
			<setup>
				<ResetComponent target="myPopUpButton" className="mx.controls.PopUpButton" waitEvent="updateComplete" waitTarget="myPopUpButton"/>
				<SetProperty target="myPopUpButton" propertyName="label" value="My PopUpButton." waitEvent="updateComplete" waitTarget="myPopUpButton"/>
				<RunCode code="setDP()" waitTarget="myPopUpButton" waitEvent="updateComplete"/> 
				<WaitForEffectsToEnd />
			</setup> 
			<body> 
				<AssertPropertyValue target="ti2" propertyName="text" value="PopUpButton initialize fired" />
			</body>
		</TestCase>
     </testCases>
</UnitTester>
