////////////////////////////////////////////////////////////////////////////////
//
//  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.
//
////////////////////////////////////////////////////////////////////////////////
package
{
 	internal class AutomationTestClasses
	{
		import perfAppTests.FTEGridTestCanvas; FTEGridTestCanvas;
		import perfAppTests.InputManagerTestSprite; InputManagerTestSprite;
		import perfAppTests.TextFlowTestSprite; TextFlowTestSprite;

		import UnitTest.PerformanceTests.FTEGridTests; FTEGridTests;
		import UnitTest.PerformanceTests.InputTests; InputTests;
		import UnitTest.PerformanceTests.TweenTests; TweenTests;
		import UnitTest.PerformanceTests.TextGridTests; TextGridTests;
		import UnitTest.PerformanceTests.VellumAliceScroll; VellumAliceScroll;
		import UnitTest.PerformanceTests.VellumAliceTests; VellumAliceTests;
		import UnitTest.PerformanceTests.VellumParaTests; VellumParaTests;
		import UnitTest.PerformanceTests.VellumWordTests; VellumWordTests;

		import UnitTest.Tests.AccessibilityMethodsTest; AccessibilityMethodsTest;
		import UnitTest.Tests.AllAttributeTest; AllAttributeTest;
		import UnitTest.Tests.AllCharAttributeTest; AllCharAttributeTest;
		import UnitTest.Tests.AllContAttributeTest; AllContAttributeTest;
		import UnitTest.Tests.AllParaAttributeTest; AllParaAttributeTest;
		import UnitTest.Tests.AttributeTest; AttributeTest;
		import UnitTest.Tests.BoundsAndAlignmentTest; BoundsAndAlignmentTest;
		import UnitTest.Tests.BoxTest; BoxTest;
		import UnitTest.Tests.CompositionTest; CompositionTest;
		import UnitTest.Tests.ContainerAttributeTest; ContainerAttributeTest;
		import UnitTest.Tests.ContainerTypeTest; ContainerTypeTest;
		import UnitTest.Tests.CrossContainerTest; CrossContainerTest;
		import UnitTest.Tests.ElementOperationTests; ElementOperationTests;
		import UnitTest.Tests.EventOverrideTest; EventOverrideTest;
		import UnitTest.Tests.FactoryImportTest; FactoryImportTest;
		import UnitTest.Tests.FETest; FETest;
		import UnitTest.Tests.FloatTest; FloatTest;
		import UnitTest.Tests.FlowModelTest; FlowModelTest;
		import UnitTest.Tests.FontEmbedTest; FontEmbedTest;
		import UnitTest.Tests.GeneralFunctionsTest; GeneralFunctionsTest;
		import UnitTest.Tests.HorizontalScrollingTest; HorizontalScrollingTest;
		import UnitTest.Tests.ImportAPITest; ImportAPITest;
		import UnitTest.Tests.ImportTest; ImportTest;
		import UnitTest.Tests.KeyboardGestureTest; KeyboardGestureTest;
		import UnitTest.Tests.LeadingTest; LeadingTest;
		import UnitTest.Tests.LinkTest; LinkTest;
		import UnitTest.Tests.ListTest; ListTest;
		import UnitTest.Tests.LocaleTests; LocaleTests;
		import UnitTest.Tests.MeasurementTest; MeasurementTest;
		import UnitTest.Tests.MeasurementGridTest; MeasurementGridTest;
		import UnitTest.Tests.OperationTest; OperationTest;
		import UnitTest.Tests.ParagraphTest; ParagraphTest;
		import UnitTest.Tests.ScrollingTest; ScrollingTest;
		import UnitTest.Tests.ScrollToRangeTest; ScrollToRangeTest;
		import UnitTest.Tests.SelectionTest; SelectionTest;
		import UnitTest.Tests.SpacingTest; SpacingTest;
		import UnitTest.Tests.StyleTest; StyleTest;
		import UnitTest.Tests.TCYTests; TCYTests;
		import UnitTest.Tests.TextContainerManagerTest; TextContainerManagerTest;
		import UnitTest.Tests.TableBackgroundTest; TableBackgroundTest;		
        import UnitTest.Tests.TableTests; TableTests;
		import UnitTest.Tests.TabTest; TabTest;
		import UnitTest.Tests.TextFlowEditTest; TextFlowEditTest;
		import UnitTest.Tests.VerticalScrollingTest; VerticalScrollingTest;
		import UnitTest.Tests.WritingModeTest; WritingModeTest;
		import UnitTest.Tests.AllEventTest; AllEventTest;
		import UnitTest.Tests.SWFTest; SWFTest;
		import UnitTest.Tests.ImpliedParagraphTest; ImpliedParagraphTest;
		import UnitTest.Tests.TextFlowTextLineFactoryTest; TextFlowTextLineFactoryTest;
		import UnitTest.Tests.TextLineFilterTest; TextLineFilterTest;
		import UnitTest.Tests.UndoRedoTest; UndoRedoTest;
		import UnitTest.Tests.ScrollToRangeTest; ScrollToRangeTest;
	}
}

