From 2fa8fc40e49993be628c230e1a44bd8298f986b7 Mon Sep 17 00:00:00 2001
From: Valerie Young <spectranaut@gmail.com>
Date: Thu, 28 Jun 2018 15:46:36 -0400
Subject: [PATCH] Tests for `export * as ns from 'foo'` syntax (#1498)

---
 features.txt                                  |  4 ++
 .../early-dup-export-as-star-as.js            | 18 ++++++
 .../module-code/early-dup-export-id-as.js     |  1 +
 .../early-dup-export-star-as-dflt.js          | 18 ++++++
 test/language/module-code/eval-rqstd-once.js  |  5 +-
 .../module-code/eval-rqstd-order-9_FIXTURE.js |  4 ++
 test/language/module-code/eval-rqstd-order.js |  8 ++-
 test/language/module-code/eval-self-once.js   | 18 ++++--
 test/language/module-code/instn-once.js       | 28 +++++----
 .../module-code/instn-resolve-empty-export.js |  4 +-
 .../instn-star-as-props-dflt-skip.js          | 57 +++++++++++++++++++
 ...ops-dflt-skip-star-as-named-end_FIXTURE.js |  6 ++
 ...r-props-dflt-skip-star-as-named_FIXTURE.js |  4 ++
 ...rops-dflt-skip-star-as-prod-end_FIXTURE.js |  5 ++
 ...ar-props-dflt-skip-star-as-prod_FIXTURE.js |  4 ++
 .../instn-star-props-nrml-1_FIXTURE.js        |  2 +
 .../instn-star-props-nrml-star_FIXTURE.js     |  1 +
 .../module-code/instn-star-props-nrml.js      |  6 +-
 ...d-namespace-dflt-skip-named-end_FIXTURE.js |  6 ++
 ...ested-namespace-dflt-skip-named_FIXTURE.js |  4 ++
 ...ed-namespace-dflt-skip-prod-end_FIXTURE.js |  5 ++
 ...nested-namespace-dflt-skip-prod_FIXTURE.js |  4 ++
 .../get-nested-namespace-dflt-skip.js         | 42 ++++++++++++++
 ...t-nested-namespace-props-nrml-1_FIXTURE.js |  4 ++
 ...t-nested-namespace-props-nrml-2_FIXTURE.js | 23 ++++++++
 ...t-nested-namespace-props-nrml-3_FIXTURE.js |  5 ++
 .../get-nested-namespace-props-nrml.js        | 51 +++++++++++++++++
 .../module-code/parse-err-export-dflt-expr.js |  5 +-
 .../parse-err-invoke-anon-fun-decl.js         |  7 ++-
 .../parse-err-invoke-anon-gen-decl.js         |  5 +-
 .../module-code/parse-err-semi-dflt-expr.js   |  5 +-
 .../module-code/parse-err-semi-export-star.js |  7 ++-
 .../parse-err-semi-name-space-export.js       | 27 +++++++++
 ...js => parse-err-semi-named-export-from.js} |  7 ++-
 ...ause.js => parse-err-semi-named-export.js} |  7 ++-
 .../module-code/parse-export-empty.js         |  9 +--
 36 files changed, 369 insertions(+), 47 deletions(-)
 create mode 100644 test/language/module-code/early-dup-export-as-star-as.js
 create mode 100644 test/language/module-code/early-dup-export-star-as-dflt.js
 create mode 100644 test/language/module-code/eval-rqstd-order-9_FIXTURE.js
 create mode 100644 test/language/module-code/instn-star-as-props-dflt-skip.js
 create mode 100644 test/language/module-code/instn-star-props-dflt-skip-star-as-named-end_FIXTURE.js
 create mode 100644 test/language/module-code/instn-star-props-dflt-skip-star-as-named_FIXTURE.js
 create mode 100644 test/language/module-code/instn-star-props-dflt-skip-star-as-prod-end_FIXTURE.js
 create mode 100644 test/language/module-code/instn-star-props-dflt-skip-star-as-prod_FIXTURE.js
 create mode 100644 test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-named-end_FIXTURE.js
 create mode 100644 test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-named_FIXTURE.js
 create mode 100644 test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-prod-end_FIXTURE.js
 create mode 100644 test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-prod_FIXTURE.js
 create mode 100644 test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip.js
 create mode 100644 test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-1_FIXTURE.js
 create mode 100644 test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-2_FIXTURE.js
 create mode 100644 test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-3_FIXTURE.js
 create mode 100644 test/language/module-code/namespace/internals/get-nested-namespace-props-nrml.js
 create mode 100644 test/language/module-code/parse-err-semi-name-space-export.js
 rename test/language/module-code/{parse-err-semi-export-clause-from.js => parse-err-semi-named-export-from.js} (80%)
 rename test/language/module-code/{parse-err-semi-export-clause.js => parse-err-semi-named-export.js} (78%)

