Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1587)

Unified Diff: test/mjsunit/harmony/reflect.js

Issue 1415883007: [es6] Partially implement Reflect.set. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/builtins.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/mjsunit/harmony/reflect.js
diff --git a/test/mjsunit/harmony/reflect.js b/test/mjsunit/harmony/reflect.js
index f94e98b221107ed78aa32529a6c4351764756a0d..e61b65e14318931333de18b785da0cbb1ed51961 100644
--- a/test/mjsunit/harmony/reflect.js
+++ b/test/mjsunit/harmony/reflect.js
@@ -52,11 +52,16 @@ function prepare(target) {
target[4] = 42;
target[sym] = "foo";
target["noconf"] = 43;
- Object.defineProperty(target, "noconf", {configurable: false});
+ Object.defineProperty(target, "noconf",
+ { configurable: false });
+ Object.defineProperty(target, "nowrite",
+ { writable: false, configurable: true, value: 44 });
Object.defineProperty(target, "getter",
- { get: function () {return this.bla}, configurable: true });
+ { get: function () {return this.bla}, configurable: true });
Object.defineProperty(target, "setter",
- { set: function () {}, configurable: true });
+ { set: function (x) {this.gaga = x}, configurable: true });
+ Object.defineProperty(target, "setter2",
+ { set: function (x) {}, configurable: true });
}
@@ -130,6 +135,142 @@ function prepare(target) {
////////////////////////////////////////////////////////////////////////////////
+// Reflect.set
+
+
+(function testReflectSetArity() {
+ assertEquals(3, Reflect.set.length);
+})();
+
+
+(function testReflectSetOnNonObject() {
+ assertThrows(function() { Reflect.set(); }, TypeError);
+ assertThrows(function() { Reflect.set(42, "bla"); }, TypeError);
+ assertThrows(function() { Reflect.set(null, "bla"); }, TypeError);
+})();
+
+
+(function testReflectSetKeyConversion() {
+ var target = {};
+ var a = { [Symbol.toPrimitive]: function() { return "bla" } };
+ var b = { [Symbol.toPrimitive]: function() { throw "gaga" } };
+ assertTrue(Reflect.set(target, a, 42));
+ assertEquals(42, target.bla);
+ assertThrows(function() { Reflect.set(target, b, 42); }, "gaga");
+})();
+
+
+(function testReflectSetOnObject() {
+ var receiver = {bla: false};
+ var value = 34234;
+ for (let target of objects) {
+ prepare(target);
+ assertTrue(Reflect.set(target, "bla", value));
+ assertEquals(value, target.bla);
+
+ prepare(target);
+ assertTrue(Reflect.set(target, "bla", value, target));
+ assertEquals(value, target.bla);
+
+ prepare(target);
+ assertTrue(Reflect.set(target, "bla", value, receiver));
+ assertEquals(true, target.bla);
+ assertEquals(value, receiver.bla);
+ receiver.bla = false;
+
+ prepare(target);
+ assertTrue(Reflect.set(target, 4, value));
+ assertEquals(value, target[4]);
+
+ prepare(target);
+ assertTrue(Reflect.set(target, 4, value, target));
+ assertEquals(value, target[4]);
+
+ prepare(target);
+ assertTrue(Reflect.set(target, 4, value, receiver));
+ assertEquals(42, target[4]);
+ assertEquals(value, receiver[4]);
+ delete receiver[4];
+
+ prepare(target);
+ assertTrue(Reflect.set(target, sym, value));
+ assertEquals(value, target[sym]);
+
+ prepare(target);
+ assertTrue(Reflect.set(target, sym, value, target));
+ assertEquals(value, target[sym]);
+
+ prepare(target);
+ assertTrue(Reflect.set(target, sym, value, receiver));
+ assertEquals("foo", target[sym]);
+ assertEquals(value, receiver[sym]);
+ delete receiver[sym];
+
+ prepare(target);
+ assertTrue(Reflect.set(target, "noconf", value));
+ assertEquals(value, target.noconf);
+
+ prepare(target);
+ assertTrue(Reflect.set(target, "noconf", value, target));
+ assertEquals(value, target.noconf);
+
+ prepare(target);
+ assertTrue(Reflect.set(target, "noconf", value, receiver));
+ assertEquals(43, target.noconf);
+ assertEquals(value, receiver.noconf);
+ delete receiver.noconf;
+
+ assertTrue(Reflect.set(target, "setter", value));
+ assertEquals(value, target.gaga)
+ delete target.gaga;
+
+ assertTrue(Reflect.set(target, "setter", value, target));
+ assertEquals(value, target.gaga)
+ delete target.gaga;
+
+ assertTrue(Reflect.set(target, "setter", value, receiver));
+ assertFalse("gaga" in target);
+ assertEquals(value, receiver.gaga);
+ delete receiver.gaga;
+
+ assertFalse(Reflect.set(target, "nowrite", value));
+ assertEquals(44, target.nowrite);
+
+ assertFalse(Reflect.set(target, "nowrite", value, target));
+ assertEquals(44, target.nowrite);
+
+ assertFalse(Reflect.set(target, "nowrite", value, receiver));
+ assertEquals(44, target.nowrite);
+ assertFalse("nowrite" in receiver);
+
+ // Data vs Non-Writable
+ // TODO(neis): This must return false but currently doesn't.
+ // assertFalse(Reflect.set({}, "nowrite", value, target));
+
+ // Data vs Accessor
+ // TODO(neis): These must return false but currently don't.
+ // assertFalse(Reflect.set(target, "unknown", value, {set bla(x) {}}));
+ // assertFalse(Reflect.set(target, "unknown", value, {get bla() {}}));
+ // assertFalse(Reflect.set(target, "bla", value, {set bla(x) {}}));
+ // assertFalse(Reflect.set(target, "bla", value, {get bla() {}}));
+
+ // Accessor vs Data
+ assertTrue(Reflect.set({set bla(x) {}}), "bla", value, target);
+ assertFalse(Reflect.set({get bla() {}}, "bla", value, target));
+
+ // Data vs Non-Object
+ assertFalse(Reflect.set({}, "bla", value, null));
+ assertFalse(Reflect.set({bla: 42}, "bla", value, null));
+
+ // Accessor vs Non-Object
+ assertTrue(Reflect.set(target, "setter2", value, null));
+ assertFalse(Reflect.set(target, "getter", value, null));
+ }
+})();
+
+
+
+////////////////////////////////////////////////////////////////////////////////
// Reflect.has
« no previous file with comments | « src/builtins.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698