<?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="mx/effects/AnimateProperty/Methods/"  
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns="*" 
    testSWF="../SWFs/AnimateProperty_Main.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.effects.AnimateProperty;
        ]]>
    </mx:Script>

    <testCases>

        <!-- Construtor - Move -->
        <TestCase testID="AnimateProperty_Constructor_Empty"  keywords="[AnimateProperty, method, constructor]" description="Try to initialize the constructor with an empty arg.">
            <body>
                <RunCode code="application.testEffect = new AnimateProperty();"/>
            </body>
        </TestCase>

        <TestCase testID="AnimateProperty_Constructor_Null"  keywords="[AnimateProperty, method, constructor]" description="Try to initialize the constructor with the null arg.">
            <body>
                <RunCode code="application.testEffect = new AnimateProperty(null);"/>
            </body>
        </TestCase>

        <TestCase testID="AnimateProperty_Constructor_Object"  keywords="[AnimateProperty, method, constructor]" description="Try to initialize the constructor with an object.">
            <body>
                <RunCode code="application.testEffect = new AnimateProperty(new Object());" />
            </body>
        </TestCase>

        <!-- Move.getAffectedProperties -->
        <TestCase testID="AnimateProperty_GetAffectedProperties"  keywords="[AnimateProperty, method, GetAffectedProperties]" description="Test the return values from GetAffectedProperties.">
            <setup>
                <ResetComponent target="testEffect" className="mx.effects.AnimateProperty"/>
                <SetProperty target="testEffect" propertyName="property" value="height"/>
            </setup>
            <body>
                <AssertMethodValue method="value=application.testEffect.getAffectedProperties()" value="height" />
            </body>
        </TestCase>

    </testCases>

</UnitTester>
