<!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: API Specs</title>

  <meta name="viewport" content="width=device-width, height=device-height, user-scalable=yes, initial-scale=1.0;" />

  <!-- Load jasmine -->
  <link href="../jasmine.css" rel="stylesheet"/>
  <script type="text/javascript" src="../jasmine.js"></script>
  <script type="text/javascript" src="../html/HtmlReporterHelpers.js"></script>
  <script type="text/javascript" src="../html/HtmlReporter.js"></script>
  <script type="text/javascript" src="../html/ReporterView.js"></script>
  <script type="text/javascript" src="../html/SpecView.js"></script>
  <script type="text/javascript" src="../html/SuiteView.js"></script>
  <script type="text/javascript" src="../html/TrivialReporter.js"></script>

  <!-- Source -->
  <script type="text/javascript" src="../../cordova-incl.js"></script>

  <!-- Load Test Runner -->
  <script type="text/javascript" src="../test-runner.js"></script>

  <!-- Tests -->
  <script type="text/javascript" src="../tests/accelerometer.tests.js"></script>
  <script type="text/javascript" src="../tests/battery.tests.js"></script>
  <script type="text/javascript" src="../tests/capture.tests.js"></script>
  <script type="text/javascript" src="../tests/compass.tests.js"></script>
  <script type="text/javascript" src="../tests/contacts.tests.js"></script>
  <script type="text/javascript" src="../tests/camera.tests.js"></script>
  <script type="text/javascript" src="../tests/datauri.tests.js"></script>
  <script type="text/javascript" src="../tests/device.tests.js"></script>
  <script type="text/javascript" src="../tests/file.tests.js"></script>
  <script type="text/javascript" src="../tests/filetransfer.tests.js"></script>
  <script type="text/javascript" src="../tests/geolocation.tests.js"></script>
  <script type="text/javascript" src="../tests/globalization.tests.js"></script>
  <script type="text/javascript" src="../tests/media.tests.js"></script>
  <script type="text/javascript" src="../tests/network.tests.js"></script>
  <script type="text/javascript" src="../tests/notification.tests.js"></script>
  <script type="text/javascript" src="../tests/platform.tests.js"></script>
  <script type="text/javascript" src="../tests/storage.tests.js"></script>
  <script type="text/javascript" src="../tests/splashscreen.tests.js"></script>
  <script type="text/javascript" src="../tests/localXHR.tests.js"></script>

  <script type="text/javascript">
      var root, temp_root, persistent_root;

      document.addEventListener('deviceready', function () {
          // one-time retrieval of the root file system entry
          var onError = function(e) {
              console.log('[ERROR] Problem setting up root filesystem for test running! Error to follow.');
              console.log(JSON.stringify(e));
          };

          window.requestFileSystem(LocalFileSystem.PERSISTENT, 0,
              function(fileSystem) {
                  console.log('File API test Init: Setting PERSISTENT FS.');
                  root = fileSystem.root; // set in file.tests.js
                  persistent_root = root;

                  // Once root is set up, fire off tests
                  var jasmineEnv = jasmine.getEnv();
                  jasmineEnv.updateInterval = 1000;

                  var htmlReporter = new jasmine.HtmlReporter();
                  jasmineEnv.addReporter(htmlReporter);

                  // the following will only be defined if the Medic plugin is loaded
                  if('medic' in window) {
                      if( medic.isEnabled() ) {
                          jasmineEnv.addReporter(medic.getJSReporter());
                      }
                  }

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

                  jasmineEnv.execute();
              }, onError);
          window.requestFileSystem(LocalFileSystem.TEMPORARY, 0,
              function(fileSystem) {
                  console.log('File API test Init: Setting TEMPORARY FS.');
                  temp_root = fileSystem.root; // set in file.tests.js
              }, onError);
      }, false);
  </script>
</head>

<body>
  <a href="javascript:" class="backBtn" onclick="backHome();">Back</a>
</body>
</html>
