19258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Copyright 2008 the V8 project authors. All rights reserved.
2cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// Redistribution and use in source and binary forms, with or without
3cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// modification, are permitted provided that the following conditions are
4cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// met:
5cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager//
6cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager//     * Redistributions of source code must retain the above copyright
7cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager//       notice, this list of conditions and the following disclaimer.
8cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager//     * Redistributions in binary form must reproduce the above
9cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager//       copyright notice, this list of conditions and the following
10cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager//       disclaimer in the documentation and/or other materials provided
11cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager//       with the distribution.
12cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager//     * Neither the name of Google Inc. nor the names of its
13cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager//       contributors may be used to endorse or promote products derived
14cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager//       from this software without specific prior written permission.
15cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager//
16cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction MjsUnitAssertionError(message) {
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  this.message = message;
30dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  // This allows fetching the stack trace using TryCatch::StackTrace.
31dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  this.stack = new Error("").stack;
329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
34cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager/*
35cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager * This file is included in all mini jsunit test cases.  The test
36cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager * framework expects lines that signal failed tests to start with
37cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager * the f-word and ignore all other lines.
38cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager */
39cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
40160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
41160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgMjsUnitAssertionError.prototype.toString = function () {
42160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  return this.message;
43160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org};
44160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
45160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
46160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Expected and found values the same objects, or the same primitive
47160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// values.
48160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// For known primitive values, please use assertEquals.
49160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertSame;
50160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
51160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Expected and found values are identical primitive values or functions
52160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// or similarly structured objects (checking internal properties
53160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// of, e.g., Number and Date objects, the elements of arrays
54160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// and the properties of non-Array objects).
55160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertEquals;
56160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
577ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
587ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org// The difference between expected and found value is within certain tolerance.
597ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.orgvar assertEqualsDelta;
607ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
61160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// The found object is an Array with the same length and elements
62160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// as the expected object. The expected object doesn't need to be an Array,
63160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// as long as it's "array-ish".
64160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertArrayEquals;
65160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
66160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// The found object must have the same enumerable properties as the
67160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// expected object. The type of object isn't checked.
68160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertPropertiesEqual;
69160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
70160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Assert that the string conversion of the found value is equal to
71160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// the expected string. Only kept for backwards compatability, please
72160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// check the real structure of the found value.
73160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertToStringEquals;
74160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
75160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Checks that the found value is true. Use with boolean expressions
76160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// for tests that doesn't have their own assertXXX function.
77160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertTrue;
78160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
79160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Checks that the found value is false.
80160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertFalse;
81160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
82ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// Checks that the found value is null. Kept for historical compatibility,
83160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// please just use assertEquals(null, expected).
84160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertNull;
85160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
86160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Checks that the found value is *not* null.
87160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertNotNull;
88160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
89160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Assert that the passed function or eval code throws an exception.
90160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// The optional second argument is an exception constructor that the
91160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// thrown exception is checked against with "instanceof".
92160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// The optional third argument is a message type string that is compared
93160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// to the type property on the thrown exception.
94160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertThrows;
95160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
96160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Assert that the passed function or eval code does not throw an exception.
97160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertDoesNotThrow;
98160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
99160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Asserts that the found value is an instance of the constructor passed
100160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// as the second argument.
101160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertInstanceof;
102160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
103160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Assert that this code is never executed (i.e., always fails if executed).
104160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertUnreachable;
105160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
106ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Assert that the function code is (not) optimized.  If "no sync" is passed
1079259716434187c932704601f700375e53d865de8rossberg@chromium.org// as second argument, we do not wait for the concurrent optimization thread to
108ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// finish when polling for optimization status.
109ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Only works with --allow-natives-syntax.
110ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar assertOptimized;
111ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar assertUnoptimized;
112ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
113ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
114160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org(function () {  // Scope for utility functions.
115160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
116160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  function classOf(object) {
117160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    // Argument must not be null or undefined.
118160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var string = Object.prototype.toString.call(object);
119160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    // String has format [object <ClassName>].
120160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    return string.substring(8, string.length - 1);
121160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  }
122160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
123160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
124160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  function PrettyPrint(value) {
125160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    switch (typeof value) {
126160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      case "string":
127160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        return JSON.stringify(value);
128160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      case "number":
129160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        if (value === 0 && (1 / value) < 0) return "-0";
130160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        // FALLTHROUGH.
131160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      case "boolean":
132160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      case "undefined":
133160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      case "function":
134160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        return String(value);
135160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      case "object":
136160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        if (value === null) return "null";
137160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        var objectClass = classOf(value);
138160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        switch (objectClass) {
1397979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "Number":
1407979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "String":
1417979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "Boolean":
1427979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "Date":
143160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org          return objectClass + "(" + PrettyPrint(value.valueOf()) + ")";
1447979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "RegExp":
1457979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org          return value.toString();
1467979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "Array":
147160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org          return "[" + value.map(PrettyPrintArrayElement).join(",") + "]";
1487979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "Object":
1497979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org          break;
1507979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        default:
151160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org          return objectClass + "()";
152160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        }
153160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        // [[Class]] is "Object".
154160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        var name = value.constructor.name;
155160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        if (name) return name + "()";
156160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        return "Object()";
157160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      default:
158160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        return "-- unknown value --";
159160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
1607979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  }
1617979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
1627979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
163160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  function PrettyPrintArrayElement(value, index, array) {
164160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (value === undefined && !(index in array)) return "";
165160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    return PrettyPrint(value);
166cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager  }
1677979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
168cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
169160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  function fail(expectedText, found, name_opt) {
170160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var message = "Fail" + "ure";
171160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (name_opt) {
172160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      // Fix this when we ditch the old test runner.
173160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      message += " (" + name_opt + ")";
174160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
175cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
176160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    message += ": expected <" + expectedText +
177160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        "> found <" + PrettyPrint(found) + ">";
178160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    throw new MjsUnitAssertionError(message);
1793a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org  }
1803a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org
1813a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org
182160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  function deepObjectEquals(a, b) {
183160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var aProps = Object.keys(a);
184160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    aProps.sort();
185160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var bProps = Object.keys(b);
186160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    bProps.sort();
187160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (!deepEquals(aProps, bProps)) {
1883291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      return false;
189160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
190160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    for (var i = 0; i < aProps.length; i++) {
191160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (!deepEquals(a[aProps[i]], b[aProps[i]])) {
1923291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        return false;
1933291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      }
1943291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    }
1953291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    return true;
1963291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
1973291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
1983291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
199160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  function deepEquals(a, b) {
200160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (a === b) {
201160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      // Check for -0.
202160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (a === 0) return (1 / a) === (1 / b);
203160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      return true;
204160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
205160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (typeof a != typeof b) return false;
206160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (typeof a == "number") return isNaN(a) && isNaN(b);
207160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (typeof a !== "object" && typeof a !== "function") return false;
208160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    // Neither a nor b is primitive.
209160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var objectClass = classOf(a);
210160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (objectClass !== classOf(b)) return false;
211160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (objectClass === "RegExp") {
212160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      // For RegExp, just compare pattern and flags using its toString.
213160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      return (a.toString() === b.toString());
214160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
215160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    // Functions are only identical to themselves.
216160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (objectClass === "Function") return false;
217160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (objectClass === "Array") {
218160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      var elementCount = 0;
219160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (a.length != b.length) {
220160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        return false;
221160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
222160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      for (var i = 0; i < a.length; i++) {
223160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        if (!deepEquals(a[i], b[i])) return false;
224160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
225160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      return true;
226160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
227160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (objectClass == "String" || objectClass == "Number" ||
228160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      objectClass == "Boolean" || objectClass == "Date") {
229160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (a.valueOf() !== b.valueOf()) return false;
230160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
231160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    return deepObjectEquals(a, b);
2323a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  }
2333a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
2343a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
235160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertSame = function assertSame(expected, found, name_opt) {
236bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    // TODO(mstarzinger): We should think about using Harmony's egal operator
237bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    // or the function equivalent Object.is() here.
238160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (found === expected) {
239160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (expected !== 0 || (1 / expected) == (1 / found)) return;
240c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    } else if ((expected !== expected) && (found !== found)) {
241160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      return;
242160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
243160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    fail(PrettyPrint(expected), found, name_opt);
244160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
245cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
246cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
247160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertEquals = function assertEquals(expected, found, name_opt) {
248160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (!deepEquals(found, expected)) {
249160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail(PrettyPrint(expected), found, name_opt);
250cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    }
251160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
252cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
253cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
2547ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  assertEqualsDelta =
2557ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org      function assertEqualsDelta(expected, found, delta, name_opt) {
2567ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org    assertTrue(Math.abs(expected - found) <= delta, name_opt);
2577ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  };
2587ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
2597ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
260160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertArrayEquals = function assertArrayEquals(expected, found, name_opt) {
261160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var start = "";
262160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (name_opt) {
263160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      start = name_opt + " - ";
264160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
265160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    assertEquals(expected.length, found.length, start + "array length");
266160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (expected.length == found.length) {
267160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      for (var i = 0; i < expected.length; ++i) {
268160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        assertEquals(expected[i], found[i],
269160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org                     start + "array element at index " + i);
270160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
271160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
272160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
273cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
274cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
275160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertPropertiesEqual = function assertPropertiesEqual(expected, found,
276160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org                                                         name_opt) {
277160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    // Check properties only.
278160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (!deepObjectEquals(expected, found)) {
279160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail(expected, found, name_opt);
280160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
281160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
282cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
283cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
284160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertToStringEquals = function assertToStringEquals(expected, found,
285160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org                                                       name_opt) {
286160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (expected != String(found)) {
287160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail(expected, found, name_opt);
288160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
289160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
290cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
291cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
292160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertTrue = function assertTrue(value, name_opt) {
293160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    assertEquals(true, value, name_opt);
294160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
29565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
29665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
297160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertFalse = function assertFalse(value, name_opt) {
298160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    assertEquals(false, value, name_opt);
299160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
30065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
30165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
302160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertNull = function assertNull(value, name_opt) {
303160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (value !== null) {
304160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail("null", value, name_opt);
3053a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org    }
306160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
307cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
308cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
309160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertNotNull = function assertNotNull(value, name_opt) {
310160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (value === null) {
311160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail("not null", value, name_opt);
312160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
313160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
314cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
315cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
316160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertThrows = function assertThrows(code, type_opt, cause_opt) {
317160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var threwException = true;
318160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    try {
319160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (typeof code == 'function') {
320160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        code();
321160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      } else {
322160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        eval(code);
323160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
324160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      threwException = false;
325160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    } catch (e) {
326160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (typeof type_opt == 'function') {
327160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        assertInstanceof(e, type_opt);
328160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
329160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (arguments.length >= 3) {
330160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        assertEquals(e.type, cause_opt);
331160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
332160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      // Success.
333160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      return;
334911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    }
335160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    throw new MjsUnitAssertionError("Did not throw exception");
336160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
337cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
338cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
339160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertInstanceof = function assertInstanceof(obj, type) {
340160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (!(obj instanceof type)) {
341160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      var actualTypeName = null;
342c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org      var actualConstructor = Object.getPrototypeOf(obj).constructor;
343160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (typeof actualConstructor == "function") {
344160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        actualTypeName = actualConstructor.name || String(actualConstructor);
345160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
346160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail("Object <" + PrettyPrint(obj) + "> is not an instance of <" +
347160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org               (type.name || type) + ">" +
348160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org               (actualTypeName ? " but of < " + actualTypeName + ">" : ""));
349160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
350160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
351160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
352160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
353160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org   assertDoesNotThrow = function assertDoesNotThrow(code, name_opt) {
354160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    try {
355160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (typeof code == 'function') {
356160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        code();
357160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      } else {
358160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        eval(code);
359160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
360160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    } catch (e) {
361160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail("threw an exception: ", e.message || e, name_opt);
362160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
363160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
364160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
365160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertUnreachable = function assertUnreachable(name_opt) {
366160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    // Fix this when we ditch the old test runner.
367160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var message = "Fail" + "ure: unreachable";
368160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (name_opt) {
369160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      message += " - " + name_opt;
370160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
371160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    throw new MjsUnitAssertionError(message);
372160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
373160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
374ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
375ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  var OptimizationStatus;
376ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  try {
377ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    OptimizationStatus =
378ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      new Function("fun", "sync", "return %GetOptimizationStatus(fun, sync);");
379ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  } catch (e) {
380ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    OptimizationStatus = function() {
381ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      throw new Error("natives syntax not allowed");
382ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    }
383ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  }
384ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
385ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  assertUnoptimized = function assertUnoptimized(fun, sync_opt, name_opt) {
386ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    if (sync_opt === undefined) sync_opt = "";
387ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    assertTrue(OptimizationStatus(fun, sync_opt) != 1, name_opt);
388ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  }
389ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
390ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  assertOptimized = function assertOptimized(fun, sync_opt, name_opt) {
391ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    if (sync_opt === undefined) sync_opt = "";
392ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    assertTrue(OptimizationStatus(fun, sync_opt) != 2, name_opt);
393ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  }
394ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
395160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org})();
396