diff --git a/features.txt b/features.txt
index 395ff3aa93..e9ca739503 100644
--- a/features.txt
+++ b/features.txt
@@ -97,6 +97,10 @@ Intl.RelativeTimeFormat
 # https://github.com/tc39/proposal-global
 global
 
+# `export * as namespace from module` consensus PR
+# https://github.com/tc39/ecma262/pull/1174
+export-star-as-namespace-from-module
+
 # Standard language features
 #
 # Language features that have been included in a published version of the
diff --git a/test/language/module-code/early-dup-export-as-star-as.js b/test/language/module-code/early-dup-export-as-star-as.js
new file mode 100644
index 0000000000..f188fde066
--- /dev/null
+++ b/test/language/module-code/early-dup-export-as-star-as.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-module-semantics-static-semantics-early-errors
+description: >
+    It is a Syntax Error if the ExportedNames of ModuleItemList contains any
+    duplicate entries.
+flags: [module, export-star-as-namespace-from-module]
+negative:
+  phase: parse
+  type: SyntaxError
+---*/
+
+throw "Test262: This statement should not be evaluated.";
+
+var x;
+export { x as z };
+export * as z from "early-dup-export-as-star-as.js";
diff --git a/test/language/module-code/early-dup-export-id-as.js b/test/language/module-code/early-dup-export-id-as.js
index 077c9406d4..49b2834b9b 100644
--- a/test/language/module-code/early-dup-export-id-as.js
+++ b/test/language/module-code/early-dup-export-id-as.js
@@ -1,6 +1,7 @@
 // Copyright (C) 2015 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
+esid: sec-module-semantics-static-semantics-early-errors
 es6id: 15.2.1.1
 description: >
     It is a Syntax Error if the ExportedNames of ModuleItemList contains any
diff --git a/test/language/module-code/early-dup-export-star-as-dflt.js b/test/language/module-code/early-dup-export-star-as-dflt.js
new file mode 100644
index 0000000000..3d8e8ce787
--- /dev/null
+++ b/test/language/module-code/early-dup-export-star-as-dflt.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-module-semantics-static-semantics-early-errors
+description: >
+    It is a Syntax Error if the ExportedNames of ModuleItemList contains any
+    duplicate entries.
+flags: [module, export-star-as-namespace-from-module]
+negative:
+  phase: parse
+  type: SyntaxError
+---*/
+
+throw "Test262: This statement should not be evaluated.";
+
+var x;
+export default x;
+export * as default from 'early-dup-export-start-as-dflt.js';
diff --git a/test/language/module-code/eval-rqstd-once.js b/test/language/module-code/eval-rqstd-once.js
index 93a3779be8..b9ddb863ab 100644
--- a/test/language/module-code/eval-rqstd-once.js
+++ b/test/language/module-code/eval-rqstd-once.js
@@ -12,7 +12,7 @@ info: |
        b. Perform ? requiredModule.ModuleEvaluation().
     [...]
 includes: [fnGlobalObject.js]
-flags: [module]
+flags: [module, export-star-as-namespace-from-module]
 ---*/
 
 import {} from './eval-rqstd-once_FIXTURE.js';
@@ -22,7 +22,8 @@ import dflt1 from './eval-rqstd-once_FIXTURE.js';
 export {} from './eval-rqstd-once_FIXTURE.js';
 import dflt2, {} from './eval-rqstd-once_FIXTURE.js';
 export * from './eval-rqstd-once_FIXTURE.js';
-import dflt3, * as ns from './eval-rqstd-once_FIXTURE.js';
+export * as ns2 from './eval-rqstd-once_FIXTURE.js';
+import dflt3, * as ns3 from './eval-rqstd-once_FIXTURE.js';
 export default null;
 
 var global = fnGlobalObject();
diff --git a/test/language/module-code/eval-rqstd-order-9_FIXTURE.js b/test/language/module-code/eval-rqstd-order-9_FIXTURE.js
new file mode 100644
index 0000000000..a4974468a0
--- /dev/null
+++ b/test/language/module-code/eval-rqstd-order-9_FIXTURE.js
@@ -0,0 +1,4 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+Function('return this;')().test262 += '9';
diff --git a/test/language/module-code/eval-rqstd-order.js b/test/language/module-code/eval-rqstd-order.js
index 3d8ca0fdbd..d15cb55b64 100644
--- a/test/language/module-code/eval-rqstd-order.js
+++ b/test/language/module-code/eval-rqstd-order.js
@@ -15,10 +15,10 @@ info: |
     16. Let result be the result of evaluating module.[[ECMAScriptCode]].
     [...]
 includes: [fnGlobalObject.js]
-flags: [module]
+flags: [module, export-star-as-namespace-from-module]
 ---*/
 
