<?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/VideoDisplay/Methods/"  xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" testSWF="VideoMain.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
        {
        }                   
        ]]>
        </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.ComboBox;
        import mx.controls.DateField;
        import mx.styles.StyleManager;
        import mx.managers.SystemManager;
         
        public function scriptFunction(a:String, b:int):String
        {
            return a + ":" + b.toString();
        }
        
        public var styleDecl:Object;
        public var styleObj:Object;
    
        ]]>
        </mx:Script>
    <testCases>
        <TestCase testID="myTest_methods_controls" keywords="[VideoDisplay, methods, play, pause, stop]">
            <setup>
                <ResetComponent target="vd" className="mx.controls::VideoDisplay" />
                <SetProperty target="vd" propertyName="source" value="assets/video.flv" waitEvent="ready" waitTarget="vd" />
            </setup>
            <body>
                <AssertPropertyValue target="vd" propertyName="state" value="playing" />
                <RunCode code="application.vd.pause();" waitEvent="stateChange" waitTarget="vd" />
                <AssertPropertyValue target="vd" propertyName="state" value="paused" />
                <RunCode code="application.vd.play()" waitEvent="stateChange" waitTarget="vd" />
                <AssertPropertyValue target="vd" propertyName="state" value="playing" />
                <RunCode code="application.vd.stop()" waitEvent="stateChange" waitTarget="vd" />
                <AssertPropertyValue target="vd" propertyName="state" value="rewinding" />
            </body>
        </TestCase>

        <TestCase testID="myTest_methods_controls_airOnly" keywords="[VideoDisplay, methods, play, pause, stop]">
            <setup>
                <ResetComponent target="vd" className="mx.controls::VideoDisplay" />
                <SetProperty target="vd" propertyName="source" value="assets/video.flv" waitEvent="ready" waitTarget="vd" />
            </setup>
            <body>
            	<AssertPropertyValue target="vd" propertyName="state" value="buffering" />
				<AssertEvent target="vd" eventName="stateChange" eventClass="mx.events::VideoEvent" numExpectedEvents="-1" />
				<AssertPropertyValue target="vd" propertyName="state" value="playing" />
                <RunCode code="application.vd.pause();" waitEvent="stateChange" waitTarget="vd" />
                <AssertPropertyValue target="vd" propertyName="state" value="paused" />
                <RunCode code="application.vd.play()" waitEvent="stateChange" waitTarget="vd" />
                <AssertPropertyValue target="vd" propertyName="state" value="playing" />
                <RunCode code="application.vd.stop()" waitEvent="stateChange" waitTarget="vd" />
                <WaitForEffectsToEnd />
                <AssertPropertyValue target="vd" propertyName="state" value="rewinding" />
            </body>
        </TestCase>

	<!-- FIXME: video loads and runs to the end, but complete event does not seem to be dispatched.
        <TestCase testID="myTest_methods_load" keywords="[VideoDisplay, methods, load]">
            <setup>
                <ResetComponent target="vd" className="mx.controls::VideoDisplay" />
                <SetProperty target="vd" propertyName="width" value="350"/>
                <SetProperty target="vd" propertyName="height" value="250"/>
                <SetProperty target="vd" propertyName="source" value="assets/video.flv" waitEvent="updateComplete" waitTarget="vd" />
            </setup>
            <body>
                <RunCode code="application.vd.stop();"/>
                <SetProperty target="vd" propertyName="autoPlay" value="false"/>
                <SetProperty target="vd" propertyName="source" value="assets/caltrain.flv" />
                <RunCode code="application.vd.load()" waitEvent="ready" waitTarget="vd" />
                <RunCode code="application.vd.play()"/>  
                <AssertEvent target="vd" eventName="complete" eventClass="mx.events::VideoEvent"/> 
            </body>
        </TestCase> -->
    </testCases>
</UnitTester>

