| // Tests for raising --- and non-raising exceptions on access to reference to undefined things... |
| |
| // Locals should throw on access if undefined.. |
| fnShouldThrow(function() { a = x; }, ReferenceError); |
| |
| // Read-modify-write versions of assignment should throw as well |
| fnShouldThrow(function() { x += "foo"; }, ReferenceError); |
| |
| // Other reference types should just return undefined... |
| a = new Object(); |
| fnShouldNotThrow(function() { b = a.x; }); |
| fnShouldNotThrow(function() { b = a['x']; }); |
| fnShouldNotThrow(function() { a['x'] += 'baz'; }); |
| shouldBe("a['x']", '"undefinedbaz"'); |
| fnShouldNotThrow(function() { b = a.y; }); |
| fnShouldNotThrow(function() { a.y += 'glarch'; }); |
| shouldBe("a['y']", '"undefinedglarch"'); |
| |
| |
| // Helpers! |
| function fnShouldThrow(f, exType) |
| { |
| var exception; |
| var _av; |
| try { |
| _av = f(); |
| } catch (e) { |
| exception = e; |
| } |
| |
| if (exception) { |
| if (typeof exType == "undefined" || exception instanceof exType) |
| testPassed(f + " threw exception " + exception + "."); |
| else |
| testFailed(f + " should throw exception " + exType + ". Threw exception " + exception + "."); |
| } else if (typeof _av == "undefined") |
| testFailed(f + " should throw exception " + exType + ". Was undefined."); |
| else |
| testFailed(f + " should throw exception " + exType + ". Was " + _av + "."); |
| } |
| |
| function fnShouldNotThrow(f) |
| { |
| try { |
| f(); |
| testPassed(f + " did not throw an exception"); |
| } catch (e) { |
| testFailed(f + " threw an exception " + e + " when no exception expected"); |
| } |
| } |