<!DOCTYPE html>

<html>
  <head>
    <!-- allow fancy checkmarks to show up -->
    <meta charset="UTF-8">

    <!-- complain about uncaught errors -->
    <script type="text/javascript">
    window.onerror = function() {
      document.documentElement.style.background = 'red';
    };
    </script>

    <!-- better living through jQuery -->
    <script type="text/javascript" src="support/jquery-1.7.2.js"></script>

    <!-- mocha test framework -->
    <script type="text/javascript" src="../node_modules/mocha/mocha.js"></script>
    <link rel="stylesheet" type="text/css" href="../node_modules/mocha/mocha.css" />

    <!-- home-grown assertions -->
    <script src="support/assert.js" type="text/javascript"></script>

    <!-- configure mocha and chai -->
    <script type="text/javascript">
      var post_xunit_to = Mocha.utils.parseQuery(location.search).post_xunit_to;

      mocha.setup({
        ui: 'tdd',
        reporter: post_xunit_to ? 'xunit' : 'html'
      });

      var xunit = '';
      Mocha.process.stdout.write = function(line) { xunit += line; };
    </script>

    <!-- include the library with the tests inlined -->
    <script id="mathquill" type="text/javascript" src="../build/mathquill.test.js"
      onerror="alert('couldn\'t find `build/mathquill.test.js`. Please run `make test` before opening this file.')">
    </script>

    <!-- include MathQuill-basic -->
    <link rel="stylesheet" type="text/css" href="../build/mathquill.css" />
    <script type="text/javascript" src="../build/mathquill-basic.js"></script>
    <script type="text/javascript">
      MQBasic = MathQuill.noConflict().getInterface(MathQuill.getInterface.MAX);
      MQ = MathQuill.getInterface(MathQuill.getInterface.MAX);
    </script>

  </head>

  <body>
    <h1>Unit Tests</h1>
    <div id="mocha">
    </div>

    <div id="mock"></div>

    <script type="text/javascript">
      var runner = mocha.run();

      if (post_xunit_to) {
        // the following is based on https://github.com/saucelabs-sample-scripts/JavaScript/blob/4946c5cf0ab7325dce5562881dba7c28e30989e5/reporting_mocha.js
        var failedTests = [];
        runner.on('fail', function(test, err) {
          function flattenTitles(test) {
            var titles = [];
            while (test.parent.title) {
              titles.push(test.parent.title);
              test = test.parent;
            }
            return titles.reverse();
          }

          failedTests.push({name: test.title, result: false, message: err.message, stack: err.stack, titles: flattenTitles(test) });
        });

        runner.on('end', function() {
          setTimeout(function() {
            $.post(post_xunit_to, xunit).always(function() {
              window.mochaResults = runner.stats;
              window.mochaResults.reports = failedTests;
            });
          });
        });
      }
    </script>
  </body>
</html>
