
<!--
  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>
  <meta charset="utf-8">
  <title>Mocha Tests</title>
  <link rel="stylesheet" href="../resources/css/mocha.css" />
  <script src="../resources/js/mocha.js"></script>
  <script>mocha.setup('bdd')</script>
  <script src="../resources/js/blanket_mocha.min.js"></script>
  <script type="text/javascript" src="../../node_modules/grunt-blanket-mocha/support/mocha-blanket.js"></script>
	<script>
      function assert(expr, msg) {
        if (!expr) throw new Error(msg || 'failed');
      }
    </script>

  <script src="../../usergrid.js" data-cover></script>
  <script src="test.js"></script>
<!-- run mocha -->
    <script type="text/javascript" charset="utf-8">
    	var _onload=onload||function(){};
        onload = function(){
        	_onload.apply(this, arguments);
	        mocha.checkLeaks();
	        mocha.globals(['']);
	        var runner = mocha.run();
	        /*runner.on('test end', function(test){
	          console.log(test.fullTitle());
	        });*/
	      };
    </script>

  <script>
    if (window.PHANTOMJS) {
        blanket.options("reporter", "../../node_modules/grunt-blanket-mocha/support/grunt-reporter.js");
    }
  </script>

</head>
<body>
	<div id="mocha"></div>
</body>
</html>
