<?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.
-->
<@APPLICATION_PREFIX@:@APPLICATION_CLASS@ 
@NAMESPACES@ 
creationComplete="runTests();">
    
    <@MXML_PREFIX@:Script>
        <![CDATA[
            import org.apache.royale.test.listeners.@CI_LISTENER_CLASS@;
            import org.apache.royale.test.RoyaleUnitCore;
            
@IMPORT_REFS@
            
            public function runTests() : void {
                var core : RoyaleUnitCore = new RoyaleUnitCore();
                core.addListener(new @CI_LISTENER_CLASS@());
                core.runClasses(
[@CLASS_REFS@]
                );
            }
        ]]>
    </@MXML_PREFIX@:Script>
</@APPLICATION_PREFIX@:@APPLICATION_CLASS@>
