| // 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); |
| })(); |