-assert.sameValue(fnGlobalObject().test262, '12345678');
+assert.sameValue(fnGlobalObject().test262, '123456789');
 
 import {} from './eval-rqstd-order-1_FIXTURE.js';
 
@@ -34,4 +34,6 @@ import dflt2, {} from './eval-rqstd-order-6_FIXTURE.js';
 
 export * from './eval-rqstd-order-7_FIXTURE.js';
 
-import dflt3, * as ns from './eval-rqstd-order-8_FIXTURE.js';
+import dflt3, * as ns2 from './eval-rqstd-order-8_FIXTURE.js';
+
+export * as ns3 from './eval-rqstd-order-9_FIXTURE.js';
diff --git a/test/language/module-code/eval-self-once.js b/test/language/module-code/eval-self-once.js
index 1da75ae6c0..d6f595dc60 100644
--- a/test/language/module-code/eval-self-once.js
+++ b/test/language/module-code/eval-self-once.js
@@ -4,15 +4,24 @@
 description: Module is evaluated exactly once
 esid: sec-moduleevaluation
 info: |
+  Evaluate( ) Concrete Method
+    [...]
+    4. Let result be InnerModuleEvaluation(module, stack, 0).
+    [...]
+
+  InnerModuleEvaluation( module, stack, index )
+    [...]
+    2. If module.[[Status]] is "evaluated", then
+      a. If module.[[EvaluationError]] is undefined, return index.
+      b. Otherwise return module.[[EvaluationError]].
     [...]
-    4. If module.[[Evaluated]] is true, return undefined.
-    5. Set module.[[Evaluated]] to true.
     6. For each String required that is an element of module.[[RequestedModules]] do,
        a. Let requiredModule be ? HostResolveImportedModule(module, required).
-       b. Perform ? requiredModule.ModuleEvaluation().
+       [...]
+       c. Set index to ? InnerModuleEvaluation(requiredModule, stack, index).
     [...]
 includes: [fnGlobalObject.js]
-flags: [module]
+flags: [module, export-star-as-namespace-from-module]
 ---*/
 
 import {} from './eval-self-once.js';
@@ -22,6 +31,7 @@ import dflt1 from './eval-self-once.js';
 export {} from './eval-self-once.js';
 import dflt2, {} from './eval-self-once.js';
 export * from './eval-self-once.js';
+export * as ns2 from './eval-self-once.js';
 import dflt3, * as ns from './eval-self-once.js';
 export default null;
 
diff --git a/test/language/module-code/instn-once.js b/test/language/module-code/instn-once.js
index dd859ffa5c..040ee3a0cb 100644
--- a/test/language/module-code/instn-once.js
+++ b/test/language/module-code/instn-once.js
@@ -4,20 +4,23 @@
 description: Module is instantiated exactly once
 esid: sec-moduledeclarationinstantiation
 info: |
+  Instantiate( ) Concrete Method
     [...]
-    5. If module.[[Environment]] is not undefined, return
-       NormalCompletion(empty).
-    6. Let env be NewModuleEnvironment(realm.[[GlobalEnv]]).
-    7. Set module.[[Environment]] to env.
-    8. For each String required that is an element of
-       module.[[RequestedModules]] do,
-       a. NOTE: Before instantiating a module, all of the modules it requested
-          must be available. An implementation may perform this test at any
-          time prior to this point.
-       b. Let requiredModule be ? HostResolveImportedModule(module, required).
-       c. Perform ? requiredModule.ModuleDeclarationInstantiation().
+    4. Let result be InnerModuleInstantiation(module, stack, 0).
     [...]
-flags: [module]
+
+  InnerModuleInstantiation( module, stack, index )
+    [...]
+    2. If module.[[Status]] is "instantiating", "instantiated", or "evaluated", then
+      a. Return index.
+    3. Assert: module.[[Status]] is "uninstantiated".
+    4. Set module.[[Status]] to "instantiating".
+    [...]
+    9. For each String required that is an element of module.[[RequestedModules]], do
+      a. Let requiredModule be ? HostResolveImportedModule(module, required).
+      b. Set index to ? InnerModuleInstantiation(requiredModule, stack, index).
+    [...]
+flags: [module, export-star-as-namespace-from-module]
 ---*/
 
 import {} from './instn-once.js';
@@ -27,6 +30,7 @@ import dflt1 from './instn-once.js';
 export {} from './instn-once.js';
 import dflt2, {} from './instn-once.js';
 export * from './instn-once.js';
+export * as ns2 from './instn-once.js';
 import dflt3, * as ns from './instn-once.js';
 export default null;
 
diff --git a/test/language/module-code/instn-resolve-empty-export.js b/test/language/module-code/instn-resolve-empty-export.js
index 86b03d3b43..a03f5de672 100644
--- a/test/language/module-code/instn-resolve-empty-export.js
+++ b/test/language/module-code/instn-resolve-empty-export.js
@@ -2,7 +2,7 @@
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 description: >
-    An ExportClause without an ExportsList contributes to the list of requested
+    A NamedExport without an ExportsList contributes to the list of requested
     modules
 esid: sec-moduledeclarationinstantiation
 info: |
