Index: test/mjsunit/mjsunit.js |
diff --git a/test/mjsunit/mjsunit.js b/test/mjsunit/mjsunit.js |
index 436bdc8184957fcf3a85f50f77d2a110a9980096..41dd24036411b38e3fa4beb197d167e10b719175 100644 |
--- a/test/mjsunit/mjsunit.js |
+++ b/test/mjsunit/mjsunit.js |
@@ -31,37 +31,45 @@ function MjsUnitAssertionError(message) { |
this.stack = new Error("").stack; |
} |
-MjsUnitAssertionError.prototype.toString = function () { |
- return this.message; |
-} |
- |
/* |
* This file is included in all mini jsunit test cases. The test |
* framework expects lines that signal failed tests to start with |
* the f-word and ignore all other lines. |
*/ |
+ |
+MjsUnitAssertionError.prototype.toString = function () { |
+ return this.message; |
+}; |
+ |
+ |
+function classOf(object) { |
+ var string = Object.prototype.toString.call(object); |
+ // String has format [object <ClassName>]. |
+ return string.substring(8, string.length - 1); |
+} |
+ |
+ |
function MjsUnitToString(value) { |
switch (typeof value) { |
case "string": |
return JSON.stringify(value); |
case "number": |
if (value === 0 && (1 / value) < 0) return "-0"; |
+ // FALLTHROUGH. |
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) { |
+ var objectClass = classOf(value); |
+ switch (objectClass) { |
case "Number": |
case "String": |
case "Boolean": |
case "Date": |
- return clazz + "(" + MjsUnitToString(value.valueOf()) + ")"; |
+ return objectClass + "(" + MjsUnitToString(value.valueOf()) + ")"; |
case "RegExp": |
return value.toString(); |
case "Array": |
@@ -69,7 +77,7 @@ function MjsUnitToString(value) { |
case "Object": |
break; |
default: |
- return clazz + "()"; |
+ return objectClass + "()"; |
} |
// [[Class]] is "Object". |
var constructor = value.constructor.name; |
@@ -102,11 +110,13 @@ function fail(expected, found, name_opt) { |
function deepObjectEquals(a, b) { |
var aProps = []; |
- for (var key in a) |
+ for (var key in a) { |
aProps.push(key); |
+ } |
var bProps = []; |
- for (var key in b) |
+ for (key in b) { |
bProps.push(key); |
+ } |
aProps.sort(); |
bProps.sort(); |
if (!deepEquals(aProps, bProps)) |
@@ -129,14 +139,16 @@ function deepEquals(a, 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()); |
+ var aClass = classOf(a); |
+ var bClass = classOf(b); |
+ if (aClass === "RegExp" || bClass === "RegExp") { |
+ return (aClass === bClass) && (a.toString() === b.toString()); |
} |
if ((typeof a) !== 'object' || (typeof b) !== 'object' || |
(a === null) || (b === null)) |
return false; |
- if (a.constructor === Array) { |
- if (b.constructor !== Array) |
+ if (aClass === "Array") { |
+ if (bClass !== "Array") |
return false; |
if (a.length != b.length) |
return false; |
@@ -149,6 +161,8 @@ function deepEquals(a, b) { |
} |
} |
return true; |
+ } else if (bClass == "Array") { |
+ return false; |
} else { |
return deepObjectEquals(a, b); |
} |