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