@@ -25,7 +25,7 @@ info: |
 
     Syntax
 
-      ExportClause:
+      NamedExport:
         { }
         { ExportsList }
         { ExportsList , }
diff --git a/test/language/module-code/instn-star-as-props-dflt-skip.js b/test/language/module-code/instn-star-as-props-dflt-skip.js
new file mode 100644
index 0000000000..b4532452cc
--- /dev/null
+++ b/test/language/module-code/instn-star-as-props-dflt-skip.js
@@ -0,0 +1,57 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+description: >
+  Default exports are not included in an imported module namespace object when module exported with `* as namespace`
+esid: sec-moduledeclarationinstantiation
+info: |
+  [...]
+  4. Let result be InnerModuleInstantiation(module, stack, 0).
+  [...]
+
+  InnerModuleInstantiation( module, stack, index )
+  [...]
+  10. Perform ? ModuleDeclarationEnvironmentSetup(module).
+  [...]
+
+  ModuleDeclarationEnvironmentSetup( module )
+  [...]
+    c. If in.[[ImportName]] is "*", then
+    [...]
+    d. Else,
+      i. Let resolution be ? importedModule.ResolveExport(in.[[ImportName]], « »).
+      ii. If resolution is null or "ambiguous", throw a SyntaxError exception.
+      iii. If resolution.[[BindingName]] is "*namespace*", then
+        1. Let namespace be ? GetModuleNamespace(resolution.[[Module]]).
+    [...]
+
+  15.2.1.18 Runtime Semantics: GetModuleNamespace
+
+  [...]
+  3. If namespace is undefined, then
+  a. Let exportedNames be ? module.GetExportedNames(« »).
+  [...]
+
+  15.2.1.16.2 GetExportedNames
+
+  [...]
+  7. For each ExportEntry Record e in module.[[StarExportEntries]], do
+  [...]
+  c. For each element n of starNames, do
+  i. If SameValue(n, "default") is false, then
+  [...]
+flags: [module, export-star-as-namespace-from-module]
+  ---*/
+
+import named from './instn-star-props-dflt-skip-star-as-named_FIXTURE.js';
+import production from './instn-star-props-dflt-skip-star-as-prod_FIXTURE.js';
+
+assert('namedOther' in named);
+assert.sameValue(
+  'default' in named, false, 'default specified via identifier'
+);
+
+assert('productionOther' in production);
+assert.sameValue(
+  'default' in production, false, 'default specified via dedicated production'
+);
diff --git a/test/language/module-code/instn-star-props-dflt-skip-star-as-named-end_FIXTURE.js b/test/language/module-code/instn-star-props-dflt-skip-star-as-named-end_FIXTURE.js
new file mode 100644
index 0000000000..0e9f326b22
--- /dev/null
+++ b/test/language/module-code/instn-star-props-dflt-skip-star-as-named-end_FIXTURE.js
@@ -0,0 +1,6 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+var x;
+export var namedOther = null;
+export { x as default };
diff --git a/test/language/module-code/instn-star-props-dflt-skip-star-as-named_FIXTURE.js b/test/language/module-code/instn-star-props-dflt-skip-star-as-named_FIXTURE.js
new file mode 100644
index 0000000000..0ffc8fe37f
--- /dev/null
+++ b/test/language/module-code/instn-star-props-dflt-skip-star-as-named_FIXTURE.js
@@ -0,0 +1,4 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+export * as named from './instn-star-props-dflt-skip-star-as-named-end_FIXTURE.js';
diff --git a/test/language/module-code/instn-star-props-dflt-skip-star-as-prod-end_FIXTURE.js b/test/language/module-code/instn-star-props-dflt-skip-star-as-prod-end_FIXTURE.js
new file mode 100644
index 0000000000..8c21a3362d
--- /dev/null
+++ b/test/language/module-code/instn-star-props-dflt-skip-star-as-prod-end_FIXTURE.js
@@ -0,0 +1,5 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+export var productionOther = null;
+export default null;
diff --git a/test/language/module-code/instn-star-props-dflt-skip-star-as-prod_FIXTURE.js b/test/language/module-code/instn-star-props-dflt-skip-star-as-prod_FIXTURE.js
new file mode 100644
index 0000000000..530ace997d
--- /dev/null
+++ b/test/language/module-code/instn-star-props-dflt-skip-star-as-prod_FIXTURE.js
@@ -0,0 +1,4 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+export * as production from './instn-star-props-dflt-skip-star-as-prod-end_FIXTURE.js';
diff --git a/test/language/module-code/instn-star-props-nrml-1_FIXTURE.js b/test/language/module-code/instn-star-props-nrml-1_FIXTURE.js
index 72fe63809c..74abc82881 100644
--- a/test/language/module-code/instn-star-props-nrml-1_FIXTURE.js
+++ b/test/language/module-code/instn-star-props-nrml-1_FIXTURE.js
@@ -20,5 +20,7 @@ export { localBindingId };
 export { localBindingId as localIdName };
 export { indirectIdName } from './instn-star-props-nrml-indirect_FIXTURE.js';
 export { indirectIdName as indirectIdName2 } from './instn-star-props-nrml-indirect_FIXTURE.js';
