mirror of https://github.com/tc39/test262.git
feat: adding tests for optional chaining proposal (#2212)
This commit is contained in:
parent
c4dd26bcee
commit
aae991da8a
|
@ -0,0 +1,20 @@
|
|||
// Copyright 2019 Google, Inc. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: prod-OptionalExpression
|
||||
description: >
|
||||
optional chain on call expression
|
||||
info: |
|
||||
Left-Hand-Side Expressions
|
||||
OptionalExpression:
|
||||
CallExpression OptionalChain
|
||||
features: [optional-chaining]
|
||||
---*/
|
||||
|
||||
function fn () {
|
||||
return {a: 33};
|
||||
};
|
||||
|
||||
// CallExpression Arguments
|
||||
assert.sameValue(33, fn()?.a);
|
||||
assert.sameValue(undefined, fn()?.b);
|
|
@ -0,0 +1,25 @@
|
|||
// Copyright 2019 Google, Inc. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: prod-OptionalExpression
|
||||
description: >
|
||||
template string passed to tail position of optional chain
|
||||
info: |
|
||||
Static Semantics: Early Errors
|
||||
OptionalChain:
|
||||
?.TemplateLiteral
|
||||
OptionalChain TemplateLiteral
|
||||
features: [optional-chaining]
|
||||
negative:
|
||||
type: SyntaxError
|
||||
phase: parse
|
||||
---*/
|
||||
|
||||
$DONOTEVALUATE();
|
||||
|
||||
const a = {fn() {}};
|
||||
|
||||
// This production exists in order to prevent automatic semicolon
|
||||
// insertion rules.
|
||||
a?.fn
|
||||
`hello`
|
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2019 Google, Inc. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: prod-OptionalExpression
|
||||
description: >
|
||||
template string passed to tail position of optional chain
|
||||
info: |
|
||||
Static Semantics: Early Errors
|
||||
OptionalChain:
|
||||
?.TemplateLiteral
|
||||
OptionalChain TemplateLiteral
|
||||
features: [optional-chaining]
|
||||
negative:
|
||||
type: SyntaxError
|
||||
phase: parse
|
||||
---*/
|
||||
|
||||
$DONOTEVALUATE();
|
||||
|
||||
const a = {fn() {}};
|
||||
|
||||
// This production exists in order to prevent automatic semicolon
|
||||
// insertion rules.
|
||||
a?.fn`hello`;
|
|
@ -0,0 +1,56 @@
|
|||
// Copyright 2019 Google, Inc. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: prod-OptionalExpression
|
||||
description: >
|
||||
optional chain on member expression
|
||||
info: |
|
||||
Left-Hand-Side Expressions
|
||||
OptionalExpression:
|
||||
MemberExpression OptionalChain
|
||||
features: [optional-chaining]
|
||||
---*/
|
||||
|
||||
// PrimaryExpression
|
||||
// IdentifierReference
|
||||
|
||||
const arr = [10, 11];
|
||||
const fn = (arg1, arg2) => {
|
||||
return arg1 + arg2;
|
||||
}
|
||||
const i = 0;
|
||||
const obj = {
|
||||
a: 'hello',
|
||||
b: {val: 13},
|
||||
c(arg1) {
|
||||
return arg1 * 2;
|
||||
},
|
||||
arr: [11, 12]
|
||||
};
|
||||
|
||||
// OptionalChain: ?.[Expression]
|
||||
assert.sameValue(11, arr?.[i + 1]);
|
||||
|
||||
// OptionalChain: ?.IdentifierName
|
||||
assert.sameValue('hello', obj?.a);
|
||||
|
||||
// OptionalChain: ?.Arguments
|
||||
assert.sameValue(30, fn?.(10, 20));
|
||||
|
||||
// OptionalChain: OptionalChain [Expression]
|
||||
assert.sameValue(12, obj?.arr[i + 1]);
|
||||
assert.throws(TypeError, function() {
|
||||
obj?.d[i + 1];
|
||||
});
|
||||
|
||||
// OptionalChain: OptionalChain .IdentifierName
|
||||
assert.sameValue(13, obj?.b.val);
|
||||
assert.throws(TypeError, function() {
|
||||
obj?.d.e;
|
||||
});
|
||||
|
||||
// OptionalChain: OptionalChain Arguments
|
||||
assert.sameValue(20, obj?.c(10));
|
||||
assert.throws(TypeError, function() {
|
||||
obj?.d();
|
||||
});
|
|
@ -0,0 +1,27 @@
|
|||
// Copyright 2019 Google, Inc. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: prod-OptionalExpression
|
||||
description: >
|
||||
optional chain on recursive optional expression
|
||||
info: |
|
||||
Left-Hand-Side Expressions
|
||||
OptionalExpression:
|
||||
OptionalExpression OptionalChain
|
||||
features: [optional-chaining]
|
||||
---*/
|
||||
|
||||
const obj = {
|
||||
a: {
|
||||
b: 22
|
||||
}
|
||||
};
|
||||
|
||||
function fn () {
|
||||
return {};
|
||||
}
|
||||
|
||||
// MemberExpression
|
||||
assert.sameValue(22, (obj?.a)?.b);
|
||||
// CallExpression
|
||||
assert.sameValue(undefined, (fn()?.a)?.b);
|
|
@ -0,0 +1,15 @@
|
|||
// Copyright 2019 Google, Inc. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: prod-OptionalExpression
|
||||
description: >
|
||||
ternary operation with decimal does not evaluate as optional chain
|
||||
info: |
|
||||
Punctuators
|
||||
OptionalChainingPunctuator::
|
||||
?.[lookahead ∉ DecimalDigit]
|
||||
features: [optional-chaining]
|
||||
---*/
|
||||
|
||||
const value = true ?.30 : false;
|
||||
assert.sameValue(.30, value);
|
|
@ -0,0 +1,18 @@
|
|||
// Copyright 2019 Google, Inc. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: prod-OptionalExpression
|
||||
description: >
|
||||
accessing optional value on undefined or null returns undefined.
|
||||
info: |
|
||||
If baseValue is undefined or null, then
|
||||
Return undefined.
|
||||
features: [optional-chaining]
|
||||
---*/
|
||||
|
||||
const nul = null;
|
||||
const undf = undefined;
|
||||
assert.sameValue(undefined, nul?.a);
|
||||
assert.sameValue(undefined, undf?.b);
|
||||
assert.sameValue(undefined, null?.a);
|
||||
assert.sameValue(undefined, undefined?.b);
|
|
@ -0,0 +1,22 @@
|
|||
// Copyright 2019 Google, Inc. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: prod-OptionalExpression
|
||||
description: >
|
||||
demonstrate syntax-based short-circuiting.
|
||||
info: |
|
||||
If the expression on the LHS of ?. evaluates to null/undefined, the RHS is
|
||||
not evaluated
|
||||
features: [optional-chaining]
|
||||
---*/
|
||||
|
||||
const a = undefined;
|
||||
let x = 1;
|
||||
|
||||
a?.[++x] // short-circuiting.
|
||||
a?.b.c(++x).d; // long short-circuiting.
|
||||
|
||||
undefined?.[++x] // short-circuiting.
|
||||
undefined?.b.c(++x).d; // long short-circuiting.
|
||||
|
||||
assert.sameValue(1, x);
|
|
@ -0,0 +1,23 @@
|
|||
|
||||
// Copyright 2019 Google, Inc. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: prod-OptionalExpression
|
||||
description: >
|
||||
an optional expression cannot be target of assignment
|
||||
info: |
|
||||
Static Semantics: IsValidSimpleAssignmentTarget
|
||||
LeftHandSideExpression:
|
||||
OptionalExpression
|
||||
Return false.
|
||||
features: [optional-chaining]
|
||||
negative:
|
||||
type: SyntaxError
|
||||
phase: parse
|
||||
---*/
|
||||
|
||||
$DONOTEVALUATE();
|
||||
|
||||
const obj = {};
|
||||
|
||||
obj?.a = 33;
|
Loading…
Reference in New Issue