/*
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/
 */

var hitCount;
function watcher(p,o,n) { hitCount++; return n; }

var a = [1];
a.watch('length', watcher);
hitCount = 0;
a.length = 0;
reportCompare(1, hitCount, "lenient; configurable: watchpoint hit");

var b = Object.defineProperty([1],'0',{configurable:false});
b.watch('length', watcher);
hitCount = 0;
var result;
try {
    b.length = 0;    
    result = "no error";
} catch (x) {
    result = x.toString();
}
reportCompare(1, hitCount, "lenient; non-configurable: watchpoint hit");
reportCompare(1, b.length, "lenient; non-configurable: length unchanged");
reportCompare("no error", result, "lenient; non-configurable: no error thrown");

var c = Object.defineProperty([1],'0',{configurable:false});
c.watch('length', watcher);
hitCount = 0;
var threwTypeError;
try {
    (function(){'use strict'; c.length = 0;})();
    threwTypeError = false;
} catch (x) {
    threwTypeError = x instanceof TypeError;
}
reportCompare(1, hitCount, "strict; non-configurable: watchpoint hit");
reportCompare(1, c.length, "strict; non-configurable: length unchanged");
reportCompare(true, threwTypeError, "strict; non-configurable: TypeError thrown");