/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ (function(global) { /* * Return true if both of these return true: * - LENIENT_PRED applied to CODE * - STRICT_PRED applied to CODE with a use strict directive added to the front * * Run STRICT_PRED first, for testing code that affects the global environment * in loose mode, but fails in strict mode. */ global.testLenientAndStrict = function testLenientAndStrict(code, lenient_pred, strict_pred) { return (strict_pred("'use strict'; " + code) && lenient_pred(code)); } /* * parsesSuccessfully(CODE) returns true if CODE parses as function * code without an error. */ global.parsesSuccessfully = function parsesSuccessfully(code) { try { Function(code); return true; } catch (exception) { return false; } }; /* * parseRaisesException(EXCEPTION)(CODE) returns true if parsing CODE * as function code raises EXCEPTION. */ global.parseRaisesException = function parseRaisesException(exception) { return function (code) { try { Function(code); return false; } catch (actual) { return exception.prototype.isPrototypeOf(actual); } }; }; /* * returns(VALUE)(CODE) returns true if evaluating CODE (as eval code) * completes normally (rather than throwing an exception), yielding a value * strictly equal to VALUE. */ global.returns = function returns(value) { return function(code) { try { return eval(code) === value; } catch (exception) { return false; } } } })(this);