Source code
Revision control
Copy as Markdown
Other Tools
// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
/*
TupleElementList : AssignmentExpression
1. Let initResult be the result of evaluating AssignmentExpression.
2. Let initValue be ? GetValue(initResult).
3. Return ? AddValueToTupleSequenceList(sequence, value).
*/
var a = 5;
var b = 10;
var arr = [1,2,3,4,5];
var badArr = [1, new Object(), 3];
var t = #[a < b ? "x" : "y"];
assertEq(t, #["x"]);
t = #[0 in arr, 42 in arr, 1 in arr, 100 in arr];
assertEq(t, #[true, false, true, false]);
t = #[a = 1, b = b * 3];
assertEq(t, #[1, 30]);
assertEq(a, 1);
assertEq(b, 30);
/* 6.1.2.1
TupleElementList : AssignmentExpression
...
2. Let initValue be ? GetValue(initResult).
...
6.2.4.5 GetValue ( V )
The abstract operation GetValue takes argument V. It performs the following steps when called:
1. ReturnIfAbrupt(V).
*/
let bBefore = b;
let tBefore = t;
function f() { throw new RangeError(); }
assertThrowsInstanceOf(() => t = #[a = 2, f(), b = 3],
RangeError, "t = #[a = 2, f(), b = 3] throws");
assertEq(a, 2);
assertEq(b, bBefore);
assertEq(t, tBefore);
/*
GetValue
...
3. If IsUnresolvableReference(V) is true, throw a ReferenceError exception.
*/
assertThrowsInstanceOf(() => t = #[unbound],
ReferenceError, "t = #[unbound] throws");
assertEq(t, tBefore);
/* 6.1.2.1
TupleElementList : AssignmentExpression
...
3. Return ? AddValueToTupleSequenceList(sequence, value).
*/
assertThrowsInstanceOf(() => t = #[new Object()],
TypeError, "Object in Tuple");
assertEq(t, tBefore);
assertThrowsInstanceOf(() => t = #[{}],
TypeError, "Object in Tuple")
assertEq(t, tBefore);
assertThrowsInstanceOf(() => t = #[new String("s")],
TypeError, "Object in Tuple")
assertEq(t, tBefore);
assertThrowsInstanceOf(() => t = #[[1,2,3]],
TypeError, "Object in Tuple")
assertEq(t, tBefore);
assertThrowsInstanceOf(() => t = #[function(x) { return x; }],
TypeError, "Object in Tuple")
assertEq(t, tBefore);
/* 6.1.2.1
TupleElementList : SpreadElement
1. Return the Result of performing TupleSequenceAccumulation for SpreadElement with argument sequence.
*/
assertEq(#[...arr], #[1,2,3,4,5]);
assertThrowsInstanceOf(() => #[...badArr],
TypeError, "Object in Tuple");
/*
TupleElementList : TupleElementList , AssignmentExpression
1. Perform TupleSequenceAccumulation for TupleElementList with argument sequence.
2. Let initResult be the result of evaluating AssignmentExpression.
3. Let initValue be ? GetValue(initResult).
4. Return ? AddValueToTupleSequenceList(sequence, value).
*/
assertThrowsInstanceOf(() => t = #[1, a = 5, b = new Object(), 5],
TypeError, "Object in Tuple");
assertEq(t, tBefore);
/* TupleElementList : TupleElementList , SpreadElement
1. Perform TupleSequenceAccumulation for TupleElementList with argument sequence.
2. Return the Result of performing TupleSequenceAccumulation for SpreadElement with argument sequence.
*/
assertEq(#["a", "b", ...arr, "c"], #["a", "b", 1, 2, 3, 4, 5, "c"]);
assertThrowsInstanceOf(() => t = #["a", "b", ...badArr, "c"],
TypeError, "Object in Tuple");
/*
SpreadElement : ... AssignmentExpression
1. Let spreadRef be the result of evaluating AssignmentExpression.
2. Let spreadObj be ? GetValue(spreadRef).
3. Let iteratorRecord be ? GetIterator(spreadObj).
4. Repeat,
a. Let next be ? IteratorStep(iteratorRecord).
b. If next is false, return sequence.
c. Let nextValue be ? IteratorValue(next).
d. Let completion be AddValueToTupleSequenceList(sequence, nextValue).
e. If completion is an abrupt completion, then
i. Return IteratorClose(iteratorRecord, completion).
*/
/* Step 2 */
assertThrowsInstanceOf(() => t = #[...unbound],
ReferenceError, "t = #[...unbound throws]");
assertEq(t, tBefore);
/* Step 3 */
var notIterable = Symbol('c');
assertThrowsInstanceOf(() => t = #[...notIterable],
TypeError, "t = #[...notIterable] is type error");
/* TODO -- test other iterator cases */
reportCompare(0, 0);