From 0ea69c7864a16c28d3b1849397ff569e9725cc08 Mon Sep 17 00:00:00 2001 From: "Benjamin E. Coe" Date: Wed, 18 Dec 2019 11:35:28 -0500 Subject: [PATCH] feat: regression tests for optional call (#2429) * feat: regression tests for optional call * chore: address code review * chore: fix assertion * chore: set context rather than return context --- .../new-target-optional-call.js | 31 +++++++++++++++++++ .../super-property-optional-call.js | 30 ++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 test/language/expressions/optional-chaining/new-target-optional-call.js create mode 100644 test/language/expressions/optional-chaining/super-property-optional-call.js diff --git a/test/language/expressions/optional-chaining/new-target-optional-call.js b/test/language/expressions/optional-chaining/new-target-optional-call.js new file mode 100644 index 0000000000..2ae2ea6619 --- /dev/null +++ b/test/language/expressions/optional-chaining/new-target-optional-call.js @@ -0,0 +1,31 @@ +// Copyright 2019 Google, LLC. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: prod-OptionalExpression +description: > + optional call invoked on new.target should be equivalent to call +info: | + OptionalExpression + MemberExpression OptionalChain + NewTarget OptionalChain +features: [optional-chaining] +includes: [fnGlobalObject.js] +---*/ + +const newTargetContext = (function() { return this; })(); + +let called = false; +// should be set to 'undefined' or global context, depending on whether +// mode is strict or sloppy. +let context = null; +function Base() { + called = true; + context = this; +} +function Foo(blerg) { + new.target?.(); +} + +Reflect.construct(Foo, [], Base); +assert(context === newTargetContext); +assert.sameValue(called, true); diff --git a/test/language/expressions/optional-chaining/super-property-optional-call.js b/test/language/expressions/optional-chaining/super-property-optional-call.js new file mode 100644 index 0000000000..cd572ade4a --- /dev/null +++ b/test/language/expressions/optional-chaining/super-property-optional-call.js @@ -0,0 +1,30 @@ +// Copyright 2019 Google, LLC. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: prod-OptionalExpression +description: > + optional call invoked on super method should be equivalent to call +info: | + OptionalExpression + MemberExpression OptionalChain + SuperProperty OptionalChain +features: [optional-chaining] +---*/ + +let called = false; +let context; +class Base { + method() { + called = true; + context = this; + } +} +class Foo extends Base { + method() { + super.method?.(); + } +} +const foo = new Foo(); +foo.method(); +assert(foo === context); +assert.sameValue(called, true);