var o = { valueOf : function() { return { toString : function() { return "fail" } } }, toString : function() { return "good" } }; var p = { valueOf : function() { return { toString : function() { return "0" } } }, toString : function() { return "7" } }; var q = { toString : function() { return { valueOf : function() { return "0" } } }, valueOf : function() { return "7" } }; function assert(b, s) { if (b) return; assertEq("imacro produces incorrect result for " + s, "fail"); } function run() { for (var i = 0; i < 5; ++i) { // equality / inequality assert(!(o == "fail"), "obj == any"); assert(!("fail" == o), "any == obj"); assert(!(o != "good"), "obj != any"); assert(!("good" != o), "any != obj"); // binary assert(!((p | 3) != 7), "obj | any"); assert(!((3 | p) != 7), "any | obj"); assert(!((p | p) != 7), "obj | obj"); assert(!((p & 3) != 3), "obj & any"); assert(!((3 & p) != 3), "any & obj"); assert(!((p & p) != 7), "obj & obj"); assert(!((p * 3) != 21), "obj * any"); assert(!((3 * p) != 21), "any * obj"); assert(!((p * p) != 49), "obj * obj"); // addition assert(!(o + "" != "good"), "obj + any"); assert(!("" + o != "good"), "any + obj"); assert(!(o + o != "goodgood"), "any + any"); // sign assert(!(-p != -7), "-obj"); assert(!(+p != 7), "+obj"); // String assert(!(String(q) != "7"), "String(obj)"); assert(!(new String(q) != "7"), "new String(obj)"); } return true; } run();