////////////////////////////////////////////////////////////////////////////////
//
//  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
{
        import UnitTest.ExtendedClasses.LoadingFileRule;
        import UnitTest.ExtendedClasses.TestConfigurationLoader;
        import UnitTest.ExtendedClasses.VellumTestCase;
        import UnitTest.Fixtures.MeasureConstants;
        import UnitTest.Fixtures.TestCaseVo;
        import UnitTest.Fixtures.TestEditManager;
        import UnitTest.Validation.BoundsChecker;
        import UnitTest.Validation.CompositionCompleteEventValidator;
        import UnitTest.Validation.CompositionResults;
        import UnitTest.Validation.DamageEventValidator;
        import UnitTest.Validation.EventValidator;
        import UnitTest.Validation.FlowElementMouseEventValidator;
        import UnitTest.Validation.FlowOperationEventValidator;
        import UnitTest.Validation.SelectionEventValidator;
        import UnitTest.Validation.StatusChangeEventValidator;
        import UnitTest.Validation.UpdateCompleteEventValidator;

        internal class AutomationCoreClasses
	{
            TestConfigurationLoader;
            VellumTestCase;
            LoadingFileRule;
            BoundsChecker;
            CompositionResults;
            SelectionEventValidator;
            DamageEventValidator;
            StatusChangeEventValidator;
            FlowOperationEventValidator;
            CompositionCompleteEventValidator;
            FlowElementMouseEventValidator;
            EventValidator;
            UpdateCompleteEventValidator;
            TestEditManager;
            MeasureConstants;
            TestCaseVo;
	}
}

