<!DOCTYPE html>
<html>
<!--
Copyright (c) 2012 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<head>
<title>Unittest Tests</title>
<script src="base.js"></script>
<script>
  base.require('unittest');
  base.require('test_utils');
</script>
</head>
<body>

<script>
'use strict';


var TestCase = unittest.TestCase;
var HTMLTestRunner = unittest.HTMLTestRunner;

function rawAssertTrue(a) {
  if (a) return;
  throw new Error('Expected true, got ' + a);
}

function rawAssertFalse(a) {
  if (!a) return;
  throw new Error('Expected true, got ' + a);
}

function rawAssertEquals(a, b) {
  if (a == b) return;
  throw new Error('Expected <' + a + '>, got <' + b + '>');
}

function rawAssertThrows(fn) {
  try {
    fn();
  } catch (e) {
    return;
  }
  throw new Error('Expected <' + fn + '> to throw');
}

function rawAssertNotThrows(fn) {
  try {
    fn();
  } catch (e) {
    throw new Error('Expected <' + fn + '> to not throw');
  }
}

/**
 * Runs all methods in the window that start with test_.
 * @return {undefined} Nothing.
 */
function runAllTests() {
  var testMethodNames = [];
  for (var name in tests) {
    if (name.indexOf('test') != 0)
      continue;
    var value = tests[name];
    if (typeof value != 'function')
      continue;
    testMethodNames.push(name);
  }
  var resultsEl = document.createElement('unittest-test-runner');
  document.body.appendChild(resultsEl);

  var numFailures = 0;
  for (var i = 0; i < testMethodNames.length; i++) {
    var testMethodName = testMethodNames[i];
    var testMethod = tests[testMethodName];
    var testCaseEl = unittest.createTestCaseDiv_(testMethodName);
    resultsEl.appendChild(testCaseEl);
    testCaseEl.status = 'RUNNING';

    var testStub = {
      get testName() {
        return testMethodName;
      },

      addHTMLOutput: function(opt_title, opt_element) {
        return testCaseEl.addHTMLOutput(opt_title, opt_element);
      }
    };

    try {
      testMethod.call(testStub);
      testCaseEl.status = 'PASSED';
    } catch (e) {
      testCaseEl.status = 'FAILED';
      e.testName = testMethodName;
      testCaseEl.addError(testStub, e);
      numFailures += 1;
    }
  }
  window.G_testRunner = {
    computeResultStats: function() {
      return {
        get numTestsRun() {
          return testMethodName.length;
        },
        get numTestsPassed() {
          return this.numTestsRun - numFailures;
        },
        get numTestsWithErrors() {
          return numFailures;
        }
      };
    },

    get done() {
      return true;
    }
  };
}

// Simple assertions for use in testing the test harness. :)
function FakeTest(testMethod, opt_testMethodName) {
  TestCase.call(this, testMethod, opt_testMethodName);
}

FakeTest.prototype = {
  __proto__: TestCase.prototype,

  setUp: function() {
    this.didSetUp = true;
  },

  tearDown: function() {
    this.didTearDown = true;
  }
};


function FakeResults() {
}

FakeResults.prototype = {
  willRunTest: function(test) {
    this.didWillRunTest = true;
    this.willRunTestArg1 = test;
  },

  addError: function(e) {
    this.didAddError = true;
    this.addErrorArg1 = e;
  },

  didRunTest: function(test) {
    this.didDidRunTest = true;
    this.didRunTestArg1 = test;
  }
};

function testTestCaseRun() {
  var didRunTestMethod = false;
  var test = new FakeTest(function() {
    didRunTestMethod = true;
  }, 'test_testcase_run');
  var results = new FakeResults();
  test.run(results);

  rawAssertTrue(results.didWillRunTest);
  rawAssertEquals(test, results.willRunTestArg1);

  rawAssertTrue(test.didSetUp);
  rawAssertTrue(didRunTestMethod);

  rawAssertFalse(results.didAddError);
  rawAssertTrue(test.didTearDown);

  rawAssertTrue(results.didDidRunTest);
  rawAssertEquals(test, results.didRunTestArg1);

  rawAssertTrue(window.assertEquals == undefined);
}

function testTestCaseRun_TestThatFails() {
  var didRunTestMethod = false;
  var test = new FakeTest(function() {
    didRunTestMethod = true;
    assertTrue(false);
  }, 'test_testcase_run_test_that_fails');
  var results = new FakeResults();
  test.run(results);

  rawAssertTrue(results.didWillRunTest);
  rawAssertEquals(test, results.willRunTestArg1);

  rawAssertTrue(test.didSetUp);
  rawAssertTrue(didRunTestMethod);
  rawAssertTrue(results.didAddError);
  rawAssertTrue(results.addErrorArg1 instanceof unittest.TestError);
  rawAssertTrue(test.didTearDown);

  rawAssertTrue(results.didDidRunTest);
  rawAssertEquals(test, results.didRunTestArg1);

  rawAssertTrue(window.assertEquals == undefined);
}

