mirror of https://github.com/tc39/test262.git
Add tests for Array.from
Limit tests to behavior of method when invoked with an iterable.
This commit is contained in:
parent
741b799286
commit
5cb1ba27d3
|
@ -0,0 +1,22 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: Error accessing items' `Symbol.iterator` attribute
|
||||
info: >
|
||||
[...]
|
||||
4. Let usingIterator be GetMethod(items, @@iterator).
|
||||
5. ReturnIfAbrupt(usingIterator).
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var items = {};
|
||||
Object.defineProperty(items, Symbol.iterator, {
|
||||
get: function() {
|
||||
throw new Test262Error();
|
||||
}
|
||||
});
|
||||
|
||||
assert.throws(Test262Error, function() {
|
||||
Array.from(items);
|
||||
});
|
|
@ -0,0 +1,28 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: Error advancing iterator
|
||||
info: >
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
[...]
|
||||
g. Repeat
|
||||
i. Let Pk be ToString(k).
|
||||
ii. Let next be IteratorStep(iterator).
|
||||
iii. ReturnIfAbrupt(next).
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var items = {};
|
||||
items[Symbol.iterator] = function() {
|
||||
return {
|
||||
next: function() {
|
||||
throw new Test262Error();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
assert.throws(Test262Error, function() {
|
||||
Array.from(items);
|
||||
});
|
|
@ -0,0 +1,26 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: >
|
||||
Error creating object with custom constructor (traversed via iterator)
|
||||
info: >
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
a. If IsConstructor(C) is true, then
|
||||
i. Let A be Construct(C).
|
||||
b. Else,
|
||||
i. Let A be ArrayCreate(0).
|
||||
c. ReturnIfAbrupt(A).
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var C = function() {
|
||||
throw new Test262Error();
|
||||
};
|
||||
var items = {};
|
||||
items[Symbol.iterator] = function() {};
|
||||
|
||||
assert.throws(Test262Error, function() {
|
||||
Array.from.call(C, items);
|
||||
});
|
|
@ -0,0 +1,46 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: Creating object with custom constructor (traversed via iterator)
|
||||
info: >
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
a. If IsConstructor(C) is true, then
|
||||
i. Let A be Construct(C).
|
||||
b. Else,
|
||||
i. Let A be ArrayCreate(0).
|
||||
c. ReturnIfAbrupt(A).
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var thisVal, args;
|
||||
var callCount = 0;
|
||||
var C = function() {
|
||||
thisVal = this;
|
||||
args = arguments;
|
||||
callCount += 1;
|
||||
};
|
||||
var result;
|
||||
var items = {};
|
||||
items[Symbol.iterator] = function() {
|
||||
return {
|
||||
next: function() {
|
||||
return { done: true };
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
result = Array.from.call(C, items);
|
||||
|
||||
assert(
|
||||
result instanceof C, 'Constructed value is an instance of the constructor'
|
||||
);
|
||||
assert.sameValue(
|
||||
result.constructor,
|
||||
C,
|
||||
'Constructed value correctly defines a `constructor` property'
|
||||
);
|
||||
assert.sameValue(callCount, 1, 'Constructor invoked exactly once');
|
||||
assert.sameValue(thisVal, result, 'Constructed value is returned');
|
||||
assert.sameValue(args.length, 0, 'Constructor invoked without arguments');
|
|
@ -0,0 +1,22 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: Error creating iterator object
|
||||
info: >
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
[...]
|
||||
d. Let iterator be GetIterator(items, usingIterator).
|
||||
e. ReturnIfAbrupt(iterator).
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var items = {};
|
||||
items[Symbol.iterator] = function() {
|
||||
throw new Test262Error();
|
||||
};
|
||||
|
||||
assert.throws(Test262Error, function() {
|
||||
Array.from(items);
|
||||
});
|
|
@ -0,0 +1,34 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: Error retrieving value of iterator result
|
||||
info: >
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
[...]
|
||||
g. Repeat
|
||||
[...]
|
||||
v. Let nextValue be IteratorValue(next).
|
||||
vi. ReturnIfAbrupt(nextValue).
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var items = {};
|
||||
var poisonedValue = {};
|
||||
Object.defineProperty(poisonedValue, 'value', {
|
||||
get: function() {
|
||||
throw new Test262Error();
|
||||
}
|
||||
});
|
||||
items[Symbol.iterator] = function() {
|
||||
return {
|
||||
next: function() {
|
||||
return poisonedValue;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
assert.throws(Test262Error, function() {
|
||||
Array.from(items);
|
||||
});
|
|
@ -0,0 +1,63 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: >
|
||||
Arguments of mapping function (traversed via iterator)
|
||||
info: >
|
||||
[...]
|
||||
2. If mapfn is undefined, let mapping be false.
|
||||
3. else
|
||||
a. If IsCallable(mapfn) is false, throw a TypeError exception.
|
||||
b. If thisArg was supplied, let T be thisArg; else let T be undefined.
|
||||
c. Let mapping be true
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
[...]
|
||||
g. Repeat
|
||||
[...]
|
||||
vii. If mapping is true, then
|
||||
1. Let mappedValue be Call(mapfn, T, «nextValue, k»).
|
||||
2. If mappedValue is an abrupt completion, return
|
||||
IteratorClose(iterator, mappedValue).
|
||||
3. Let mappedValue be mappedValue.[[value]].
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var args = [];
|
||||
var firstResult = { done: false, value: {} };
|
||||
var secondResult = { done: false, value: {} };
|
||||
var mapFn = function(value, idx) {
|
||||
args.push(arguments);
|
||||
};
|
||||
var items = {};
|
||||
var nextResult = firstResult;
|
||||
var nextNextResult = secondResult;
|
||||
|
||||
items[Symbol.iterator] = function() {
|
||||
return {
|
||||
next: function() {
|
||||
var result = nextResult;
|
||||
nextResult = nextNextResult;
|
||||
nextNextResult = { done: true };
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
Array.from(items, mapFn);
|
||||
|
||||
assert.sameValue(args.length, 2, 'Iteration count');
|
||||
|
||||
assert.sameValue(args[0].length, 2, 'First iteration: arguments length');
|
||||
assert.sameValue(
|
||||
args[0][0], firstResult.value, 'First iteration: first argument'
|
||||
);
|
||||
assert.sameValue(args[0][1], 0, 'First iteration: second argument');
|
||||
|
||||
assert.sameValue(args[1].length, 2, 'Second iteration: arguments length');
|
||||
assert.sameValue(
|
||||
args[1][0], secondResult.value, 'Second iteration: first argument'
|
||||
);
|
||||
assert.sameValue(args[1][1], 1, 'Second iteration: second argument');
|
|
@ -0,0 +1,41 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: Error invoking map function (traversed via iterator)
|
||||
info: >
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
[...]
|
||||
g. Repeat
|
||||
[...]
|
||||
vii. If mapping is true, then
|
||||
1. Let mappedValue be Call(mapfn, T, «nextValue, k»).
|
||||
2. If mappedValue is an abrupt completion, return
|
||||
IteratorClose(iterator, mappedValue).
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var closeCount = 0;
|
||||
var mapFn = function() {
|
||||
throw new Test262Error();
|
||||
};
|
||||
var items = {};
|
||||
items[Symbol.iterator] = function() {
|
||||
return {
|
||||
return: function() {
|
||||
closeCount += 1;
|
||||
},
|
||||
next: function() {
|
||||
return {
|
||||
done: false
|
||||
};
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
assert.throws(Test262Error, function() {
|
||||
Array.from(items, mapFn);
|
||||
});
|
||||
|
||||
assert.sameValue(closeCount, 1);
|
|
@ -0,0 +1,58 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: Value returned by mapping function (traversed via iterator)
|
||||
info: >
|
||||
[...]
|
||||
2. If mapfn is undefined, let mapping be false.
|
||||
3. else
|
||||
a. If IsCallable(mapfn) is false, throw a TypeError exception.
|
||||
b. If thisArg was supplied, let T be thisArg; else let T be undefined.
|
||||
c. Let mapping be true
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
[...]
|
||||
g. Repeat
|
||||
[...]
|
||||
vii. If mapping is true, then
|
||||
1. Let mappedValue be Call(mapfn, T, «nextValue, k»).
|
||||
2. If mappedValue is an abrupt completion, return
|
||||
IteratorClose(iterator, mappedValue).
|
||||
3. Let mappedValue be mappedValue.[[value]].
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var thisVals = [];
|
||||
var nextResult = { done: false, value: {} };
|
||||
var nextNextResult = { done: false, value: {} };
|
||||
var firstReturnVal = {};
|
||||
var secondReturnVal = {};
|
||||
var mapFn = function(value, idx) {
|
||||
var returnVal = nextReturnVal;
|
||||
nextReturnVal = nextNextReturnVal;
|
||||
nextNextReturnVal = null;
|
||||
return returnVal;
|
||||
};
|
||||
var nextReturnVal = firstReturnVal;
|
||||
var nextNextReturnVal = secondReturnVal;
|
||||
var items = {};
|
||||
var result;
|
||||
|
||||
items[Symbol.iterator] = function() {
|
||||
return {
|
||||
next: function() {
|
||||
var result = nextResult;
|
||||
nextResult = nextNextResult;
|
||||
nextNextResult = { done: true };
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
result = Array.from(items, mapFn);
|
||||
|
||||
assert.sameValue(result.length, 2);
|
||||
assert.sameValue(result[0], firstReturnVal);
|
||||
assert.sameValue(result[1], secondReturnVal);
|
|
@ -0,0 +1,49 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: >
|
||||
`this` value of mapping function with custom `this` argument (traversed via iterator)
|
||||
info: >
|
||||
[...]
|
||||
2. If mapfn is undefined, let mapping be false.
|
||||
3. else
|
||||
a. If IsCallable(mapfn) is false, throw a TypeError exception.
|
||||
b. If thisArg was supplied, let T be thisArg; else let T be undefined.
|
||||
c. Let mapping be true
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
[...]
|
||||
g. Repeat
|
||||
[...]
|
||||
vii. If mapping is true, then
|
||||
1. Let mappedValue be Call(mapfn, T, «nextValue, k»).
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var thisVals = [];
|
||||
var nextResult = { done: false, value: {} };
|
||||
var nextNextResult = { done: false, value: {} };
|
||||
var mapFn = function() {
|
||||
thisVals.push(this);
|
||||
};
|
||||
var items = {};
|
||||
var thisVal = {};
|
||||
|
||||
items[Symbol.iterator] = function() {
|
||||
return {
|
||||
next: function() {
|
||||
var result = nextResult;
|
||||
nextResult = nextNextResult;
|
||||
nextNextResult = { done: true };
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
Array.from(items, mapFn, thisVal);
|
||||
|
||||
assert.sameValue(thisVals.length, 2);
|
||||
assert.sameValue(thisVals[0], thisVal, 'First iteration `this` value');
|
||||
assert.sameValue(thisVals[1], thisVal, 'Second iteration `this` value');
|
|
@ -0,0 +1,50 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: >
|
||||
`this` value of mapping function in non-strict mode (traversed via iterator)
|
||||
info: >
|
||||
[...]
|
||||
2. If mapfn is undefined, let mapping be false.
|
||||
3. else
|
||||
a. If IsCallable(mapfn) is false, throw a TypeError exception.
|
||||
b. If thisArg was supplied, let T be thisArg; else let T be undefined.
|
||||
c. Let mapping be true
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
[...]
|
||||
g. Repeat
|
||||
[...]
|
||||
vii. If mapping is true, then
|
||||
1. Let mappedValue be Call(mapfn, T, «nextValue, k»).
|
||||
features: [Symbol.iterator]
|
||||
flags: [noStrict]
|
||||
---*/
|
||||
|
||||
var thisVals = [];
|
||||
var nextResult = { done: false, value: {} };
|
||||
var nextNextResult = { done: false, value: {} };
|
||||
var mapFn = function() {
|
||||
thisVals.push(this);
|
||||
};
|
||||
var items = {};
|
||||
var global = function() { return this; }();
|
||||
|
||||
items[Symbol.iterator] = function() {
|
||||
return {
|
||||
next: function() {
|
||||
var result = nextResult;
|
||||
nextResult = nextNextResult;
|
||||
nextNextResult = { done: true };
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
Array.from(items, mapFn);
|
||||
|
||||
assert.sameValue(thisVals.length, 2);
|
||||
assert.sameValue(thisVals[0], global, 'First iteration `this` value');
|
||||
assert.sameValue(thisVals[1], global, 'Second iteration `this` value');
|
|
@ -0,0 +1,49 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: >
|
||||
`this` value of mapping function in strict mode (traversed via iterator)
|
||||
info: >
|
||||
[...]
|
||||
2. If mapfn is undefined, let mapping be false.
|
||||
3. else
|
||||
a. If IsCallable(mapfn) is false, throw a TypeError exception.
|
||||
b. If thisArg was supplied, let T be thisArg; else let T be undefined.
|
||||
c. Let mapping be true
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
[...]
|
||||
g. Repeat
|
||||
[...]
|
||||
vii. If mapping is true, then
|
||||
1. Let mappedValue be Call(mapfn, T, «nextValue, k»).
|
||||
features: [Symbol.iterator]
|
||||
flags: [onlyStrict]
|
||||
---*/
|
||||
|
||||
var thisVals = [];
|
||||
var nextResult = { done: false, value: {} };
|
||||
var nextNextResult = { done: false, value: {} };
|
||||
var mapFn = function() {
|
||||
thisVals.push(this);
|
||||
};
|
||||
var items = {};
|
||||
|
||||
items[Symbol.iterator] = function() {
|
||||
return {
|
||||
next: function() {
|
||||
var result = nextResult;
|
||||
nextResult = nextNextResult;
|
||||
nextNextResult = { done: true };
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
Array.from(items, mapFn);
|
||||
|
||||
assert.sameValue(thisVals.length, 2);
|
||||
assert.sameValue(thisVals[0], undefined, 'First iteration `this` value');
|
||||
assert.sameValue(thisVals[1], undefined, 'Second iteration `this` value');
|
|
@ -0,0 +1,45 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: Error setting property on result value (traversed via iterator)
|
||||
info: >
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
[...]
|
||||
g. Repeat
|
||||
[...]
|
||||
ix. Let defineStatus be CreateDataPropertyOrThrow(A, Pk,
|
||||
mappedValue).
|
||||
x. If defineStatus is an abrupt completion, return
|
||||
IteratorClose(iterator, defineStatus).
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var C = function() {
|
||||
Object.defineProperty(this, '0', { configurable: false });
|
||||
};
|
||||
var closeCount = 0;
|
||||
var items = {};
|
||||
var nextResult = { done: false };
|
||||
|
||||
items[Symbol.iterator] = function() {
|
||||
return {
|
||||
return: function() {
|
||||
closeCount += 1;
|
||||
},
|
||||
next: function() {
|
||||
var result = nextResult;
|
||||
|
||||
nextResult = { done: true };
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
assert.throws(TypeError, function() {
|
||||
Array.from.call(C, items);
|
||||
});
|
||||
|
||||
assert.sameValue(closeCount, 1);
|
|
@ -0,0 +1,41 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: Setting property on result value (traversed via iterator)
|
||||
info: >
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
[...]
|
||||
g. Repeat
|
||||
[...]
|
||||
ix. Let defineStatus be CreateDataPropertyOrThrow(A, Pk,
|
||||
mappedValue).
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var items = {};
|
||||
var firstIterResult = { done: false, value: {} };
|
||||
var secondIterResult = { done: false, value: {} };
|
||||
var thirdIterResult = { done: true, value: {} };
|
||||
var nextIterResult = firstIterResult;
|
||||
var nextNextIterResult = secondIterResult;
|
||||
var result;
|
||||
|
||||
items[Symbol.iterator] = function() {
|
||||
return {
|
||||
next: function() {
|
||||
var result = nextIterResult;
|
||||
|
||||
nextIterResult = nextNextIterResult;
|
||||
nextNextIterResult = thirdIterResult;
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
result = Array.from(items);
|
||||
|
||||
assert.sameValue(result[0], firstIterResult.value);
|
||||
assert.sameValue(result[1], secondIterResult.value);
|
|
@ -0,0 +1,33 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: Error setting length of object (traversed via iterator)
|
||||
info: >
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
[...]
|
||||
g. Repeat
|
||||
[...]
|
||||
iv. If next is false, then
|
||||
1. Let setStatus be Set(A, "length", k, true).
|
||||
2. ReturnIfAbrupt(setStatus).
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var C = function() {};
|
||||
var items = {};
|
||||
Object.defineProperty(C.prototype, 'length', {
|
||||
set: function(_) {
|
||||
throw new Test262Error();
|
||||
}
|
||||
});
|
||||
items[Symbol.iterator] = function() {
|
||||
return {
|
||||
next: function() { return { done: true }; }
|
||||
};
|
||||
};
|
||||
|
||||
assert.throws(Test262Error, function() {
|
||||
Array.from.call(C, items);
|
||||
});
|
|
@ -0,0 +1,40 @@
|
|||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.2.1
|
||||
description: Setting length of object (traversed via iterator)
|
||||
info: >
|
||||
[...]
|
||||
6. If usingIterator is not undefined, then
|
||||
[...]
|
||||
g. Repeat
|
||||
[...]
|
||||
iv. If next is false, then
|
||||
1. Let setStatus be Set(A, "length", k, true).
|
||||
2. ReturnIfAbrupt(setStatus).
|
||||
3. Return A.
|
||||
features: [Symbol.iterator]
|
||||
---*/
|
||||
|
||||
var items = {};
|
||||
var result, nextIterResult, lastIterResult;
|
||||
items[Symbol.iterator] = function() {
|
||||
return {
|
||||
next: function() {
|
||||
var result = nextIterResult;
|
||||
nextIterResult = lastIterResult;
|
||||
return result;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
nextIterResult = lastIterResult = { done: true };
|
||||
result = Array.from(items);
|
||||
|
||||
assert.sameValue(result.length, 0);
|
||||
|
||||
nextIterResult = { done: false };
|
||||
lastIterResult = { done: true };
|
||||
result = Array.from(items);
|
||||
|
||||
assert.sameValue(result.length, 1);
|
Loading…
Reference in New Issue