+export * as namespaceBinding from './instn-star-props-nrml-indirect_FIXTURE.js';
 
 export * from './instn-star-props-nrml-star_FIXTURE.js';
+
diff --git a/test/language/module-code/instn-star-props-nrml-star_FIXTURE.js b/test/language/module-code/instn-star-props-nrml-star_FIXTURE.js
index 6c0d481d68..5c1e70dd4e 100644
--- a/test/language/module-code/instn-star-props-nrml-star_FIXTURE.js
+++ b/test/language/module-code/instn-star-props-nrml-star_FIXTURE.js
@@ -20,3 +20,4 @@ export { starBindingId };
 export { starBindingId as starIdName };
 export { starIndirectIdName } from './instn-star-props-nrml-indirect_FIXTURE.js';
 export { starIndirectIdName as starIndirectIdName2 } from './instn-star-props-nrml-indirect_FIXTURE.js';
+export * as starIndirectNamespaceBinding from './instn-star-props-nrml-indirect_FIXTURE.js';
diff --git a/test/language/module-code/instn-star-props-nrml.js b/test/language/module-code/instn-star-props-nrml.js
index 615044c0b5..3a595536d1 100644
--- a/test/language/module-code/instn-star-props-nrml.js
+++ b/test/language/module-code/instn-star-props-nrml.js
@@ -24,7 +24,7 @@ info: |
           iii. If resolution is not "ambiguous", append name to
                unambiguousNames.
        d. Let namespace be ModuleNamespaceCreate(module, unambiguousNames).
-flags: [module]
+flags: [module, export-star-as-namespace-from-module]
 ---*/
 
 import * as ns from './instn-star-props-nrml-1_FIXTURE.js';
@@ -40,6 +40,7 @@ assert('localBindingId' in ns, 'localBindingId');
 assert('localIdName' in ns, 'localIdName');
 assert('indirectIdName' in ns, 'indirectIdName');
 assert('indirectIdName2' in ns, 'indirectIdName2');
+assert('namespaceBinding' in ns, 'namespaceBinding');
 
 // Export entries defined by a re-exported module
 assert('starVarDecl' in ns, 'starVarDecl');
@@ -52,8 +53,9 @@ assert('starBindingId' in ns, 'starBindingId');
 assert('starIdName' in ns, 'starIdName');
 assert('starIndirectIdName' in ns, 'starIndirectIdName');
 assert('starIndirectIdName2' in ns, 'starIndirectIdName2');
+assert('starIndirectNamespaceBinding' in ns, 'starIndirectNamespaceBinding');
 
-// Bindings that were not exported from either module
+// Bindings that were not exported from any module
 assert.sameValue('nonExportedVar1' in ns, false, 'nonExportedVar1');
 assert.sameValue('nonExportedVar2' in ns, false, 'nonExportedVar2');
 assert.sameValue('nonExportedLet1' in ns, false, 'nonExportedLet1');
