1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// are met: 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 1. Redistributions of source code must retain the above copyright 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// notice, this list of conditions and the following disclaimer. 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 2. Redistributions in binary form must reproduce the above copyright 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// notice, this list of conditions and the following disclaimer in the 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// documentation and/or other materials provided with the distribution. 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar wasPostTestScriptParsed = false; 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction removeLink(text) 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return text.replace(/<a[^>]*>/g, "").replace(/<\/a>/g, ""); 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction description(msg) 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print(removeLink(msg)); 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print("\nOn success, you will see a series of \"PASS\" messages, followed by \"TEST COMPLETE\".\n"); 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print(); 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction debug(msg) 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print(msg); 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction escapeString(text) 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return text.replace(/\0/g, ""); 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction testPassed(msg) 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print("PASS", escapeString(msg)); 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction testFailed(msg) 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print("FAIL", escapeString(msg)); 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction areArraysEqual(_a, _b) 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (Object.prototype.toString.call(_a) != Object.prototype.toString.call([])) 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (_a.length !== _b.length) 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (var i = 0; i < _a.length; i++) 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (_a[i] !== _b[i]) 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction isMinusZero(n) 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the only way to tell 0 from -0 in JS is the fact that 1/-0 is 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // -Infinity instead of Infinity 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return n === 0 && 1/n < 0; 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction isResultCorrect(_actual, _expected) 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (_expected === 0) 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return _actual === _expected && (1/_actual) === (1/_expected); 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (_actual === _expected) 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (typeof(_expected) == "number" && isNaN(_expected)) 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return typeof(_actual) == "number" && isNaN(_actual); 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (Object.prototype.toString.call(_expected) == Object.prototype.toString.call([])) 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return areArraysEqual(_actual, _expected); 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction stringify(v) 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (v === 0 && 1/v < 0) 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "-0"; 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else return "" + v; 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction shouldBe(_a, _b) 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (typeof _a != "string" || typeof _b != "string") 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch debug("WARN: shouldBe() expects string arguments"); 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var exception; 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var _av; 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch try { 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch _av = eval(_a); 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } catch (e) { 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch exception = e; 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var _bv = eval(_b); 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (exception) 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testFailed(_a + " should be " + _bv + ". Threw exception " + exception); 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else if (isResultCorrect(_av, _bv)) 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testPassed(_a + " is " + _b); 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else if (typeof(_av) == typeof(_bv)) 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testFailed(_a + " should be " + _bv + ". Was " + stringify(_av) + "."); 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testFailed(_a + " should be " + _bv + " (of type " + typeof _bv + "). Was " + _av + " (of type " + typeof _av + ")."); 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction shouldBeTrue(_a) { shouldBe(_a, "true"); } 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction shouldBeFalse(_a) { shouldBe(_a, "false"); } 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction shouldBeNaN(_a) { shouldBe(_a, "NaN"); } 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction shouldBeNull(_a) { shouldBe(_a, "null"); } 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction shouldBeEqualToString(a, b) 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (typeof a !== "string" || typeof b !== "string") 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch debug("WARN: shouldBeEqualToString() expects string arguments"); 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var unevaledString = JSON.stringify(b); 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shouldBe(a, unevaledString); 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction shouldBeUndefined(_a) 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var exception; 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var _av; 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch try { 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch _av = eval(_a); 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } catch (e) { 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch exception = e; 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (exception) 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testFailed(_a + " should be undefined. Threw exception " + exception); 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else if (typeof _av == "undefined") 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testPassed(_a + " is undefined."); 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testFailed(_a + " should be undefined. Was " + _av); 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction shouldThrow(_a, _e) 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var exception; 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var _av; 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch try { 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch _av = eval(_a); 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } catch (e) { 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch exception = e; 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var _ev; 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (_e) 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch _ev = eval(_e); 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (exception) { 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (typeof _e == "undefined" || exception == _ev) 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testPassed(_a + " threw exception " + exception + "."); 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Threw exception " + exception + "."); 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (typeof _av == "undefined") 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Was undefined."); 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Was " + _av + "."); 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction isSuccessfullyParsed() 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch successfullyParsed = true; 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shouldBeTrue("successfullyParsed"); 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch debug("\nTEST COMPLETE\n"); 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// It's possible for an async test to call finishJSTest() before js-test-post.js 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// has been parsed. 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction finishJSTest() 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch{ 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch wasFinishJSTestCalled = true; 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!wasPostTestScriptParsed) 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isSuccessfullyParsed(); 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 193