Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tests for export * as ns from 'foo' syntax #1498

Merged
merged 10 commits into from
Jun 28, 2018
4 changes: 4 additions & 0 deletions features.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 18 additions & 0 deletions test/language/module-code/early-dup-export-as-star-as.js
Original file line number Diff line number Diff line change
@@ -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";
1 change: 1 addition & 0 deletions test/language/module-code/early-dup-export-id-as.js
Original file line number Diff line number Diff line change
@@ -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
Expand Down
18 changes: 18 additions & 0 deletions test/language/module-code/early-dup-export-star-as-dflt.js
Original file line number Diff line number Diff line change
@@ -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';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it would make sense to have a positive test case for export * as default from.

5 changes: 3 additions & 2 deletions test/language/module-code/eval-rqstd-once.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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();
Expand Down
4 changes: 4 additions & 0 deletions test/language/module-code/eval-rqstd-order-9_FIXTURE.js
Original file line number Diff line number Diff line change
@@ -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';
8 changes: 5 additions & 3 deletions test/language/module-code/eval-rqstd-order.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand All @@ -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';
18 changes: 14 additions & 4 deletions test/language/module-code/eval-self-once.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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;

Expand Down
28 changes: 16 additions & 12 deletions test/language/module-code/instn-once.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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;

Expand Down
4 changes: 2 additions & 2 deletions test/language/module-code/instn-resolve-empty-export.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: |
Expand All @@ -25,7 +25,7 @@ info: |

Syntax

ExportClause:
NamedExport:
{ }
{ ExportsList }
{ ExportsList , }
Expand Down
57 changes: 57 additions & 0 deletions test/language/module-code/instn-star-as-props-dflt-skip.js
Original file line number Diff line number Diff line change
@@ -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'
);
Original file line number Diff line number Diff line change
@@ -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 };
Original file line number Diff line number Diff line change
@@ -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';
Original file line number Diff line number Diff line change
@@ -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;
Original file line number Diff line number Diff line change
@@ -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';
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Original file line number Diff line number Diff line change
Expand Up @@ -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';
6 changes: 4 additions & 2 deletions test/language/module-code/instn-star-props-nrml.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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');
Expand All @@ -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');
Expand Down
Original file line number Diff line number Diff line change
@@ -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 };
Original file line number Diff line number Diff line change
@@ -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';
Original file line number Diff line number Diff line change
@@ -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;
Original file line number Diff line number Diff line change
@@ -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';
Original file line number Diff line number Diff line change
@@ -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'
);
Original file line number Diff line number Diff line change
@@ -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';
Loading