blob: 357e9b087a45b995970469563a0ed9b13e7ecf37 [file] [log] [blame]
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/ */
// Reflect.get gets the value of a property.
var x = {p: 1};
assertEq(Reflect.get(x, "p"), 1);
assertEq(Reflect.get(x, "toString"), Object.prototype.toString);
assertEq(Reflect.get(x, "missing"), undefined);
// === Various targets
// Array
assertEq(Reflect.get([], 700), undefined);
assertEq(Reflect.get(["zero", "one"], 1), "one");
// TypedArray
assertEq(Reflect.get(new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7]), 7), 7);
// Treatment of NaN
var f = new Float64Array([NaN]);
var u = new Uint32Array(f.buffer);
u[0]++;
u[1]++;
assertEq(f[0], NaN);
assertEq(Reflect.get(f, 0), NaN);
// Proxy with no get handler
assertEq(Reflect.get(new Proxy(x, {}), "p"), 1);
// Proxy with a get handler
var obj = new Proxy(x, {
get(t, k, r) { return k + "ful"; }
});
assertEq(Reflect.get(obj, "mood"), "moodful");
// Exceptions thrown by a proxy's get handler are propagated.
assertThrowsInstanceOf(() => Reflect.get(obj, Symbol()), TypeError);
// Ordinary object, property has a setter and no getter
obj = {set name(x) {}};
assertEq(Reflect.get(obj, "name"), undefined);
// === Receiver
// Receiver argument is passed to getters as the this-value.
obj = { get x() { return this; }};
assertEq(Reflect.get(obj, "x", Math), Math);
assertEq(Reflect.get(Object.create(obj), "x", JSON), JSON);
// If missing, target is passed instead.
assertEq(Reflect.get(obj, "x"), obj);
// Receiver argument is passed to the proxy get handler.
obj = new Proxy({}, {
get(t, k, r) {
assertEq(k, "itself");
return r;
}
});
assertEq(Reflect.get(obj, "itself"), obj);
assertEq(Reflect.get(obj, "itself", Math), Math);
assertEq(Reflect.get(Object.create(obj), "itself", Math), Math);
// The receiver shouldn't have to be an object---but we do not implement that
// correctly yet (bug 603201). For now, test the wrong behavior just to make
// sure we don't crash.
var result;
try {
result = Reflect.get(obj, "x", 37.2);
} catch (exc) {
result = exc;
}
if (result === 37.2) {
throw new Error("Congratulations on fixing bug 603201! " +
"Please update this test for 1 karma point.");
}
assertEq(result instanceof TypeError, true);
// For more Reflect.get tests, see target.js and propertyKeys.js.
reportCompare(0, 0);