<!--

 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="stylesheet" type="text/css" href="jasmine/jasmine.css">
  <script type="text/javascript" src="jasmine-1.3.1.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.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>