diff --git a/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-named-end_FIXTURE.js b/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-named-end_FIXTURE.js
new file mode 100644
index 0000000000..0e9f326b22
--- /dev/null
+++ b/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-named-end_FIXTURE.js
@@ -0,0 +1,6 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+var x;
+export var namedOther = null;
+export { x as default };
diff --git a/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-named_FIXTURE.js b/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-named_FIXTURE.js
new file mode 100644
index 0000000000..10732ecc24
--- /dev/null
+++ b/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-named_FIXTURE.js
@@ -0,0 +1,4 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+export * as namedns2 from './get-nested-namespace-dflt-skip-named-end_FIXTURE.js';
diff --git a/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-prod-end_FIXTURE.js b/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-prod-end_FIXTURE.js
new file mode 100644
index 0000000000..8c21a3362d
--- /dev/null
+++ b/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-prod-end_FIXTURE.js
@@ -0,0 +1,5 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+export var productionOther = null;
+export default null;
diff --git a/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-prod_FIXTURE.js b/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-prod_FIXTURE.js
new file mode 100644
index 0000000000..6687ab1d01
--- /dev/null
+++ b/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-prod_FIXTURE.js
@@ -0,0 +1,4 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+export * as productionns2 from './get-nested-namespace-dflt-skip-prod-end_FIXTURE.js';
diff --git a/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip.js b/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip.js
new file mode 100644
index 0000000000..c2cb7794dd
--- /dev/null
+++ b/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip.js
@@ -0,0 +1,42 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+description: >
+  Default exports are not included in an imported module namespace object when a namespace object is created.
+esid: sec-module-namespace-exotic-objects-get-p-receiver
+info: |
+  [...]
+  6. Let binding be ! m.ResolveExport(P, « »).
+  7. Assert: binding is a ResolvedBinding Record.
+  8. Let targetModule be binding.[[Module]].
+  9. Assert: targetModule is not undefined.
+  10. If binding.[[BindingName]] is "*namespace*", then
+  11. Return ? GetModuleNamespace(targetModule).
+
+  Runtime Semantics: GetModuleNamespace
+  [...]
+    3. If namespace is undefined, then
+       a. Let exportedNames be ? module.GetExportedNames(« »).
+       b. Let unambiguousNames be a new empty List.
+       c. For each name that is an element of exportedNames,
+          i. Let resolution be ? module.ResolveExport(name, « », « »).
+          ii. If resolution is null, throw a SyntaxError exception.
+          iii. If resolution is not "ambiguous", append name to
+               unambiguousNames.
+       d. Let namespace be ModuleNamespaceCreate(module, unambiguousNames).
+  [...]
+flags: [module, export-star-as-namespace-from-module]
+---*/
+
+import * as namedns1 from './get-nested-namespace-dflt-skip-named_FIXTURE.js';
+import * as productionns1 from './get-nested-namespace-dflt-skip-prod_FIXTURE.js';
+
+assert('namedOther' in namedns1.namedns2);
+assert.sameValue(
+  'default' in namedns1.namedns2, false, 'default specified via identifier'
+);
+
+assert('productionOther' in productionns1.productionns2);
+assert.sameValue(
+  'default' in productionns1.productionns2, false, 'default specified via dedicated production'
+);
diff --git a/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-1_FIXTURE.js b/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-1_FIXTURE.js
new file mode 100644
index 0000000000..c3b3ea40c5
--- /dev/null
+++ b/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-1_FIXTURE.js
@@ -0,0 +1,4 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+export * as exportns from './get-nested-namespace-props-nrml-2_FIXTURE.js';
diff --git a/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-2_FIXTURE.js b/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-2_FIXTURE.js
new file mode 100644
index 0000000000..2dc945443d
--- /dev/null
+++ b/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-2_FIXTURE.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+var notExportedVar;
+let notExportedLet;
+const notExportedConst = null;
+function notExportedFunc() {}
+function* notExportedGen() {}
+class notExportedClass {}
+
+var starBindingId;
+
+export var starAsVarDecl;
+export let starAsLetDecl;
+export const starAsConstDecl = null;
+export function starAsFuncDecl() {}
+export function* starAsGenDecl() {}
+export class starAsClassDecl {}
+export { starAsBindingId };
+export { starAsBindingId as starIdName };
+export { starAsIndirectIdName } from './get-nested-namespace-props-nrml-3_FIXTURE.js';
+export { starAsIndirectIdName as starAsIndirectIdName2 } from './get-nested-namespace-props-nrml-3_FIXTURE.js';
+export * as namespaceBinding from './get-nested-namespace-props-nrml-3_FIXTURE.js';;
diff --git a/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-3_FIXTURE.js b/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-3_FIXTURE.js
new file mode 100644
index 0000000000..889b984be0
--- /dev/null
+++ b/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-3_FIXTURE.js
@@ -0,0 +1,5 @@
+// Copyright (C) 2016 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+export var indirectIdName;
+export var starIndirectIdName;
diff --git a/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml.js b/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml.js
new file mode 100644
index 0000000000..a05b9f2c5d
--- /dev/null
+++ b/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml.js
@@ -0,0 +1,51 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+description: >
+    Module namespace object reports properties for all ExportEntries of all
+    dependencies.
+esid: sec-moduledeclarationinstantiation
+info: |
+  [...]
+  12. For each ImportEntry Record in in module.[[ImportEntries]], do
+      a. Let importedModule be ? HostResolveImportedModule(module,
+         in.[[ModuleRequest]]).
+      b. If in.[[ImportName]] is "*", then
+         i. Let namespace be ? GetModuleNamespace(importedModule).
+  [...]
+
+  Runtime Semantics: GetModuleNamespace
+    3. If namespace is undefined, then
+       a. Let exportedNames be ? module.GetExportedNames(« »).
+       b. Let unambiguousNames be a new empty List.
+       c. For each name that is an element of exportedNames,
+          i. Let resolution be ? module.ResolveExport(name, « », « »).
+          ii. If resolution is null, throw a SyntaxError exception.
+          iii. If resolution is not "ambiguous", append name to
+               unambiguousNames.
+       d. Let namespace be ModuleNamespaceCreate(module, unambiguousNames).
+flags: [module, export-star-as-namespace-from-module]
+---*/
+
+import * as ns from './get-nested-namespace-props-nrml-1_FIXTURE.js';
+
+// Export entries defined by a re-exported as exportns module
+assert('starAsVarDecl' in ns.exportns, 'starssVarDecl');
+assert('starAsLetDecl' in ns.exportns, 'starSsLetDecl');
+assert('starAsConstDecl' in ns.exportns, 'starSsConstDecl');
+assert('starAsFuncDecl' in ns.exportns, 'starAsFuncDecl');
+assert('starAsGenDecl' in ns.exportns, 'starAsGenDecl');
+assert('starAsClassDecl' in ns.exportns, 'starAsClassDecl');
+assert('starAsBindingId' in ns.exportns, 'starAsBindingId');
+assert('starAsIdName' in ns.exportns, 'starAsIdName');
+assert('starAsIndirectIdName' in ns.exportns, 'starAsIndirectIdName');
+assert('starAsIndirectIdName2' in ns.exportns, 'starAsIndirectIdName2');
+assert('namespaceBinding' in ns.exportns, 'namespaceBinding');
+
+// Bindings that were not exported from any module
+assert.sameValue('nonExportedVar' in ns.exportns, false, 'nonExportedVar');
+assert.sameValue('nonExportedLet' in ns.exportns, false, 'nonExportedLet');
+assert.sameValue('nonExportedConst' in ns.exportns, false, 'nonExportedConst');
+assert.sameValue('nonExportedFunc' in ns.exportns, false, 'nonExportedFunc');
+assert.sameValue('nonExportedGen' in ns.exportns, false, 'nonExportedGen');
+assert.sameValue('nonExportedClass' in ns.exportns, false, 'nonExportedClass');
diff --git a/test/language/module-code/parse-err-export-dflt-expr.js b/test/language/module-code/parse-err-export-dflt-expr.js
index 521c3d602d..e1c8afb774 100644
--- a/test/language/module-code/parse-err-export-dflt-expr.js
+++ b/test/language/module-code/parse-err-export-dflt-expr.js
@@ -7,8 +7,9 @@ esid: sec-exports
 info: |
     ExportDeclaration:
       export * FromClause;