function testObjectThatHasErrorInSetUp() {
  var didRunTestMethod = false;
  var test = new FakeTest(function() {
    didRunTestMethod = true;
  }, 'test_object_that_has_error_in_setUp');
  test.setUp = function() {
    throw Error('Intentional setUp error');
  };

  var results = new FakeResults();
  test.run(results);

  rawAssertTrue(results.didWillRunTest);
  rawAssertEquals(test, results.willRunTestArg1);

  rawAssertFalse(didRunTestMethod);
  rawAssertTrue(results.didAddError);
  rawAssertTrue(results.addErrorArg1 instanceof Error);
  rawAssertFalse(test.didTearDown);

  rawAssertTrue(results.didDidRunTest);
  rawAssertEquals(test, results.didRunTestArg1);

  rawAssertTrue(window.assertEquals == undefined);
}

function testObjectThatThrowsInCleanup() {
  var didRunTestMethod = false;
  var test = new FakeTest(function() {
    didRunTestMethod = true;
  }, 'test_object_that_throws_in_cleanup');
  test.setUp = function() {
    throw Error('Intentional setUp error');
  };

  var results = new FakeResults();
  test.run(results);

  rawAssertTrue(results.didWillRunTest);
  rawAssertEquals(test, results.willRunTestArg1);

  rawAssertFalse(didRunTestMethod);
  rawAssertTrue(results.didAddError);
  rawAssertTrue(results.addErrorArg1 instanceof Error);
  rawAssertFalse(test.didTearDown);

  rawAssertTrue(results.didDidRunTest);
  rawAssertEquals(test, results.didRunTestArg1);

  rawAssertTrue(window.assertEquals == undefined);
}

function testAssertTrue() {
  var test = new TestCase(function() {
    rawAssertThrows(function() {
      assertTrue(false);
    });
    rawAssertNotThrows(function() {
      assertTrue(true);
    });
  }, 'test_assert_true');
  var results = new FakeResults();
  test.run(results);
}

function testAssertThrows() {
  var test = new TestCase(function() {
    rawAssertThrows(function() {
      assertThrows(function() {
      });
    });
    rawAssertNotThrows(function() {
      assertThrows(function() {
        throw new Error('expected_error');
      });
    });
  }, 'test_assert_throws');
  var results = new FakeResults();
  test.run(results);
}

function testTestRunnerAllPassed() {
  var runner = new HTMLTestRunner('foo');
  var test1 = new TestCase(function() {
    assertTrue(true);
  }, 'test1');
  var test2 = new TestCase(function() {
    assertTrue(true);
  }, 'test2');

  var testRunnerEl = this.addHTMLOutput('Hypothetical result');
  testRunnerEl.appendChild(runner);
  runner.run([test1, test2]);

  var stats = runner.computeResultStats();
  rawAssertEquals(2, stats.numTestsRun);
  rawAssertEquals(2, stats.numTestsPassed);
  rawAssertEquals(0, stats.numTestsWithErrors);
}

function testTestErrorConstruction() {
  var err = new unittest.TestError();
  rawAssertTrue(err instanceof unittest.TestError);
  rawAssertTrue(err instanceof Error);
  rawAssertTrue(err.stack);

  var err = new unittest.TestError('foo');
  rawAssertTrue(err instanceof unittest.TestError);
  rawAssertTrue(err instanceof Error);
  rawAssertTrue(err.stack);
  rawAssertEquals('foo', err.message);
}

function testTestRunnerOneFailed() {
  var runner = new HTMLTestRunner('foo', '');
  var test1 = new TestCase(function() {
    assertTrue(true);
  }, 'test1');
  var test2 = new TestCase(function() {
    assertTrue(false);
  }, 'test2');

  var testRunnerEl = this.addHTMLOutput('Hypothetical result:');
  testRunnerEl.appendChild(runner);
  runner.run([test1, test2]);

  var stats = runner.computeResultStats();
  rawAssertEquals(2, stats.numTestsRun);
  rawAssertEquals(1, stats.numTestsPassed);
  rawAssertEquals(1, stats.numTestsWithErrors);
}

function testTestRunnerOneFailedWithHashFilter() {
  var runner = new HTMLTestRunner('foo', '#test2');

  var test1 = new TestCase(function() {
    assertTrue(true);
  }, 'test1');
  var test2 = new TestCase(function() {
    assertTrue(false);
  }, 'test2');

  var testRunnerEl = this.addHTMLOutput('Hypothetical result:');
  testRunnerEl.appendChild(runner);
  runner.run([test1, test2]);

  var stats = runner.computeResultStats();
  rawAssertEquals(1, stats.numTestsRun);
  rawAssertEquals(0, stats.numTestsPassed);
  rawAssertEquals(1, stats.numTestsWithErrors);
}

function testTestDiscovery() {
  var object = {
    test1: function() {
    },
    test_2: function() {
    },
    notATest: function() {
    },
    alsoNotATest: 3
  };
  var tests = unittest.discoverTests(object, undefined);
  rawAssertEquals(2, tests.length);
  rawAssertEquals('test1', tests[0].testName);
  rawAssertEquals('test_2', tests[1].testName);
}

function testTestRunnerFilter() {
  var object = {
    test1: function() {
    },
    test_2: function() {
    }
  };
  var tests = unittest.discoverTests(object, /test_2/);
  rawAssertEquals(1, tests.length);
  rawAssertEquals('test_2', tests[0].testName);
}

</script>
</body>
</html>
