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
57160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// The found object is an Array with the same length and elements
58160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// as the expected object. The expected object doesn't need to be an Array,
59160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// as long as it's "array-ish".
60160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertArrayEquals;
61160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
62160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// The found object must have the same enumerable properties as the
63160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// expected object. The type of object isn't checked.
64160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertPropertiesEqual;
65160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
66160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Assert that the string conversion of the found value is equal to
67160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// the expected string. Only kept for backwards compatability, please
68160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// check the real structure of the found value.
69160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertToStringEquals;
70160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
71160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Checks that the found value is true. Use with boolean expressions
72160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// for tests that doesn't have their own assertXXX function.
73160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertTrue;
74160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
75160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Checks that the found value is false.
76160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertFalse;
77160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
78ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// Checks that the found value is null. Kept for historical compatibility,
79160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// please just use assertEquals(null, expected).
80160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertNull;
81160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
82160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Checks that the found value is *not* null.
83160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertNotNull;
84160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
85160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Assert that the passed function or eval code throws an exception.
86160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// The optional second argument is an exception constructor that the
87160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// thrown exception is checked against with "instanceof".
88160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// The optional third argument is a message type string that is compared
89160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// to the type property on the thrown exception.
90160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertThrows;
91160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
92160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Assert that the passed function or eval code does not throw an exception.
93160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertDoesNotThrow;
94160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
95160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Asserts that the found value is an instance of the constructor passed
96160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// as the second argument.
97160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertInstanceof;
98160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
99160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org// Assert that this code is never executed (i.e., always fails if executed).
100160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvar assertUnreachable;
101160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
102ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Assert that the function code is (not) optimized.  If "no sync" is passed
103ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// as second argument, we do not wait for the parallel optimization thread to
104ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// finish when polling for optimization status.
105ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Only works with --allow-natives-syntax.
106ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar assertOptimized;
107ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar assertUnoptimized;
108ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
109ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
110160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org(function () {  // Scope for utility functions.
111160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
112160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  function classOf(object) {
113160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    // Argument must not be null or undefined.
114160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var string = Object.prototype.toString.call(object);
115160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    // String has format [object <ClassName>].
116160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    return string.substring(8, string.length - 1);
117160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  }
118160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
119160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
120160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  function PrettyPrint(value) {
121160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    switch (typeof value) {
122160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      case "string":
123160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        return JSON.stringify(value);
124160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      case "number":
125160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        if (value === 0 && (1 / value) < 0) return "-0";
126160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        // FALLTHROUGH.
127160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      case "boolean":
128160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      case "undefined":
129160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      case "function":
130160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        return String(value);
131160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      case "object":
132160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        if (value === null) return "null";
133160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        var objectClass = classOf(value);
134160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        switch (objectClass) {
1357979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "Number":
1367979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "String":
1377979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "Boolean":
1387979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "Date":
139160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org          return objectClass + "(" + PrettyPrint(value.valueOf()) + ")";
1407979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "RegExp":
1417979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org          return value.toString();
1427979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "Array":
143160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org          return "[" + value.map(PrettyPrintArrayElement).join(",") + "]";
1447979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        case "Object":
1457979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org          break;
1467979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        default:
147160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org          return objectClass + "()";
148160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        }
149160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        // [[Class]] is "Object".
150160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        var name = value.constructor.name;
151160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        if (name) return name + "()";
152160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        return "Object()";
153160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      default:
154160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        return "-- unknown value --";
155160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
1567979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  }
1577979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
1587979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
159160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  function PrettyPrintArrayElement(value, index, array) {
160160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (value === undefined && !(index in array)) return "";
161160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    return PrettyPrint(value);
162cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager  }
1637979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
164cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
165160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  function fail(expectedText, found, name_opt) {
166160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var message = "Fail" + "ure";
167160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (name_opt) {
168160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      // Fix this when we ditch the old test runner.
169160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      message += " (" + name_opt + ")";
170160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
171cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
172160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    message += ": expected <" + expectedText +
173160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        "> found <" + PrettyPrint(found) + ">";
174160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    throw new MjsUnitAssertionError(message);
1753a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org  }
1763a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org
1773a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org
178160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  function deepObjectEquals(a, b) {
179160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var aProps = Object.keys(a);
180160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    aProps.sort();
181160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var bProps = Object.keys(b);
182160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    bProps.sort();
183160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (!deepEquals(aProps, bProps)) {
1843291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      return false;
185160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
186160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    for (var i = 0; i < aProps.length; i++) {
187160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (!deepEquals(a[aProps[i]], b[aProps[i]])) {
1883291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        return false;
1893291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      }
1903291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    }
1913291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    return true;
1923291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
1933291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
1943291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
195160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  function deepEquals(a, b) {
196160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (a === b) {
197160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      // Check for -0.
198160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (a === 0) return (1 / a) === (1 / b);
199160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      return true;
200160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
201160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (typeof a != typeof b) return false;
202160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (typeof a == "number") return isNaN(a) && isNaN(b);
203160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (typeof a !== "object" && typeof a !== "function") return false;
204160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    // Neither a nor b is primitive.
205160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var objectClass = classOf(a);
206160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (objectClass !== classOf(b)) return false;
207160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (objectClass === "RegExp") {
208160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      // For RegExp, just compare pattern and flags using its toString.
209160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      return (a.toString() === b.toString());
210160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
211160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    // Functions are only identical to themselves.
212160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (objectClass === "Function") return false;
213160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (objectClass === "Array") {
214160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      var elementCount = 0;
215160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (a.length != b.length) {
216160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        return false;
217160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
218160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      for (var i = 0; i < a.length; i++) {
219160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        if (!deepEquals(a[i], b[i])) return false;
220160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
221160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      return true;
222160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
223160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (objectClass == "String" || objectClass == "Number" ||
224160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      objectClass == "Boolean" || objectClass == "Date") {
225160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (a.valueOf() !== b.valueOf()) return false;
226160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
227160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    return deepObjectEquals(a, b);
2283a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  }
2293a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
2303a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
231160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertSame = function assertSame(expected, found, name_opt) {
232bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    // TODO(mstarzinger): We should think about using Harmony's egal operator
233bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    // or the function equivalent Object.is() here.
234160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (found === expected) {
235160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (expected !== 0 || (1 / expected) == (1 / found)) return;
236c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    } else if ((expected !== expected) && (found !== found)) {
237160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      return;
238160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
239160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    fail(PrettyPrint(expected), found, name_opt);
240160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
241cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
242cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
243160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertEquals = function assertEquals(expected, found, name_opt) {
244160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (!deepEquals(found, expected)) {
245160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail(PrettyPrint(expected), found, name_opt);
246cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    }
247160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
248cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
249cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
250160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertArrayEquals = function assertArrayEquals(expected, found, name_opt) {
251160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var start = "";
252160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (name_opt) {
253160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      start = name_opt + " - ";
254160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
255160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    assertEquals(expected.length, found.length, start + "array length");
256160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (expected.length == found.length) {
257160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      for (var i = 0; i < expected.length; ++i) {
258160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        assertEquals(expected[i], found[i],
259160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org                     start + "array element at index " + i);
260160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
261160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
262160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
263cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
264cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
265160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertPropertiesEqual = function assertPropertiesEqual(expected, found,
266160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org                                                         name_opt) {
267160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    // Check properties only.
268160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (!deepObjectEquals(expected, found)) {
269160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail(expected, found, name_opt);
270160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
271160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
272cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
273cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
274160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertToStringEquals = function assertToStringEquals(expected, found,
275160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org                                                       name_opt) {
276160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (expected != String(found)) {
277160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail(expected, found, name_opt);
278160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
279160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
280cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
281cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
282160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertTrue = function assertTrue(value, name_opt) {
283160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    assertEquals(true, value, name_opt);
284160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
28565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
28665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
287160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertFalse = function assertFalse(value, name_opt) {
288160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    assertEquals(false, value, name_opt);
289160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
29065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
29165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
292160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertNull = function assertNull(value, name_opt) {
293160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (value !== null) {
294160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail("null", value, name_opt);
2953a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org    }
296160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
297cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
298cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
299160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertNotNull = function assertNotNull(value, name_opt) {
300160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (value === null) {
301160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail("not null", value, name_opt);
302160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
303160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
304cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
305cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
306160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertThrows = function assertThrows(code, type_opt, cause_opt) {
307160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var threwException = true;
308160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    try {
309160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (typeof code == 'function') {
310160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        code();
311160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      } else {
312160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        eval(code);
313160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
314160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      threwException = false;
315160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    } catch (e) {
316160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (typeof type_opt == 'function') {
317160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        assertInstanceof(e, type_opt);
318160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
319160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (arguments.length >= 3) {
320160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        assertEquals(e.type, cause_opt);
321160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
322160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      // Success.
323160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      return;
324911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    }
325160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    throw new MjsUnitAssertionError("Did not throw exception");
326160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
327cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
328cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
329160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertInstanceof = function assertInstanceof(obj, type) {
330160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (!(obj instanceof type)) {
331160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      var actualTypeName = null;
332c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org      var actualConstructor = Object.getPrototypeOf(obj).constructor;
333160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (typeof actualConstructor == "function") {
334160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        actualTypeName = actualConstructor.name || String(actualConstructor);
335160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
336160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail("Object <" + PrettyPrint(obj) + "> is not an instance of <" +
337160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org               (type.name || type) + ">" +
338160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org               (actualTypeName ? " but of < " + actualTypeName + ">" : ""));
339160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
340160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
341160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
342160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
343160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org   assertDoesNotThrow = function assertDoesNotThrow(code, name_opt) {
344160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    try {
345160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      if (typeof code == 'function') {
346160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        code();
347160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      } else {
348160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        eval(code);
349160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      }
350160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    } catch (e) {
351160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      fail("threw an exception: ", e.message || e, name_opt);
352160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
353160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
354160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
355160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  assertUnreachable = function assertUnreachable(name_opt) {
356160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    // Fix this when we ditch the old test runner.
357160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    var message = "Fail" + "ure: unreachable";
358160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    if (name_opt) {
359160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org      message += " - " + name_opt;
360160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    }
361160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    throw new MjsUnitAssertionError(message);
362160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  };
363160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
364ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
365ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  var OptimizationStatus;
366ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  try {
367ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    OptimizationStatus =
368ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      new Function("fun", "sync", "return %GetOptimizationStatus(fun, sync);");
369ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  } catch (e) {
370ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    OptimizationStatus = function() {
371ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      throw new Error("natives syntax not allowed");
372ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    }
373ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  }
374ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
375ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  assertUnoptimized = function assertUnoptimized(fun, sync_opt, name_opt) {
376ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    if (sync_opt === undefined) sync_opt = "";
377ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    assertTrue(OptimizationStatus(fun, sync_opt) != 1, name_opt);
378ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  }
379ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
380ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  assertOptimized = function assertOptimized(fun, sync_opt, name_opt) {
381ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    if (sync_opt === undefined) sync_opt = "";
382ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    assertTrue(OptimizationStatus(fun, sync_opt) != 2, name_opt);
383ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  }
384ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
385160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org})();
386160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
387