<?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="spark/collections/Sort/MXDataGrid/" 
			xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" testSWF="SF_ORIG_DataGridApp.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.collections.ArrayCollection;
    ]]>
    </mx:Script>

<!--
    Notes:
    - This is where we put all test cases related to sorting (except a couple 
      basic ones in datagrid_properties.mxml, which should get moved here).
-->

    <testCases>
        

        <TestCase testID="sortableColumns_alphaSort" keywords="[DataGrid,properties,sort]">
            <setup>
                <ResetComponent target="dg1" className="mx.controls.DataGrid" waitEvent="updateComplete" />
                <RunCode code="application.showOnlyTheseDataGrids([application.dg1])" />
                <RunCode code="application.setDataProvider(application.dg1, 7)" />
                <RunCode code="application.dg1.addEventListener('headerRelease', application.sortTestFunction)" />
                <SetProperty target="dg1" propertyName="width" value="600" />
                <SetProperty target="dg1" propertyName="height" value="400" waitEvent="updateComplete" />
            </setup>
            <body>
                <DispatchMouseClickEvent target="dg1.mx_internal:dataGridHeader.mx_internal:rendererArray.0" localX="10" localY="10" waitTarget="dg1" waitEvent="updateComplete" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.1.0" propertyName="text" value="3" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.2.0" propertyName="text" value="2" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.3.0" propertyName="text" value="10" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.4.0" propertyName="text" value="1" />
            </body>
        </TestCase>

        <TestCase testID="sortableColumns_numericSort" keywords="[DataGrid,properties,sort]">
            <setup>
                <ResetComponent target="dg1" className="mx.controls.DataGrid" waitEvent="updateComplete" />
                <RunCode code="application.showOnlyTheseDataGrids([application.dg1])" />
                <RunCode code="application.setDataProvider(application.dg1, 7)" />
                <RunCode code="application.dg1.addEventListener('headerRelease', application.sortTestFunction)" />
                <SetProperty target="dg1" propertyName="width" value="600" />
                <SetProperty target="dg1" propertyName="height" value="400" waitEvent="updateComplete" />
            </setup>
            <body>
                <DispatchMouseClickEvent target="dg1.mx_internal:dataGridHeader.mx_internal:rendererArray.3" localX="10" localY="10" waitTarget="dg1" waitEvent="updateComplete" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.1.3" propertyName="text" value="10" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.2.3" propertyName="text" value="3" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.3.3" propertyName="text" value="2" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.4.3" propertyName="text" value="1" />
            </body>
        </TestCase>

        <TestCase testID="sortableColumns_introspectAlphaSort" keywords="[DataGrid,properties,sort]">
            <setup>
                <ResetComponent target="dg1" className="mx.controls.DataGrid" waitEvent="updateComplete" />
                <RunCode code="application.showOnlyTheseDataGrids([application.dg1])" />
                <RunCode code="application.setDataProvider(application.dg1, 7)" />
                <RunCode code="application.dg1.addEventListener('headerRelease', application.sortTestFunction)" />
                <SetProperty target="dg1" propertyName="width" value="600" />
                <SetProperty target="dg1" propertyName="height" value="400" waitEvent="updateComplete" />
            </setup>
            <body>
                <DispatchMouseClickEvent target="dg1.mx_internal:dataGridHeader.mx_internal:rendererArray.1" localX="10" localY="10" waitTarget="dg1" waitEvent="updateComplete" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.1.1" propertyName="text" value="a" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.2.1" propertyName="text" value="2" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.3.1" propertyName="text" value="10" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.4.1" propertyName="text" value="1" />
            </body>
        </TestCase>

        <TestCase testID="sortableColumns_introspectNumericSort" keywords="[DataGrid,properties,sort]">
            <setup>
                <ResetComponent target="dg1" className="mx.controls.DataGrid" waitEvent="updateComplete" />
                <RunCode code="application.showOnlyTheseDataGrids([application.dg1])" />
                <RunCode code="application.setDataProvider(application.dg1, 7)" />
                <RunCode code="application.dg1.addEventListener('headerRelease', application.sortTestFunction)" />
                <SetProperty target="dg1" propertyName="width" value="600" />
                <SetProperty target="dg1" propertyName="height" value="400" waitEvent="updateComplete" />
            </setup>
            <body>
                <DispatchMouseClickEvent target="dg1.mx_internal:dataGridHeader.mx_internal:rendererArray.2" localX="10" localY="10" waitTarget="dg1" waitEvent="updateComplete" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.1.2" propertyName="text" value="a" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.2.2" propertyName="text" value="10" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.3.2" propertyName="text" value="2" />
                <AssertPropertyValue target="dg1.mx_internal:rendererArray.4.2" propertyName="text" value="1" />
            </body>
        </TestCase>

    </testCases>
</UnitTester>
