summaryrefslogtreecommitdiffstats
path: root/js/src/jsapi-tests/testForwardSetProperty.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jsapi-tests/testForwardSetProperty.cpp')
-rw-r--r--js/src/jsapi-tests/testForwardSetProperty.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/js/src/jsapi-tests/testForwardSetProperty.cpp b/js/src/jsapi-tests/testForwardSetProperty.cpp
new file mode 100644
index 0000000000..0ab221a0c1
--- /dev/null
+++ b/js/src/jsapi-tests/testForwardSetProperty.cpp
@@ -0,0 +1,98 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: set ts=8 sts=2 et sw=2 tw=80:
+ */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "js/PropertyAndElement.h" // JS_ForwardSetPropertyTo
+#include "jsapi-tests/tests.h"
+
+using namespace JS;
+
+BEGIN_TEST(testForwardSetProperty) {
+ RootedValue v1(cx);
+ EVAL(
+ "var foundValue; \n"
+ "var obj1 = { set prop(val) { foundValue = this; } }; \n"
+ "obj1;",
+ &v1);
+
+ RootedValue v2(cx);
+ EVAL(
+ "var obj2 = Object.create(obj1); \n"
+ "obj2;",
+ &v2);
+
+ RootedValue v3(cx);
+ EVAL(
+ "var obj3 = {}; \n"
+ "obj3;",
+ &v3);
+
+ RootedObject obj1(cx, &v1.toObject());
+ RootedObject obj2(cx, &v2.toObject());
+ RootedObject obj3(cx, &v3.toObject());
+
+ RootedValue setval(cx, Int32Value(42));
+
+ RootedValue propkey(cx);
+ EVAL("'prop';", &propkey);
+
+ RootedId prop(cx);
+ CHECK(JS_ValueToId(cx, propkey, &prop));
+
+ EXEC(
+ "function assertEq(a, b, msg) \n"
+ "{ \n"
+ " if (!Object.is(a, b)) \n"
+ " throw new Error('Assertion failure: ' + msg); \n"
+ "}");
+
+ // Non-strict setter
+
+ JS::ObjectOpResult result;
+ CHECK(JS_ForwardSetPropertyTo(cx, obj2, prop, setval, v3, result));
+ CHECK(result);
+
+ EXEC("assertEq(foundValue, obj3, 'wrong receiver passed to setter');");
+
+ CHECK(JS_ForwardSetPropertyTo(cx, obj2, prop, setval, setval, result));
+ CHECK(result);
+
+ EXEC(
+ "assertEq(typeof foundValue === 'object', true, \n"
+ " 'passing 42 as receiver to non-strict setter ' + \n"
+ " 'must box');");
+
+ EXEC(
+ "assertEq(foundValue instanceof Number, true, \n"
+ " 'passing 42 as receiver to non-strict setter ' + \n"
+ " 'must box to a Number');");
+
+ EXEC(
+ "assertEq(foundValue.valueOf(), 42, \n"
+ " 'passing 42 as receiver to non-strict setter ' + \n"
+ " 'must box to new Number(42)');");
+
+ // Strict setter
+
+ RootedValue v4(cx);
+ EVAL("({ set prop(val) { 'use strict'; foundValue = this; } })", &v4);
+ RootedObject obj4(cx, &v4.toObject());
+
+ CHECK(JS_ForwardSetPropertyTo(cx, obj4, prop, setval, v3, result));
+ CHECK(result);
+
+ EXEC("assertEq(foundValue, obj3, 'wrong receiver passed to strict setter');");
+
+ CHECK(JS_ForwardSetPropertyTo(cx, obj4, prop, setval, setval, result));
+ CHECK(result);
+
+ EXEC(
+ "assertEq(foundValue, 42, \n"
+ " '42 passed as receiver to strict setter was mangled');");
+
+ return true;
+}
+END_TEST(testForwardSetProperty)