<!--

 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.

-->

<!DOCTYPE HTML>
<html>
<head>
  <title>EXTERMINATE!</title>

  <link rel="shortcut icon" type="image/png" href="jasmine/jasmine_favicon.png">

  <link rel="stylesheet" type="text/css" href="jasmine/jasmine.css">
  <script type="text/javascript" src="jasmine/jasmine.js"></script>
  <script type="text/javascript" src="jasmine/jasmine-html.js"></script>

  <script type="text/javascript">
    (function() {
      var jasmineEnv = jasmine.getEnv();
      jasmineEnv.updateInterval = 1000;

      var trivialReporter = new jasmine.TrivialReporter();

      jasmineEnv.addReporter(trivialReporter);

      jasmineEnv.specFilter = function(spec) {
        return trivialReporter.specFilter(spec);
      };

      window.global = window;

      window.cordova = {
         platform: ""
      };

      window.addEventListener("load", function () {
          jasmineEnv.execute();
      });

    })();
  </script>

  <script type="text/javascript" src="cordova.test.js"></script>

  <script type="text/javascript">
      var require = cordova.require;
      var define = cordova.define;
  </script>

	<!-- ##TESTS## -->
	
	<!-- Note: if you want to run individual tests, remove the tests placeholder above and include the individual tests yourself -->
	<!-- <script src="test.accelerometer.js" type="text/javascript" charset="utf-8"></script> -->
</head>

<body>
</body>
</html>
