Index: test/mjsunit/mjsunit.js |
diff --git a/test/mjsunit/mjsunit.js b/test/mjsunit/mjsunit.js |
index fe580f35005a42b4e404c3003092a17118ff3252..436bdc8184957fcf3a85f50f77d2a110a9980096 100644 |
--- a/test/mjsunit/mjsunit.js |
+++ b/test/mjsunit/mjsunit.js |
@@ -41,15 +41,62 @@ MjsUnitAssertionError.prototype.toString = function () { |
* the f-word and ignore all other lines. |
*/ |
+function MjsUnitToString(value) { |
+ switch (typeof value) { |
+ case "string": |
+ return JSON.stringify(value); |
+ case "number": |
+ if (value === 0 && (1 / value) < 0) return "-0"; |
+ case "boolean": |
+ case "null": |
+ case "undefined": |
+ case "function": |
+ return String(value); |
+ case "object": |
+ if (value === null) return "null"; |
+ var clazz = Object.prototype.toString.call(value); |
+ clazz = clazz.substring(8, clazz.length - 1); |
+ switch (clazz) { |
+ case "Number": |
+ case "String": |
+ case "Boolean": |
+ case "Date": |
+ return clazz + "(" + MjsUnitToString(value.valueOf()) + ")"; |
+ case "RegExp": |
+ return value.toString(); |
+ case "Array": |
+ return "[" + value.map(MjsUnitArrayElementToString).join(",") + "]"; |
+ case "Object": |
+ break; |
+ default: |
+ return clazz + "()"; |
+ } |
+ // [[Class]] is "Object". |
+ var constructor = value.constructor.name; |
+ if (name) return name + "()"; |
+ return "Object()"; |
+ default: |
+ return "-- unknown value --"; |
+ } |
+} |
+ |
+ |
+function MjsUnitArrayElementToString(value, index, array) { |
+ if (value === undefined && !(index in array)) return ""; |
+ return MjsUnitToString(value); |
+} |
+ |
+ |
function fail(expected, found, name_opt) { |
- var start; |
+ var message = "Fail" + "ure"; |
if (name_opt) { |
// Fix this when we ditch the old test runner. |
- start = "Fail" + "ure (" + name_opt + "): "; |
- } else { |
- start = "Fail" + "ure:"; |
+ message += " (" + name_opt + ")"; |
} |
- throw new MjsUnitAssertionError(start + " expected <" + expected + "> found <" + found + ">"); |
+ |
+ message += ": expected <" + MjsUnitToString(expected) + |
+ "> found <" + MjsUnitToString(found) + ">"; |
+ throw new MjsUnitAssertionError(message); |
} |
@@ -73,13 +120,17 @@ function deepObjectEquals(a, b) { |
function deepEquals(a, b) { |
- if (a == b) return true; |
+ if (a == b) { |
+ // Check for -0. |
+ if (a === 0 && b === 0) return (1 / a) === (1 / b); |
+ return true; |
+ } |
if (typeof a == "number" && typeof b == "number" && isNaN(a) && isNaN(b)) { |
return true; |
} |
if (a == null || b == null) return false; |
if (a.constructor === RegExp || b.constructor === RegExp) { |
- return (a.constructor === b.constructor) && (a.toString === b.toString); |
+ return (a.constructor === b.constructor) && (a.toString() === b.toString()); |
} |
if ((typeof a) !== 'object' || (typeof b) !== 'object' || |
(a === null) || (b === null)) |
@@ -205,7 +256,7 @@ function assertDoesNotThrow(code) { |
function assertUnreachable(name_opt) { |
// Fix this when we ditch the old test runner. |
- var message = "Fail" + "ure: unreachable" |
+ var message = "Fail" + "ure: unreachable"; |
if (name_opt) { |
message += " - " + name_opt; |
} |