// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Debug = debug.Debug var exception = null; var date = new Date(); var map = new Map().set("a", "b").set("c", "d"); var set = new Set([1, 2]); var weak_key = []; var weak_map = new WeakMap().set(weak_key, "a").set({}, "b"); var weak_set = new WeakSet([weak_key, {}]); var add = function (a, b) { return a + b; }; var number_value = 13; function get_number() { return typeof(number_value); }; function listener(event, exec_state, event_data, data) { if (event != Debug.DebugEvent.Break) return; try { function success(expectation, source) { var result = exec_state.frame(0).evaluate(source, true).value(); if (expectation !== undefined) assertEquals(expectation, result); } function fail(source) { assertThrows(() => exec_state.frame(0).evaluate(source, true), EvalError); } // Test Function-related functions. success("func", `(function func(){}).prototype.constructor.name`); success("[object Object]", `(function func(){}).prototype.toString()`); success(12, `add.bind(null, 10)(2)`); success(3, `add.call(null, 1, 2)`); success(3, `add.apply(null, [1, 2])`); // Test Date.prototype functions. success(undefined, `Date()`); success(undefined, `new Date()`); success(undefined, `Date.now()`); success(undefined, `Date.parse(1)`); for (f of Object.getOwnPropertyNames(Date.prototype)) { if (typeof Date.prototype[f] === "function") { if (f.startsWith("set")) { fail(`date.${f}(5);`, true); } else if (f.startsWith("toLocale") && typeof Intl === "undefined") { continue; } else { success(undefined, `date.${f}();`); } } } // Test Boolean. success(true, `Boolean(1)`); success(new Boolean(true), `new Boolean(1)`); success("true", `true.toString()`); success(true, `true.valueOf()`); // Test global functions. success(1, `parseInt("1")`); success(1.3, `parseFloat("1.3")`); success("abc", `decodeURI("abc")`); success("abc", `encodeURI("abc")`); success("abc", `decodeURIComponent("abc")`); success("abc", `encodeURIComponent("abc")`); success("abc", `escape("abc")`); success("abc", `unescape("abc")`); success(true, `isFinite(0)`); success(true, `isNaN(0/0)`); success("object", `typeof date`); success("number", `get_number()`); // Test Map functions. success(undefined, `new Map()`); success("[object Map]", `map.toString()`); success("b", `map.get("a")`); success(true, `map.get("x") === undefined`); success(undefined, `map.entries()`); success(undefined, `map.keys()`); success(undefined, `map.values()`); success(undefined, `map.forEach(()=>1)`); success(true, `map.has("c")`); success(2, `map.size`); success(undefined, `new Map([[1, 2]])`); fail(`map.delete("a")`); fail(`map.clear()`); fail(`map.set("x", "y")`); // Test Set functions. success(undefined, `new Set()`); success("[object Set]", `set.toString()`); success(undefined, `set.entries()`); success(undefined, `set.keys()`); success(undefined, `set.values()`); success(undefined, `set.forEach(()=>1)`); success(true, `set.has(1)`); success(2, `set.size`); success(1, `new Set([1]).size`); fail(`set.add(2)`); fail(`set.delete(1)`); fail(`set.clear()`); // Test WeakMap functions. success(undefined, `new WeakMap()`); success("[object WeakMap]", `weak_map.toString()`); success("a", `weak_map.get(weak_key)`); success(true, `weak_map.get([]) === undefined`); success(true, `weak_map.has(weak_key)`); fail(`new WeakMap([[[], {}]])`); fail(`weak_map.delete("a")`); fail(`weak_map.set("x", "y")`); // Test WeakSet functions. success(undefined, `new WeakSet()`); success("[object WeakSet]", `weak_set.toString()`); success(true, `weak_set.has(weak_key)`); fail(`new WeakSet([[], {}])`); fail(`weak_set.add([])`); fail(`weak_set.delete("a")`); // Test BigInt functions. success(10n, `BigInt('10')`); success(10n, `BigInt.asIntN(10, 10n)`); success(10n, `BigInt.asUintN(10, 10n)`); success("10", `10n.toString()`); success(10n, `10n.valueOf()`); } catch (e) { exception = e; print(e, e.stack); }; }; // Add the debug event listener. Debug.setListener(listener); function f() { debugger; }; f(); assertNull(exception);