1558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// found in the LICENSE file. 4558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 5558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch/** 6558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * Tests that an observation matches the expected value. 7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {Object} expected The expected value. 8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {Object} observed The actual value. 9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {string=} opt_message Optional message to include with a test 10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * failure. 11558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch */ 12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochfunction assertEquals(expected, observed, opt_message) { 13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (observed !== expected) { 14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var message = 'Assertion Failed\n Observed: ' + observed + 15558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch '\n Expected: ' + expected; 16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (opt_message) 17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch message = message + '\n ' + opt_message; 18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch throw new Error(message); 19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch/** 23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * Verifies that a test result is true. 24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {boolean} observed The observed value. 25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {string=} opt_message Optional message to include with a test 26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * failure. 27558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch */ 28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochfunction assertTrue(observed, opt_message) { 29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch assertEquals(true, observed, opt_message); 30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch/** 33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * Verifies that a test result is false. 34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {boolean} observed The observed value. 35558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {string=} opt_message Optional message to include with a test 36558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * failure. 37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch */ 38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochfunction assertFalse(observed, opt_message) { 39558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch assertEquals(false, observed, opt_message); 40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch/** 43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * Verifies that the observed and reference values differ. 44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {Object} reference The target value for comparison. 45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {Object} observed The test result. 46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {string=} opt_message Optional message to include with a test 47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * failure. 48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch */ 49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochfunction assertNotEqual(reference, observed, opt_message) { 50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (observed === reference) { 51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var message = 'Assertion Failed\n Observed: ' + observed + 52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch '\n Reference: ' + reference; 53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (opt_message) 54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch message = message + '\n ' + opt_message; 55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch throw new Error(message); 56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch/** 60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * Verifies that a test evaluation results in an exception. 61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {!Function} f The test function. 62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch */ 63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochfunction assertThrows(f) { 64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var triggeredError = false; 65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch try { 66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch f(); 67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } catch (err) { 68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch triggeredError = true; 69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!triggeredError) 71558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch throw new Error('Assertion Failed: throw expected.'); 72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 73558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 74558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch/** 75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * Verifies that the contents of the expected and observed arrays match. 76558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {!Array} expected The expected result. 77558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {!Array} observed The actual result. 78558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch */ 79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochfunction assertArrayEquals(expected, observed) { 80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var v1 = Array.prototype.slice.call(expected); 81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var v2 = Array.prototype.slice.call(observed); 82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var equal = v1.length == v2.length; 83558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (equal) { 84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch for (var i = 0; i < v1.length; i++) { 85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (v1[i] !== v2[i]) { 86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch equal = false; 87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch break; 88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!equal) { 92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var message = 93558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ['Assertion Failed', 'Observed: ' + v2, 'Expected: ' + v1].join('\n '); 94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch throw new Error(message); 95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch/** 99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * Verifies that the expected and observed result have the same content. 100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {*} expected The expected result. 101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @param {*} observed The actual result. 102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch */ 103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochfunction assertDeepEquals(expected, observed, opt_message) { 104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (typeof expected == 'object' && expected != null) { 105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch assertNotEqual(null, observed); 106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch for (var key in expected) { 107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch assertTrue(key in observed, opt_message); 108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch assertDeepEquals(expected[key], observed[key], opt_message); 109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch for (var key in observed) { 111558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch assertTrue(key in expected, opt_message); 112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } else { 114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch assertEquals(expected, observed, opt_message); 115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 116558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 117558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 118558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch/** 119558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * Defines runTests. 120558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch */ 121558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch(function(exports) { 122558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch /** 123558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * List of test cases. 124558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @type {Array.<string>} List of function names for tests to run. 125558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch */ 126558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var testCases = []; 127558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 128558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch /** 129558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * Indicates if all tests have run successfully. 130558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @type {boolean} 131558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch */ 132558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var cleanTestRun = true; 133558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 134558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch /** 135558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * Armed during setup of a test to call the matching tear down code. 136558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * @type {Function} 137558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch */ 138558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var pendingTearDown = null; 139558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 140558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch /** 141558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * Runs all functions starting with test and reports success or 142558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * failure of the test suite. 143558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch */ 144558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch function runTests() { 145558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch for (var name in window) { 146558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (typeof window[name] == 'function' && /^test/.test(name)) 147558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch testCases.push(name); 148558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 149558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!testCases.length) { 150558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch console.error('Failed to find test cases.'); 151558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch cleanTestRun = false; 152558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 153558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch continueTesting(); 154558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 155558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 156558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch function reportPass(name) { 157558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 'use strict'; 158558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var text = document.createTextNode(name + ': PASSED'); 159558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var span = document.createElement('span'); 160558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch span.appendChild(text); 161558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch document.body.appendChild(span); 162558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch document.body.appendChild(document.createElement('br')); 163558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 164558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 165558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch function reportFail(name) { 166558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 'use strict'; 167558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var text = document.createTextNode(name + ': =========FAILED======='); 168558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var span = document.createElement('span'); 169558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch span.appendChild(text); 170558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch document.body.appendChild(span); 171558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch document.body.appendChild(document.createElement('br')); 172558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 173558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 174558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch /** 175558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * Runs the next test in the queue. Reports the test results if the queue is 176558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * empty. 177558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch */ 178558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch function continueTesting() { 179558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (pendingTearDown) { 180558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch pendingTearDown(); 181558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch pendingTearDown = null; 182558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 183558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (testCases.length > 0) { 184558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var fn = testCases.pop(); 185558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch var isAsyncTest = window[fn].length; 186558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch try { 187558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (window.setUp) 188558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch window.setUp(); 189558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch pendingTearDown = window.tearDown; 190558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch window[fn](continueTesting); 191558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch reportPass(fn); 192558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } catch (err) { 193558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch reportFail(fn); 194558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch console.error('Failure in test ' + fn + '\n' + err); 195558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch console.log(err.stack); 196558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch cleanTestRun = false; 197558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 198558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Asynchronous tests must manually call continueTesting when complete. 199558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!isAsyncTest) 200558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch continueTesting(); 201558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 202558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (testCases.length) { 203558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch domAutomationController.setAutomationId(1); 204558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch domAutomationController.send('PENDING'); 205558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 206558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch }; 207558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 208558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch exports.runTests = runTests; 209558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch})(this); 210558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 211