]>
git.saurik.com Git - apple/javascriptcore.git/blob - tests/stress/array-from-with-iterator.js
1 function shouldBe(actual
, expected
) {
2 if (actual
!== expected
)
3 throw new Error('bad value: ' + actual
);
6 function shouldThrow(func
, message
) {
14 throw new Error("not thrown.");
15 if (String(error
) !== message
)
16 throw new Error("bad error: " + String(error
));
19 var originalArray
= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
21 var array
= Array
.from(originalArray
.values());
22 shouldBe(array
.length
, originalArray
.length
);
23 for (var i
= 0; i
< array
.length
; ++i
) {
24 shouldBe(array
[i
], originalArray
[i
]);
27 function createIterator(callback
) {
28 var array
= [0,1,2,3,4,5];
29 var iterator
= array
[Symbol
.iterator
]();
30 iterator
.return = function () {
31 iterator
.returned
= true;
33 return callback(this);
34 return { done: true, value: undefined };
36 iterator
.returned
= false;
40 var iterator
= createIterator();
41 var result
= Array
.from(iterator
);
42 shouldBe(result
.length
, 6);
43 for (var i
= 0; i
< 6; ++i
) {
44 shouldBe(result
[i
], i
);
46 shouldBe(iterator
.returned
, false);
48 // mapFn raises an error.
49 var iterator
= createIterator();
50 shouldThrow(function () {
51 var result
= Array
.from(iterator
, function () {
52 throw new Error('map func');
54 }, "Error: map func");
55 shouldBe(iterator
.returned
, true);
57 // mapFn raises an error and iterator.return also raises an error.
58 var iterator
= createIterator(function () {
59 throw new Error('iterator.return');
62 // An error raised in iterator.return is discarded.
63 shouldThrow(function () {
64 var result
= Array
.from(iterator
, function () {
65 throw new Error('map func');
67 }, "Error: map func");
68 shouldBe(iterator
.returned
, true);
70 // iterable[Symbol.iterator] is not a function.
71 shouldThrow(function () {
72 var iterator
= [].values();
73 iterator
[Symbol
.iterator
] = {};
75 }, "TypeError: Array.from requires that the property of the first argument, items[Symbol.iterator], when exists, be a function");
77 // iterable[Symbol.iterator] raises an error.
78 shouldThrow(function () {
80 iterable
[Symbol
.iterator
] = function () {
81 throw new Error("iterator");
84 }, "Error: iterator");
86 // iterable[Symbol.iterator] lookup is only once.
88 var iterable
= [0, 1, 2, 3, 4, 5];
90 var iteratorCallCount
= 0;
91 Object
.defineProperty(iterable
, Symbol
.iterator
, {
100 var generated
= Array
.from(iterable
);
101 shouldBe(generated
.length
, iterable
.length
);
102 for (var i
= 0; i
< iterable
.length
; ++i
) {
103 shouldBe(generated
[i
], iterable
[i
]);
106 shouldBe(iteratorCallCount
, 1);
109 // The Symbol.iterator method of the iterator generated by iterable[Symbol.iterator] is not looked up.
111 var iterable
= [0, 1, 2, 3, 4, 5];
113 iterable
[Symbol
.iterator
] = function () {
115 var iterator
= this.values();
116 Object
.defineProperty(iterator
, Symbol
.iterator
, {
118 throw new Error('iterator[@@iterator] is touched');
123 var generated
= Array
.from(iterable
);
124 shouldBe(generated
.length
, iterable
.length
);
125 for (var i
= 0; i
< iterable
.length
; ++i
) {
126 shouldBe(generated
[i
], iterable
[i
]);