<!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>