var hits = 0; var p = { toString() { hits++; return "prop" } }; var obj = { foo: 1 }; var ops = [["obj[p]++", 2], ["++obj[p]", 2], ["--obj[p]", 0], ["obj[p]--", 0], ["obj[p] += 2", 3], ["obj[p] -= 2", -1], ["obj[p] *= 2", 2], ["obj[p] /= 2", 0.5], ["obj[p] %= 2", 1], ["obj[p] >>>= 2", 0], ["obj[p] >>= 2", 0], ["obj[p] <<= 2", 4], ["obj[p] |= 2", 3], ["obj[p] ^= 2", 3], ["obj[p] &= 2", 0]]; var testHits = 0; for (let op of ops) { // Seed the value for each test. obj.prop = 1; // Do the operation. eval(op[0]); assertEq(obj.prop, op[1]); // We should always call toString once, for each operation. testHits++; assertEq(hits, testHits); } if (typeof reportCompare === 'function') reportCompare(0,0,"OK");