-      export ExportClause FromClause;
-      export ExportClause;
+      export * as IdentifierName FromClause;
+      export NamedExports FromClause;
+      export NamedExports;
       export VariableStatement
       export Declaration
       export default HoistableDeclaration[Default]
diff --git a/test/language/module-code/parse-err-invoke-anon-fun-decl.js b/test/language/module-code/parse-err-invoke-anon-fun-decl.js
index a2d4efc4e1..eef23aaabe 100644
--- a/test/language/module-code/parse-err-invoke-anon-fun-decl.js
+++ b/test/language/module-code/parse-err-invoke-anon-fun-decl.js
@@ -6,9 +6,10 @@ description: >
 esid: sec-exports
 info: |
     ExportDeclaration:
-      export * FromClause;
-      export ExportClause FromClause;
-      export ExportClause;
+      export * FromClause
+      export * as IdentifierName FromClause;
+      export NamedExports FromClause;
+      export NamedExports;
       export VariableStatement
       export Declaration
       export default HoistableDeclaration[Default]
diff --git a/test/language/module-code/parse-err-invoke-anon-gen-decl.js b/test/language/module-code/parse-err-invoke-anon-gen-decl.js
index 6f7dc4d4d1..7e4c33d216 100644
--- a/test/language/module-code/parse-err-invoke-anon-gen-decl.js
+++ b/test/language/module-code/parse-err-invoke-anon-gen-decl.js
@@ -8,8 +8,9 @@ esid: sec-exports
 info: |
     ExportDeclaration:
       export * FromClause;
-      export ExportClause FromClause;
-      export ExportClause;
+      export * as IdentifierName FromClause;
+      export NamedExports FromClause;
+      export NamedExports;
       export VariableStatement
       export Declaration
       export default HoistableDeclaration[Default]
diff --git a/test/language/module-code/parse-err-semi-dflt-expr.js b/test/language/module-code/parse-err-semi-dflt-expr.js
index 47762c4146..d2f1e59cfc 100644
--- a/test/language/module-code/parse-err-semi-dflt-expr.js
+++ b/test/language/module-code/parse-err-semi-dflt-expr.js
@@ -8,8 +8,9 @@ esid: sec-exports
 info: |
     ExportDeclaration:
       export * FromClause;
-      export ExportClause FromClause;
-      export ExportClause;
+      export * as IdentifierName FromClause;
+      export NamedExports FromClause;
+      export NamedExports;
       export VariableStatement
       export Declaration
       export default HoistableDeclaration[Default]
