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

Unified Diff: test/mjsunit/harmony/new-target.js

Issue 1203813002: [es6] Make new.target work in functions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add test again. It got lost in last patchset Created 5 years, 6 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/x64/builtins-x64.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/new-target.js
diff --git a/test/mjsunit/harmony/new-target.js b/test/mjsunit/harmony/new-target.js
new file mode 100644
index 0000000000000000000000000000000000000000..63e78d5fd57a6f177e4952f6fbbdd8d05d04c385
--- /dev/null
+++ b/test/mjsunit/harmony/new-target.js
@@ -0,0 +1,373 @@
+// 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-classes --harmony-new-target --harmony-reflect
+// Flags: --harmony-rest-parameters --harmony-arrow-functions
+
+
+(function TestClass() {
+ 'use strict';
+
+ var calls = 0;
+ class Base {
+ constructor(_) {
+ assertEquals(Base, new.target);
+ calls++;
+ }
+ }
+ assertInstanceof(new Base(1), Base);
+ assertInstanceof(new Base(1, 2), Base);
+ assertInstanceof(new Base(), Base);
+ assertEquals(3, calls);
+})();
+
+
+(function TestDerivedClass() {
+ 'use strict';
+
+ var calls = 0;
+ class Base {
+ constructor(expected) {
+ assertEquals(expected, new.target);
+ }
+ }
+ class Derived extends Base {
+ constructor(expected) {
+ super(expected);
+ assertEquals(expected, new.target);
+ calls++;
+ }
+ }
+ new Derived(Derived, 'extra');
+ new Derived(Derived);
+ assertEquals(2, calls);
+
+ class Derived2 extends Derived {}
+ calls = 0;
+ new Derived2(Derived2);
+ new Derived2(Derived2, 'extra');
+ assertEquals(2, calls);
+})();
+
+
+(function TestFunctionCall() {
+ var calls;
+ function f(expected) {
+ calls++;
+ assertEquals(expected, new.target);
+ }
+
+ calls = 0;
+ f(undefined);
+ f(undefined, 'extra');
+ f();
+ assertEquals(3, calls);
+
+ calls = 0;
+ f.call({}, undefined);
+ f.call({}, undefined, 'extra');
+ f.call({});
+ assertEquals(3, calls);
+
+ calls = 0;
+ f.apply({}, [undefined]);
+ f.apply({}, [undefined, 'extra']);
+ f.apply({}, []);
+ assertEquals(3, calls);
+})();
+
+
+(function TestFunctionConstruct() {
+ var calls;
+ function f(expected) {
+ calls++;
+ assertEquals(expected, new.target);
+ }
+
+ calls = 0;
+ new f(f);
+ new f(f, 'extra');
+ assertEquals(2, calls);
+})();
+
+
+(function TestClassExtendsFunction() {
+ 'use strict';
+
+ var calls = 0;
+ function f(expected) {
+ assertEquals(expected, new.target);
+ }
+ class Derived extends f {
+ constructor(expected) {
+ super(expected);
+ assertEquals(expected, new.target);
+ calls++;
+ }
+ }
+
+ new Derived(Derived);
+ new Derived(Derived, 'extra');
+ assertEquals(2, calls);
+})();
+
+
+(function TestFunctionReturnObject() {
+ function f(expected) {
+ assertEquals(expected, new.target);
+ return /abc/;
+ }
+
+ assertInstanceof(new f(f), RegExp);
+ assertInstanceof(new f(f, 'extra'), RegExp);
+
+ assertInstanceof(f(undefined), RegExp);
+ assertInstanceof(f(), RegExp);
+ assertInstanceof(f(undefined, 'extra'), RegExp);
+})();
+
+
+(function TestClassReturnObject() {
+ 'use strict';
+
+ class Base {
+ constructor(expected) {
+ assertEquals(expected, new.target);
+ return /abc/;
+ }
+ }
+
+ assertInstanceof(new Base(Base), RegExp);
+ assertInstanceof(new Base(Base, 'extra'), RegExp);
+
+ class Derived extends Base {}
+ assertInstanceof(new Derived(Derived), RegExp);
+ assertInstanceof(new Derived(Derived, 'extra'), RegExp);
+
+ class Derived2 extends Base {
+ constructor(expected) {
+ super(expected);
+ assertInstanceof(this, RegExp);
+ }
+ }
+ assertInstanceof(new Derived2(Derived2), RegExp);
+ assertInstanceof(new Derived2(Derived2, 'extra'), RegExp);
+})();
+
+
+/*
+// TODO(arv): Reflect.construct does not work correctly with a third argument.
+(function TestReflectConstruct() {
+ var calls = 0;
+ function f(expected) {
+ calls++;
+ assertEquals(expected, new.target);
+ }
+
+ var o = Reflect.construct(f, [f]);
+ assertEquals(Object.getPrototypeOf(o), f.prototype);
+ o = Reflect.construct(f, [f, 'extra']);
+ assertEquals(Object.getPrototypeOf(o), f.prototype);
+ assertEquals(2, calls);
+
+ calls = 0;
+ o = Reflect.construct(f, [f], f);
+ assertEquals(Object.getPrototypeOf(o), f.prototype);
+ o = Reflect.construct(f, [f, 'extra'], f);
+ assertEquals(Object.getPrototypeOf(o), f.prototype);
+ assertEquals(2, calls);
+
+
+ function g() {}
+ calls = 0;
+ o = Reflect.construct(f, [g], g);
+ assertEquals(Object.getPrototypeOf(o), g.prototype);
+ o = Reflect.construct(f, [g, 'extra'], g);
+ assertEquals(Object.getPrototypeOf(o), g.prototype);
+ assertEquals(2, calls);
+})();
+*/
+
+
+(function TestRestParametersFunction() {
+ function f(...rest) {
+ assertEquals(rest[0], new.target);
+ }
+
+ assertInstanceof(new f(f), f);
+ assertInstanceof(new f(f, 'extra'), f);
+})();
+
+
+(function TestRestParametersClass() {
+ 'use strict';
+
+ class Base {
+ constructor(...rest) {
+ assertEquals(rest[0], new.target);
+ }
+ }
+
+ assertInstanceof(new Base(Base), Base);
+ assertInstanceof(new Base(Base, 'extra'), Base);
+
+ class Derived extends Base {}
+
+ assertInstanceof(new Derived(Derived), Derived);
+ assertInstanceof(new Derived(Derived, 'extra'), Derived);
+})();
+
+
+(function TestArrowFunction() {
+ function f(expected) {
+ (() => {
+ assertEquals(expected, new.target);
+ })();
+ }
+
+ assertInstanceof(new f(f), f);
+ assertInstanceof(new f(f, 'extra'), f);
+})();
+
+
+(function TestRestParametersClass() {
+ 'use strict';
+
+ class Base {
+ constructor(expected) {
+ (() => {
+ assertEquals(expected, new.target);
+ })();
+ }
+ }
+
+ assertInstanceof(new Base(Base), Base);
+ assertInstanceof(new Base(Base, 'extra'), Base);
+
+ class Derived extends Base {}
+
+ assertInstanceof(new Derived(Derived), Derived);
+ assertInstanceof(new Derived(Derived, 'extra'), Derived);
+})();
+
+
+(function TestSloppyArguments() {
+ var length, a0, a1, a2, nt;
+ function f(x) {
+ assertEquals(length, arguments.length);
+ assertEquals(a0, arguments[0]);
+ assertEquals(a1, arguments[1]);
+ assertEquals(a2, arguments[2]);
+ assertEquals(nt, new.target);
+
+ if (length > 0) {
+ x = 42;
+ assertEquals(42, x);
+ assertEquals(42, arguments[0]);
+
+ arguments[0] = 33;
+ assertEquals(33, x);
+ assertEquals(33, arguments[0]);
+ }
+ }
+
+ nt = f;
+ length = 0;
+ new f();
+
+ length = 1;
+ a0 = 1;
+ new f(1);
+
+ length = 2;
+ a0 = 1;
+ a1 = 2;
+ new f(1, 2);
+
+ length = 3;
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ new f(1, 2, 3);
+
+ nt = undefined;
+ a0 = a1 = a2 = undefined;
+ length = 0;
+ f();
+
+ length = 1;
+ a0 = 1;
+ f(1);
+
+ length = 2;
+ a0 = 1;
+ a1 = 2;
+ f(1, 2);
+
+ length = 3;
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ f(1, 2, 3);
+})();
+
+
+(function TestStrictArguments() {
+ var length, a0, a1, a2, nt;
+ function f(x) {
+ 'use strict';
+ assertEquals(length, arguments.length);
+ assertEquals(a0, arguments[0]);
+ assertEquals(a1, arguments[1]);
+ assertEquals(a2, arguments[2]);
+ assertEquals(nt, new.target);
+
+ if (length > 0) {
+ x = 42;
+ assertEquals(a0, arguments[0]);
+
+ arguments[0] = 33;
+ assertEquals(33, arguments[0]);
+ }
+ }
+
+ nt = f;
+ length = 0;
+ new f();
+
+ length = 1;
+ a0 = 1;
+ new f(1);
+
+ length = 2;
+ a0 = 1;
+ a1 = 2;
+ new f(1, 2);
+
+ length = 3;
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ new f(1, 2, 3);
+
+ nt = undefined;
+ a0 = a1 = a2 = undefined;
+ length = 0;
+ f();
+
+ length = 1;
+ a0 = 1;
+ f(1);
+
+ length = 2;
+ a0 = 1;
+ a1 = 2;
+ f(1, 2);
+
+ length = 3;
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ f(1, 2, 3);
+})();
« no previous file with comments | « src/x64/builtins-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698