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