// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --allow-natives-syntax
(function TestBasics() {
var a = [1, 2];
var b = [...a];
assertArrayEquals([1, 2], b)
assertArrayEquals(['a', 'b', 'c', 'd', 'e', 'f'],
['a', ...'bc', 'd', ...'ef'])
})();
var log = [];
function* gen(n) {
log.push(n, 1);
yield 1;
log.push(n, 2);
yield 2;
log.push(n, 3);
yield 3;
log.push(n, 'done');
}
function id(v) {
log.push(v);
return v;
}
(function TestGenerator() {
assertArrayEquals([1, 2, 3], [...gen('a')]);
assertArrayEquals(['x', 1, 2, 3, 'y', 1, 2, 3, 'z'],
['x', ...gen('a'), 'y', ...gen('b'), 'z']);
})();
(function TestOrderOfExecution() {
log = [];
assertArrayEquals(['x', 1, 2, 3, 'y', 1, 2, 3, 'z'],
[id('x'), ...gen('a'), id('y'), ...gen('b'), id('z')]);
assertArrayEquals([
'x', 'a', 1, 'a', 2, 'a', 3, 'a', 'done',
'y', 'b', 1, 'b', 2, 'b', 3, 'b', 'done',
'z'
], log);
})();
(function TestNotIterable() {
var a;
assertThrows(function() {
a = [...42];
}, TypeError);
assertSame(undefined, a);
})();
(function TestInvalidIterator() {
var iter = {
[Symbol.iterator]: 42
};
var a;
assertThrows(function() {
a = [...iter];
}, TypeError);
assertSame(undefined, a);
})();
(function TestIteratorNotAnObject() {
var iter = {
[Symbol.iterator]() {
return 42;
}
};
var a;
assertThrows(function() {
a = [...iter];
}, TypeError);
assertSame(undefined, a);
})();
(function TestIteratorNoNext() {
var iter = {
[Symbol.iterator]() {
return {};
}
};
var a;
assertThrows(function() {
a = [...iter];
}, TypeError);
assertSame(undefined, a);
})();
(function TestIteratorResultDoneThrows() {
function MyError() {}
var iter = {
[Symbol.iterator]() {
return {
next() {
return {
get done() {
throw new MyError();
}
}
}
};
}
};
var a;
assertThrows(function() {
a = [...iter];
}, MyError);
assertSame(undefined, a);
})();
(function TestIteratorResultValueThrows() {
function MyError() {}
var iter = {
[Symbol.iterator]() {
return {
next() {
return {
done: false,
get value() {
throw new MyError();
}
}
}
};
}
};
var a;
assertThrows(function() {
a = [...iter];
}, MyError);
assertSame(undefined, a);
})();
(function TestOptimize() {
function f() {
return [...'abc'];
}
assertArrayEquals(['a', 'b', 'c'], f());
%OptimizeFunctionOnNextCall(f);
assertArrayEquals(['a', 'b', 'c'], f());
})();
(function TestDeoptimize() {
var iter = {
[Symbol.iterator]() {
var i = 0;
return {
next() {
$DeoptimizeFunction(f);
return {value: ++i, done: i === 3};
}
};
}
};
function f() {
return [0, ...iter];
}
assertArrayEquals([0, 1, 2], f());
});