From 3efcde4ba70d07f553c34a66aff439d5be6febe7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Bargull?= <andre.bargull@gmail.com>
Date: Wed, 30 Jan 2019 13:34:32 -0800
Subject: [PATCH] Add tests for setting class-name in ClassDefinitionEvaluation
 (#2057)

Spec PR: tc39/ecma262#1372
---
 .../class/static/method-number.js             |  4 +--
 .../class/static/method-string.js             |  4 +--
 .../class/static/method-symbol.js             |  4 +--
 ...class-name-static-initializer-anonymous.js | 26 ++++++++++++++++++
 .../class-name-static-initializer-decl.js     | 26 ++++++++++++++++++
 ...-name-static-initializer-default-export.js | 27 +++++++++++++++++++
 .../class-name-static-initializer-expr.js     | 26 ++++++++++++++++++
 7 files changed, 111 insertions(+), 6 deletions(-)
 create mode 100644 test/language/expressions/class/elements/class-name-static-initializer-anonymous.js
 create mode 100644 test/language/expressions/class/elements/class-name-static-initializer-decl.js
 create mode 100644 test/language/expressions/class/elements/class-name-static-initializer-default-export.js
 create mode 100644 test/language/expressions/class/elements/class-name-static-initializer-expr.js

diff --git a/test/language/computed-property-names/class/static/method-number.js b/test/language/computed-property-names/class/static/method-number.js
index 1c553a1930..c00f3e0202 100644
--- a/test/language/computed-property-names/class/static/method-number.js
+++ b/test/language/computed-property-names/class/static/method-number.js
@@ -21,6 +21,6 @@ assert(
   "`compareArray(Object.keys(C), [])` returns `true`"
 );
 assert(
-  compareArray(Object.getOwnPropertyNames(C), ['1', '2', 'length', 'prototype', 'a', 'c', 'name']),
-  "`compareArray(Object.getOwnPropertyNames(C), ['1', '2', 'length', 'prototype', 'a', 'c', 'name'])` returns `true`"
+  compareArray(Object.getOwnPropertyNames(C), ['1', '2', 'length', 'prototype', 'name', 'a', 'c']),
+  "`compareArray(Object.getOwnPropertyNames(C), ['1', '2', 'length', 'prototype', 'name', 'a', 'c'])` returns `true`"
 );
diff --git a/test/language/computed-property-names/class/static/method-string.js b/test/language/computed-property-names/class/static/method-string.js
index 2b5f09b83f..8f383805b0 100644
--- a/test/language/computed-property-names/class/static/method-string.js
+++ b/test/language/computed-property-names/class/static/method-string.js
@@ -21,6 +21,6 @@ assert(
   "`compareArray(Object.keys(C), [])` returns `true`"
 );
 assert(
-  compareArray(Object.getOwnPropertyNames(C), ['length', 'prototype', 'a', 'b', 'c', 'd', 'name']),
-  "`compareArray(Object.getOwnPropertyNames(C), ['length', 'prototype', 'a', 'b', 'c', 'd', 'name'])` returns `true`"
+  compareArray(Object.getOwnPropertyNames(C), ['length', 'prototype', 'name', 'a', 'b', 'c', 'd']),
+  "`compareArray(Object.getOwnPropertyNames(C), ['length', 'prototype', 'name', 'a', 'b', 'c', 'd'])` returns `true`"
 );
diff --git a/test/language/computed-property-names/class/static/method-symbol.js b/test/language/computed-property-names/class/static/method-symbol.js
index 7d6506dcaf..3eb710b780 100644
--- a/test/language/computed-property-names/class/static/method-symbol.js
+++ b/test/language/computed-property-names/class/static/method-symbol.js
@@ -24,8 +24,8 @@ assert(
   "`compareArray(Object.keys(C), [])` returns `true`"
 );
 assert(
-  compareArray(Object.getOwnPropertyNames(C), ['length', 'prototype', 'a', 'c', 'name']),
-  "`compareArray(Object.getOwnPropertyNames(C), ['length', 'prototype', 'a', 'c', 'name'])` returns `true`"
+  compareArray(Object.getOwnPropertyNames(C), ['length', 'prototype', 'name', 'a', 'c']),
+  "`compareArray(Object.getOwnPropertyNames(C), ['length', 'prototype', 'name', 'a', 'c'])` returns `true`"
 );
 assert(
   compareArray(Object.getOwnPropertySymbols(C), [sym1, sym2]),
diff --git a/test/language/expressions/class/elements/class-name-static-initializer-anonymous.js b/test/language/expressions/class/elements/class-name-static-initializer-anonymous.js
new file mode 100644
index 0000000000..daca9b6ab2
--- /dev/null
+++ b/test/language/expressions/class/elements/class-name-static-initializer-anonymous.js
@@ -0,0 +1,26 @@
+// Copyright 2019 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-runtime-semantics-classdefinitionevaluation
+description: >
+    The inferred class-name is present when executing static field initializers of anonymous class expressions.
+info: |
+    14.6.13 Runtime Semantics: ClassDefinitionEvaluation
+
+    [...]
+    17. Perform MakeClassConstructor(F).
+    18. If className is not undefined, then
+        a. Perform SetFunctionName(F, className).
+    [...]
+
+features: [class-static-fields-public]
+---*/
+
+var className;
+
+var C = class {
+    static f = (className = this.name);
+}
+
+assert.sameValue(className, "C");
diff --git a/test/language/expressions/class/elements/class-name-static-initializer-decl.js b/test/language/expressions/class/elements/class-name-static-initializer-decl.js
new file mode 100644
index 0000000000..6f9ec9e077
--- /dev/null
+++ b/test/language/expressions/class/elements/class-name-static-initializer-decl.js
@@ -0,0 +1,26 @@
+// Copyright 2019 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-runtime-semantics-classdefinitionevaluation
+description: >
+    The class-name is present when executing static field initializers of class declarations.
+info: |
+    14.6.13 Runtime Semantics: ClassDefinitionEvaluation
+
+    [...]
+    17. Perform MakeClassConstructor(F).
+    18. If className is not undefined, then
+        a. Perform SetFunctionName(F, className).
+    [...]
+
+features: [class-static-fields-public]
+---*/
+
+var className;
+
+class C {
+    static f = (className = this.name);
+}
+
+assert.sameValue(className, "C");
diff --git a/test/language/expressions/class/elements/class-name-static-initializer-default-export.js b/test/language/expressions/class/elements/class-name-static-initializer-default-export.js
new file mode 100644
index 0000000000..5ce104f4b1
--- /dev/null
+++ b/test/language/expressions/class/elements/class-name-static-initializer-default-export.js
@@ -0,0 +1,27 @@
+// Copyright 2019 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-runtime-semantics-classdefinitionevaluation
+description: >
+    The class-name is present when executing static field initializers of default-exported classes.
+info: |
+    14.6.13 Runtime Semantics: ClassDefinitionEvaluation
+
+    [...]
+    17. Perform MakeClassConstructor(F).
+    18. If className is not undefined, then
+        a. Perform SetFunctionName(F, className).
+    [...]
+
+flags: [module]
+features: [class-static-fields-public]
+---*/
+
+var className;
+
+export default class {
+    static f = (className = this.name);
+}
+
+assert.sameValue(className, "default");
diff --git a/test/language/expressions/class/elements/class-name-static-initializer-expr.js b/test/language/expressions/class/elements/class-name-static-initializer-expr.js
new file mode 100644
index 0000000000..1ff5f8d38a
--- /dev/null
+++ b/test/language/expressions/class/elements/class-name-static-initializer-expr.js
@@ -0,0 +1,26 @@
+// Copyright 2019 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-runtime-semantics-classdefinitionevaluation
+description: >
+    The class-name is present when executing static field initializers of named class expressions.
+info: |
+    14.6.13 Runtime Semantics: ClassDefinitionEvaluation
+
+    [...]
+    17. Perform MakeClassConstructor(F).
+    18. If className is not undefined, then
+        a. Perform SetFunctionName(F, className).
+    [...]
+
+features: [class-static-fields-public]
+---*/
+
+var className;
+
+var expr = class C {
+    static f = (className = this.name);
+}
+
+assert.sameValue(className, "C");
-- 
GitLab