diff --git a/test/language/module-code/parse-err-semi-export-star.js b/test/language/module-code/parse-err-semi-export-star.js
index 0222b6fb28..72ff081f6a 100644
--- a/test/language/module-code/parse-err-semi-export-star.js
+++ b/test/language/module-code/parse-err-semi-export-star.js
@@ -7,8 +7,9 @@ esid: sec-exports
 info: |
     ExportDeclaration:
       export * FromClause;
-      export ExportClause FromClause;
-      export ExportClause;
+      export * as IdentifierName FromClause;
+      export NamedExports FromClause;
+      export NamedExports;
       export VariableStatement
       export Declaration
       export default HoistableDeclaration[Default]
@@ -17,7 +18,7 @@ info: |
 negative:
   phase: parse
   type: SyntaxError
-flags: [module]
+flags: [module, export-star-as-namespace-from-module]
 ---*/
 
 throw "Test262: This statement should not be evaluated.";
diff --git a/test/language/module-code/parse-err-semi-name-space-export.js b/test/language/module-code/parse-err-semi-name-space-export.js
new file mode 100644
index 0000000000..f47b498b4e
--- /dev/null
+++ b/test/language/module-code/parse-err-semi-name-space-export.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+description: >
+    "export NameSpaceExport FromClause" declarations require a trailing semicolon
+    or LineTerminator
+esid: sec-exports
+info: |
+    ExportDeclaration:
+      export * FromClause;
+      export * as IdentifierName FromClause;
+      export NamedExports FromClause;
+      export NamedExports;
+      export VariableStatement
+      export Declaration
+      export default HoistableDeclaration[Default]
+      export default ClassDeclaration[Default]
+      export default [lookahead ∉ { function, class }] AssignmentExpression[In];
+negative:
+  phase: parse
+  type: SyntaxError
+flags: [module, export-star-as-namespace-from-module]
+---*/
+
+throw "Test262: This statement should not be evaluated.";
+
+export * as namespace from './parse-err-semi-name-space-export.js' null;
diff --git a/test/language/module-code/parse-err-semi-export-clause-from.js b/test/language/module-code/parse-err-semi-named-export-from.js
similarity index 80%
rename from test/language/module-code/parse-err-semi-export-clause-from.js
rename to test/language/module-code/parse-err-semi-named-export-from.js
index 3a42aadb83..54a145af66 100644
--- a/test/language/module-code/parse-err-semi-export-clause-from.js
+++ b/test/language/module-code/parse-err-semi-named-export-from.js
@@ -2,14 +2,15 @@
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 description: >
-    "export ExportClause FromClause" declarations require a trailing semicolon
+    "export NamedExports FromClause" declarations require a trailing semicolon
     or LineTerminator
 esid: sec-exports
 info: |
     ExportDeclaration:
       export * FromClause;
-      export ExportClause FromClause;
-      export ExportClause;
+      export * as IdentifierName FromClause;
+      export NamedExports FromClause;
+      export NamedExports;
       export VariableStatement
       export Declaration
       export default HoistableDeclaration[Default]
diff --git a/test/language/module-code/parse-err-semi-export-clause.js b/test/language/module-code/parse-err-semi-named-export.js
similarity index 78%
rename from test/language/module-code/parse-err-semi-export-clause.js
rename to test/language/module-code/parse-err-semi-named-export.js
index e744db3dd8..501682440d 100644
--- a/test/language/module-code/parse-err-semi-export-clause.js
+++ b/test/language/module-code/parse-err-semi-named-export.js
@@ -2,14 +2,15 @@
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 description: >
-    "export ExportClause" declarations require a trailing semicolon or
+    "export NamedExports" declarations require a trailing semicolon or
     LineTerminator
 esid: sec-exports
 info: |
     ExportDeclaration:
       export * FromClause;
-      export ExportClause FromClause;
-      export ExportClause;
+      export * as IdentifierName FromClause;
+      export NamedExports FromClause;
+      export NamedExports;
       export VariableStatement
       export Declaration
       export default HoistableDeclaration[Default]
diff --git a/test/language/module-code/parse-export-empty.js b/test/language/module-code/parse-export-empty.js
index fd95dcc3a7..74cab489bf 100644
--- a/test/language/module-code/parse-export-empty.js
+++ b/test/language/module-code/parse-export-empty.js
@@ -1,20 +1,21 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: An ExportClause does not require an ExportsList.
+description: A NamedExport does not require an ExportsList.
 esid: sec-parsemodule
 info: |
     ExportDeclaration:
       export * FromClause;
-      export ExportClause FromClause;
-      export ExportClause;
+      export * as IdentifierName FromClause;
+      export NamedExports FromClause;
+      export NamedExports;
       export VariableStatement
       export Declaration
       export default HoistableDeclaration[Default]
       export default ClassDeclaration[Default]
       export default [lookahead ∉ { function, class }] AssignmentExpression[In];
 
-    ExportClause:
+    NamedExports:
       { }
       { ExportsList }
       { ExportsList , }
-- 
GitLab