<!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>cordova errgen tester</title>
<script src='../../pkg/cordova.errgen.js'></script>
<script src='./errgen-tests.js'></script>
</head>

<!-- ======================================================================= -->
<body>
<h1>cordova errgen tester</h1>
<div id="results">
</div>
</body>

<!-- ======================================================================= -->
<script>
var resultsDiv = null

function reportSuccess(message) {
    reportMessage(message, 'success')
}

function reportFailure(message) {
    reportMessage(message, 'failure')
}

function reportMessage(message, className) {
    var div = document.createElement('div')
    div.className = className
    div.innerText = message
    
    if (!resultsDiv) {
        resultsDiv = document.getElementById('results')
    }
    
    resultsDiv.appendChild(div)
}
</script>

<!-- ======================================================================= -->
<style>
.success {
    color: green;
}
.failure {
    color: red;
}

</style>

<!-- ======================================================================= -->
</html>