| Index: test/mjsunit/harmony/reflect.js
|
| diff --git a/test/mjsunit/harmony/reflect.js b/test/mjsunit/harmony/reflect.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d9cd51f649d6d8c8f75b723658ade0f4f304de11
|
| --- /dev/null
|
| +++ b/test/mjsunit/harmony/reflect.js
|
| @@ -0,0 +1,210 @@
|
| +// Copyright 2015 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.
|
| +
|
| +// Flags: --harmony-reflect
|
| +
|
| +// TODO(neis): Test with proxies.
|
| +
|
| +
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// (Auxiliaries)
|
| +
|
| +
|
| +"use strict";
|
| +
|
| +var global = this;
|
| +
|
| +var sym = Symbol("gaga");
|
| +
|
| +var objects = [
|
| + {},
|
| + [],
|
| + function() {},
|
| + function() {
|
| + return arguments;
|
| + }(),
|
| + function() {
|
| + 'use strict';
|
| + return arguments;
|
| + }(),
|
| + Object(1),
|
| + Object(true),
|
| + Object('bla'),
|
| + new Date,
|
| + new RegExp,
|
| + new Set,
|
| + new Map,
|
| + new WeakMap,
|
| + new WeakSet,
|
| + new ArrayBuffer(10),
|
| + new Int32Array(5),
|
| + Object,
|
| + Function,
|
| + Date,
|
| + RegExp,
|
| + global
|
| +];
|
| +
|
| +function prepare(tgt) {
|
| + tgt["bla"] = true;
|
| + tgt[4] = 42;
|
| + tgt[sym] = "foo";
|
| + tgt["noconf"] = 43;
|
| + Object.defineProperty(tgt, "noconf", {configurable: false});
|
| +}
|
| +
|
| +
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// Reflect.get
|
| +
|
| +
|
| +(function testReflectGetArity() {
|
| + assertEquals(3, Reflect.get.length);
|
| +})();
|
| +
|
| +
|
| +(function testReflectGetOnNonObject() {
|
| + assertThrows(function() { Reflect.get(); }, TypeError);
|
| + assertThrows(function() { Reflect.get(42, "bla"); }, TypeError);
|
| + assertThrows(function() { Reflect.get(null, "bla"); }, TypeError);
|
| +})();
|
| +
|
| +
|
| +(function testReflectGetKeyConversion() {
|
| + var tgt = {bla: 42};
|
| + var a = { [Symbol.toPrimitive]: function() { return "bla" } };
|
| + var b = { [Symbol.toPrimitive]: function() { throw "gaga" } };
|
| + assertEquals(42, Reflect.get(tgt, a));
|
| + assertThrows(function() { Reflect.get(tgt, b); }, "gaga");
|
| +})();
|
| +
|
| +
|
| +(function testReflectGetOnObject() {
|
| + for (let tgt of objects) {
|
| + prepare(tgt);
|
| + assertEquals(true, Reflect.get(tgt, "bla"));
|
| + assertEquals(42, Reflect.get(tgt, 4));
|
| + assertEquals(42, Reflect.get(tgt, "4"));
|
| + assertEquals("foo", Reflect.get(tgt, sym));
|
| + assertEquals(undefined, Reflect.get(tgt, "doesnotexist"));
|
| + assertEquals(undefined, Reflect.get(tgt, 666));
|
| + }
|
| +})();
|
| +
|
| +
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// Reflect.has
|
| +
|
| +
|
| +(function testReflectHasArity() {
|
| + assertEquals(2, Reflect.has.length);
|
| +})();
|
| +
|
| +
|
| +(function testReflectHasOnNonObject() {
|
| + assertThrows(function() { Reflect.has(); }, TypeError);
|
| + assertThrows(function() { Reflect.has(42, "bla"); }, TypeError);
|
| + assertThrows(function() { Reflect.has(null, "bla"); }, TypeError);
|
| +})();
|
| +
|
| +
|
| +(function testReflectHasKeyConversion() {
|
| + var tgt = {bla: 42};
|
| + var a = { [Symbol.toPrimitive]: function() { return "bla" } };
|
| + var b = { [Symbol.toPrimitive]: function() { throw "gaga" } };
|
| + assertTrue(Reflect.has(tgt, a));
|
| + assertThrows(function() { Reflect.has(tgt, b); }, "gaga");
|
| +})();
|
| +
|
| +
|
| +(function testReflectHasOnObject() {
|
| + for (let tgt of objects) {
|
| + prepare(tgt);
|
| + assertTrue(Reflect.has(tgt, "bla"));
|
| + assertTrue(Reflect.has(tgt, 4));
|
| + assertTrue(Reflect.has(tgt, "4"));
|
| + assertTrue(Reflect.has(tgt, sym));
|
| + assertFalse(Reflect.has(tgt, "doesnotexist"));
|
| + assertFalse(Reflect.has(tgt, 666));
|
| + }
|
| +})();
|
| +
|
| +
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// Reflect.deleteProperty
|
| +
|
| +
|
| +(function testReflectDeletePropertyArity() {
|
| + assertEquals(2, Reflect.deleteProperty.length);
|
| +})();
|
| +
|
| +
|
| +(function testReflectDeletePropertyOnNonObject() {
|
| + assertThrows(function() { Reflect.deleteProperty(); }, TypeError);
|
| + assertThrows(function() { Reflect.deleteProperty(42, "bla"); }, TypeError);
|
| + assertThrows(function() { Reflect.deleteProperty(null, "bla"); }, TypeError);
|
| +})();
|
| +
|
| +
|
| +(function testReflectDeletePropertyKeyConversion() {
|
| + var tgt = {bla: 42};
|
| + var a = { [Symbol.toPrimitive]: function() { return "bla" } };
|
| + var b = { [Symbol.toPrimitive]: function() { throw "gaga" } };
|
| + assertTrue(Reflect.deleteProperty(tgt, a));
|
| + assertThrows(function() { Reflect.deleteProperty(tgt, b); }, "gaga");
|
| +})();
|
| +
|
| +
|
| +(function testReflectDeletePropertyOnObject() {
|
| + for (let tgt of objects) {
|
| + prepare(tgt);
|
| + assertTrue(Reflect.deleteProperty(tgt, "bla"));
|
| + assertEquals(undefined, Object.getOwnPropertyDescriptor(tgt, "bla"));
|
| + if (tgt instanceof Int32Array) {
|
| + assertFalse(Reflect.deleteProperty(tgt, 4));
|
| + } else {
|
| + assertTrue(Reflect.deleteProperty(tgt, 4));
|
| + assertEquals(undefined, Object.getOwnPropertyDescriptor(tgt, 4));
|
| + }
|
| + assertTrue(Reflect.deleteProperty(tgt, sym));
|
| + assertEquals(undefined, Object.getOwnPropertyDescriptor(tgt, sym));
|
| + assertTrue(Reflect.deleteProperty(tgt, "doesnotexist"));
|
| + assertTrue(Reflect.deleteProperty(tgt, 666));
|
| + assertFalse(Reflect.deleteProperty(tgt, "noconf"));
|
| + assertEquals(43, tgt.noconf);
|
| + }
|
| +})();
|
| +
|
| +
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// Reflect.isExtensible
|
| +
|
| +
|
| +(function testReflectIsExtensibleArity() {
|
| + assertEquals(1, Reflect.isExtensible.length);
|
| +})();
|
| +
|
| +
|
| +(function testReflectIsExtensibleOnNonObject() {
|
| + assertThrows(function() { Reflect.isExtensible(); }, TypeError);
|
| + assertThrows(function() { Reflect.isExtensible(42); }, TypeError);
|
| + assertThrows(function() { Reflect.isExtensible(null); }, TypeError);
|
| +})();
|
| +
|
| +
|
| +(function testReflectIsExtensibleOnObject() {
|
| + // This should be the last test as it modifies the objects irreversibly.
|
| + for (let tgt of objects) {
|
| + prepare(tgt);
|
| + if (tgt instanceof Int32Array) continue; // issue v8:4460
|
| + assertTrue(Reflect.isExtensible(tgt));
|
| + Object.preventExtensions(tgt);
|
| + assertFalse(Reflect.isExtensible(tgt));
|
| + }
|
| +})();
|
|
|