<!doctype html>

<!--
# 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.
-->

<html>
<head>
<title>@title@</title>
<script src='../../../lib/require.js'></script>
<script>
@modules@

//----------------------------------------------------------------------------
var outputPre

window.addEventListener("load", onLoad, false)

//----------------------------------------------------------------------------
function onLoad() {
    outputPre = document.getElementById("output")

    if (window.parent !== window) {
        window.parent.testsStarting("@title@")
    }
    
    try {
        require("program")
    }
    catch (e) {
        print ("FAIL exception thrown: " + e)
    }
}

//----------------------------------------------------------------------------
function print(message, status) {

    var className
    
    if      (/^PASS/.exec(message)) className = "pass"
    else if (/^FAIL/.exec(message)) className = "fail"
    else                            className = "info"
    
    var line = "<div class='" + className + "'>" + message + "</div>"
    outputPre.innerHTML += line
    
    if (window.parent !== window) {
        window.parent.oneTestComplete(className, message)
    }
    
}
</script>
</head>
<body>
<p>Tests generated on @date@
<pre id="output"></pre>
</body>
</html>
