// 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. function CheckNoPrototype(object) { var desc = Object.getOwnPropertyDescriptor(object, "prototype"); assertEquals(undefined, desc); } function CheckReadonlyPrototype(object) { var desc = Object.getOwnPropertyDescriptor(object, "prototype"); assertTrue(desc != undefined); assertFalse(desc.enumerable); assertFalse(desc.configurable); assertFalse(desc.writable); } function CheckMethodEx(object, prop_name, function_name, length) { var desc = Object.getOwnPropertyDescriptor(object, prop_name); assertTrue(desc != undefined); assertEquals(function_name, desc.value.name); assertEquals(length, desc.value.length, "Bad length of \"" + function_name + "\""); assertFalse(desc.enumerable); assertTrue(desc.configurable); assertTrue(desc.writable); assertThrows(() => new desc.value()); // Check that built-in function is strict. assertThrows(() => desc.value.arguments); assertThrows(() => desc.value.caller); } function CheckMethod(object, name, length) { CheckMethodEx(object, name, name, length); } function CheckGetter(object, name) { var desc = Object.getOwnPropertyDescriptor(object, name); assertTrue(desc != undefined); var expected_name = "get "; if (typeof(name) == "symbol") { name = name.toString().match("Symbol\\((.*)\\)")[1]; expected_name += "[" + name + "]"; } else { expected_name += name; } assertEquals(expected_name, desc.get.name); assertEquals(0, desc.get.length); assertFalse(desc.enumerable); assertTrue(desc.configurable); // Check that built-in function is strict. assertThrows(() => desc.get.arguments); assertThrows(() => desc.get.caller); } (function TestIntrinsicConstructors() { CheckReadonlyPrototype(Object); CheckReadonlyPrototype(Function); CheckReadonlyPrototype(Number); CheckReadonlyPrototype(Boolean); CheckReadonlyPrototype(Symbol); CheckReadonlyPrototype(Date); CheckReadonlyPrototype(RegExp); CheckReadonlyPrototype(DataView); CheckReadonlyPrototype(ArrayBuffer); var AsyncFunction = (async function(){}).constructor; CheckReadonlyPrototype(AsyncFunction); var GeneratorFunction = (function*(){}).constructor; CheckReadonlyPrototype(GeneratorFunction); CheckReadonlyPrototype(Error); CheckReadonlyPrototype(SyntaxError); CheckReadonlyPrototype(RangeError); CheckReadonlyPrototype(TypeError); CheckReadonlyPrototype(ReferenceError); CheckReadonlyPrototype(EvalError); CheckReadonlyPrototype(URIError); CheckReadonlyPrototype(Error); })(); (function TestIntl() { if (typeof (Intl) == "undefined") return; CheckMethod(Intl, "getCanonicalLocales", 1); CheckReadonlyPrototype(Intl.Collator); CheckMethod(Intl.Collator, "supportedLocalesOf", 1); CheckGetter(Intl.Collator.prototype, "compare"); CheckMethod(Intl.Collator.prototype, "resolvedOptions", 0); CheckReadonlyPrototype(Intl.NumberFormat); CheckMethod(Intl.NumberFormat, "supportedLocalesOf", 1); CheckGetter(Intl.NumberFormat.prototype, "format"); CheckMethod(Intl.NumberFormat.prototype, "resolvedOptions", 0); CheckReadonlyPrototype(Intl.DateTimeFormat); CheckMethod(Intl.DateTimeFormat, "supportedLocalesOf", 1); CheckGetter(Intl.DateTimeFormat.prototype, "format"); CheckMethod(Intl.DateTimeFormat.prototype, "resolvedOptions", 0); CheckMethod(Intl.DateTimeFormat.prototype, "formatToParts", 1); CheckReadonlyPrototype(Intl.v8BreakIterator); CheckMethod(Intl.v8BreakIterator, "supportedLocalesOf", 1); CheckMethod(Intl.v8BreakIterator.prototype, "resolvedOptions", 0); CheckGetter(Intl.v8BreakIterator.prototype, "adoptText"); CheckGetter(Intl.v8BreakIterator.prototype, "first"); CheckGetter(Intl.v8BreakIterator.prototype, "next"); CheckGetter(Intl.v8BreakIterator.prototype, "current"); CheckGetter(Intl.v8BreakIterator.prototype, "breakType"); CheckMethod(String.prototype, "localeCompare", 1); CheckMethod(String.prototype, "toLocaleLowerCase", 0); CheckMethod(String.prototype, "toLocaleUpperCase", 0); CheckMethod(Number.prototype, "toLocaleString", 0); CheckMethod(Date.prototype, "toLocaleString", 0); CheckMethod(Date.prototype, "toLocaleDateString", 0); CheckMethod(Date.prototype, "toLocaleTimeString", 0); })(); (function TestCollection() { CheckReadonlyPrototype(Set); CheckMethod(Set.prototype, "add", 1); CheckMethod(Set.prototype, "delete", 1); CheckMethod(Set.prototype, "entries", 0); assertTrue(Set.prototype.keys === Set.prototype.values); assertTrue(Set.prototype[Symbol.iterator] === Set.prototype.values); CheckMethod(Set.prototype, "values", 0); var SetIteratorPrototype = (new Set())[Symbol.iterator]().__proto__; CheckMethod(SetIteratorPrototype, "next", 0); assertEquals("Set Iterator", SetIteratorPrototype[Symbol.toStringTag]); assertEquals( undefined, Object.getOwnPropertyDescriptor(SetIteratorPrototype, "constructor")); CheckReadonlyPrototype(Map); CheckMethod(Map.prototype, "set", 2); CheckMethod(Map.prototype, "delete", 1); CheckMethod(Map.prototype, "entries", 0); CheckMethod(Map.prototype, "keys", 0); CheckMethod(Map.prototype, "values", 0); assertTrue(Map.prototype[Symbol.iterator] === Map.prototype.entries); var MapIteratorPrototype = (new Map())[Symbol.iterator]().__proto__; CheckMethod(MapIteratorPrototype, "next", 0); assertEquals("Map Iterator", MapIteratorPrototype[Symbol.toStringTag]); assertEquals( undefined, Object.getOwnPropertyDescriptor(MapIteratorPrototype, "constructor")); CheckReadonlyPrototype(WeakSet); assertEquals(0, WeakSet.length); CheckMethod(WeakSet.prototype, "add", 1); CheckMethod(WeakSet.prototype, "delete", 1); CheckMethod(WeakSet.prototype, "has", 1); CheckReadonlyPrototype(WeakMap); assertEquals(0, WeakMap.length); CheckMethod(WeakMap.prototype, "delete", 1); CheckMethod(WeakMap.prototype, "get", 1); CheckMethod(WeakMap.prototype, "has", 1); CheckMethod(WeakMap.prototype, "set", 2); })(); (function TestTypedArrays() { var TypedArray = Uint8Array.__proto__; CheckReadonlyPrototype(Int8Array); CheckReadonlyPrototype(Uint8Array); CheckReadonlyPrototype(Uint8ClampedArray); CheckReadonlyPrototype(Int16Array); CheckReadonlyPrototype(Uint16Array); CheckReadonlyPrototype(Int32Array); CheckReadonlyPrototype(Uint32Array); CheckReadonlyPrototype(Float32Array); CheckReadonlyPrototype(Float64Array); CheckReadonlyPrototype(TypedArray); CheckMethod(TypedArray, "of", 0); CheckMethod(TypedArray, "from", 1); CheckMethod(TypedArray.prototype, "subarray", 2); CheckMethod(TypedArray.prototype, "set", 1); CheckGetter(TypedArray.prototype, Symbol.toStringTag); CheckMethod(TypedArray.prototype, "filter", 1); CheckMethod(TypedArray.prototype, "find", 1); CheckMethod(TypedArray.prototype, "findIndex", 1); CheckMethod(TypedArray.prototype, "sort", 1); CheckMethod(TypedArray.prototype, "toLocaleString", 0); CheckMethod(TypedArray.prototype, "join", 1); })(); (function TestArray() { CheckReadonlyPrototype(Array); CheckMethod(Array, "of", 0); CheckMethod(Array, "from", 1); CheckMethod(Array.prototype, "concat", 1); CheckMethod(Array.prototype, "copyWithin", 2); CheckMethod(Array.prototype, "every", 1); CheckMethod(Array.prototype, "fill", 1); CheckMethod(Array.prototype, "filter", 1); CheckMethod(Array.prototype, "find", 1); CheckMethod(Array.prototype, "findIndex", 1); CheckMethod(Array.prototype, "includes", 1); CheckMethod(Array.prototype, "indexOf", 1); CheckMethod(Array.prototype, "join", 1); CheckMethod(Array.prototype, "lastIndexOf", 1); CheckMethod(Array.prototype, "map", 1); CheckMethod(Array.prototype, "pop", 0); CheckMethod(Array.prototype, "push", 1); CheckMethod(Array.prototype, "reduce", 1); CheckMethod(Array.prototype, "reduceRight", 1); CheckMethod(Array.prototype, "reverse", 0); CheckMethod(Array.prototype, "shift", 0); CheckMethod(Array.prototype, "slice", 2); CheckMethod(Array.prototype, "some", 1); CheckMethod(Array.prototype, "sort", 1); CheckMethod(Array.prototype, "splice", 2); CheckMethod(Array.prototype, "toLocaleString", 0); CheckMethod(Array.prototype, "toString", 0); CheckMethod(Array.prototype, "unshift", 1); CheckMethod(Array.prototype, "entries", 0); CheckMethod(Array.prototype, "forEach", 1); CheckMethod(Array.prototype, "keys", 0); CheckMethodEx(Array.prototype, Symbol.iterator, "values", 0); })(); (function TestPromise() { CheckReadonlyPrototype(Promise); CheckMethod(Promise, "all", 1); CheckMethod(Promise, "race", 1); CheckMethod(Promise, "reject", 1); CheckMethod(Promise, "resolve", 1); })(); (function TestProxy() { CheckNoPrototype(Proxy); CheckMethod(Proxy, "revocable", 2); })(); (function TestString() { CheckReadonlyPrototype(String); CheckMethod(String, "raw", 1); CheckMethod(String.prototype, "codePointAt", 1); CheckMethod(String.prototype, "match", 1); CheckMethod(String.prototype, "padEnd", 1); CheckMethod(String.prototype, "padStart", 1); CheckMethod(String.prototype, "repeat", 1); CheckMethod(String.prototype, "search", 1); CheckMethod(String.prototype, "link", 1); CheckMethod(String.prototype, "anchor", 1); CheckMethod(String.prototype, "fontcolor", 1); CheckMethod(String.prototype, "fontsize", 1); CheckMethod(String.prototype, "big", 0); CheckMethod(String.prototype, "blink", 0); CheckMethod(String.prototype, "bold", 0); CheckMethod(String.prototype, "fixed", 0); CheckMethod(String.prototype, "italics", 0); CheckMethod(String.prototype, "small", 0); CheckMethod(String.prototype, "strike", 0); CheckMethod(String.prototype, "sub", 0); CheckMethod(String.prototype, "sup", 0); })();