166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Copyright (c) 2013 The Chromium Authors. All rights reserved. 266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Use of this source code is governed by a BSD-style license that can be 366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// found in the LICENSE file. 466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict'; 666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('base.unittest.test_error'); 866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.exportTo('base.unittest', function() { 966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis function forAllAssertMethodsIn_(prototype, fn) { 1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis for (var fieldName in prototype) { 1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (fieldName.indexOf('assert') != 0) 1266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis continue; 1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var fieldValue = prototype[fieldName]; 1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (typeof fieldValue != 'function') 1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis continue; 1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis fn(fieldName, fieldValue); 1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var Assertions = {}; 2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis Assertions.prototype = { 2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertTrue: function(a, opt_message) { 2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a) 2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected true, got ' + a; 2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertFalse: function(a, opt_message) { 3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (!a) 3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected false, got ' + a; 3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertUndefined: function(a, opt_message) { 3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a === undefined) 3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected undefined, got ' + a; 4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertNotUndefined: function(a, opt_message) { 4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a !== undefined) 4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected not undefined, got ' + a; 4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertNull: function(a, opt_message) { 5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a === null) 5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected null, got ' + a; 5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertNotNull: function(a, opt_message) { 5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a !== null) 5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected non-null, got ' + a; 6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals: function(a, b, opt_message) { 6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a === b) 6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected\n"' + JSON.stringify(a) + 6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis '"\ngot\n"' + JSON.stringify(b) + '"'; 6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertNotEquals: function(a, b, opt_message) { 7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a !== b) 7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected something not equal to ' + b; 7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertArrayEquals: function(a, b, opt_message) { 8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a.length === b.length) { 8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var ok = true; 8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis for (var i = 0; i < a.length; i++) { 8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ok &= (a[i] === b[i]); 8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (ok) 8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected array ' + a + ', got array ' + b; 9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertArrayShallowEquals: function(a, b, opt_message) { 9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a.length === b.length) { 9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var ok = true; 9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis for (var i = 0; i < a.length; i++) { 9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ok &= (a[i] === b[i]); 9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (ok) 10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected array ' + b + ', got array ' + a; 10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertAlmostEquals: function(a, b, opt_message) { 10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (Math.abs(a - b) < 0.00001) 10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected almost ' + a + ', got ' + b; 11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertVec2Equals: function(a, b, opt_message) { 11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a[0] === b[0] && 11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis a[1] === b[1]) 11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 11866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected (' + a[0] + ',' + a[1] + 11966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ') but got (' + b[0] + ',' + b[1] + ')'; 12066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 12166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 12266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 12366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertVec3Equals: function(a, b, opt_message) { 12466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a[0] === b[0] && 12566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis a[1] === b[1] && 12666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis a[2] === b[2]) 12766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 12866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected ' + vec3.toString(a) + 12966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ' but got ' + vec3.toString(b); 13066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 13166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 13266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 13366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertQuadEquals: function(a, b, opt_message) { 13466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var ok = true; 13566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ok &= a.p1[0] === b.p1[0] && a.p1[1] === b.p1[1]; 13666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ok &= a.p2[0] === b.p2[0] && a.p2[1] === b.p2[1]; 13766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ok &= a.p3[0] === b.p3[0] && a.p3[1] === b.p3[1]; 13866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ok &= a.p4[0] === b.p4[0] && a.p4[1] === b.p4[1]; 13966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (ok) 14066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 14166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected "' + a.toString() + 14266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis '", got "' + b.toString() + '"'; 14366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 14466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 14566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 14666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertRectEquals: function(a, b, opt_message) { 14766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var ok = true; 14866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a.x === b.x && a.y === b.y && 14966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis a.width === b.width && a.height === b.height) { 15066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 15166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 15266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 15366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected "' + a.toString() + 15466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis '", got "' + b.toString() + '"'; 15566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 15666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 15766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 15866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertObjectEquals: function(a, b, opt_message) { 15966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var a_json = JSON.stringify(a); 16066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var b_json = JSON.stringify(b); 16166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a_json === b_json) 16266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 16366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected ' + a_json + ', got ' + b_json; 16466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 16566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 16666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 16766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertThrows: function(fn, opt_message) { 16866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis try { 16966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis fn(); 17066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } catch (e) { 17166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 17266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 17366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected throw from ' + fn; 17466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 17566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 17666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 17766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertDoesNotThrow: function(fn, opt_message) { 17866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis try { 17966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis fn(); 18066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } catch (e) { 18166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expected to not throw from ' + fn + 18266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ' but got: ' + e; 18366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new TestError(message); 18466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 18566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 18666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 18766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertApproxEquals: function(a, b, opt_epsilon, opt_message) { 18866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (a === b) 18966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 19066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var epsilon = opt_epsilon || 0.000001; // 6 digits. 19166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis a = Math.abs(a); 19266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis b = Math.abs(b); 19366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var relative_error = Math.abs(a - b) / (a + b); 19466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (relative_error < epsilon) 19566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 19666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var message = opt_message || 'Expect ' + a + ' and ' + b + 19766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ' to be within ' + epsilon + ' was ' + relative_error; 19866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError(message); 19966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 20066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 20166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertVisible: function(elt) { 20266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (!elt.offsetHeight || !elt.offsetWidth) 20366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new base.unittest.TestError('Expected element to be visible'); 20466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 20566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }; 20666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 20766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis function bindGlobals_() { 20866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis forAllAssertMethodsIn_(Assertions.prototype, 20966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis function(fieldName, fieldValue) { 21066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis global[fieldName] = fieldValue.bind(this); 21166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }); 21266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }; 21366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis bindGlobals_(); 21466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 21566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return { 21666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis Assertions: Assertions 21766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }; 21866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis}); 21966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 220