Merge pull request #381 from bocoup/array-iterator-methods

Add and update tests for Array.prototype iterator methods.
This commit is contained in:
Brian Terlson 2015-07-27 17:08:19 -07:00
commit 02fbde769c
22 changed files with 448 additions and 80 deletions

View File

@ -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.3.4
description: >
Property type and descriptor.
info: >
22.1.3.4 Array.prototype.entries ( )
17 ECMAScript Standard Built-in Objects
includes: [propertyHelper.js]
---*/
assert.sameValue(
typeof Array.prototype.entries,
'function',
'`typeof Array.prototype.entries` is `function`'
);
verifyNotEnumerable(Array.prototype, 'entries');
verifyWritable(Array.prototype, 'entries');
verifyConfigurable(Array.prototype, 'entries');

View File

@ -1,14 +1,15 @@
// Copyright (C) 2013 the V8 project authors. All rights reserved. // Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/*--- /*---
description: > es6id: 22.1.3.4
The method should return a valid iterator with the context as the description: >
IteratedObject. When an item is added to the array after the iterator is New items in the array are accessible via iteration until iterator is "done".
created but before the iterator is "done" (as defined by 22.1.5.2.1) the info: >
new item should be accessible via iteration. The method should return a valid iterator with the context as the
es6id: 22.1.3.4 IteratedObject. When an item is added to the array after the iterator is
---*/ created but before the iterator is "done" (as defined by 22.1.5.2.1) the
new item should be accessible via iteration.
---*/
var array = []; var array = [];
var iterator = array.entries(); var iterator = array.entries();

View File

@ -1,20 +1,21 @@
// Copyright (C) 2013 the V8 project authors. All rights reserved. // Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/*--- /*---
description: > es6id: 22.1.3.4
The method should return a valid iterator with the context as the description: >
IteratedObject. The return is a valid iterator with the array's numeric properties.
es6id: 22.1.3.4 info: >
---*/ 22.1.3.4 Array.prototype.entries ( )
1. Let O be ToObject(this value).
2. ReturnIfAbrupt(O).
3. Return CreateArrayIterator(O, "key+value").
---*/
var ArrayIteratorPrototype = Object.getPrototypeOf(Array.prototype[Symbol.iterator]());
var array = ['a', 'b', 'c']; var array = ['a', 'b', 'c'];
var iterator = array.entries(); var iterator = array.entries();
var result; var result;
assert.sameValue(ArrayIteratorPrototype, Object.getPrototypeOf(array.entries()));
result = iterator.next(); result = iterator.next();
assert.sameValue(result.done, false, 'First result `done` flag'); assert.sameValue(result.done, false, 'First result `done` flag');
assert.sameValue(result.value[0], 0, 'First result `value` (array key)'); assert.sameValue(result.value[0], 0, 'First result `value` (array key)');

View File

@ -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.3.4
description: >
Array.prototype.entries.length value and descriptor.
info: >
22.1.3.4 Array.prototype.entries ( )
17 ECMAScript Standard Built-in Objects
includes: [propertyHelper.js]
---*/
assert.sameValue(
Array.prototype.entries.length, 0,
'The value of `Array.prototype.entries.length` is `0`'
);
verifyNotEnumerable(Array.prototype.entries, 'length');
verifyNotWritable(Array.prototype.entries, 'length');
verifyConfigurable(Array.prototype.entries, 'length');

View File

@ -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.3.4
description: >
Array.prototype.entries.name value and descriptor.
info: >
22.1.3.4 Array.prototype.entries ( )
17 ECMAScript Standard Built-in Objects
includes: [propertyHelper.js]
---*/
assert.sameValue(
Array.prototype.entries.name, 'entries',
'The value of `Array.prototype.entries.name` is `"entries"`'
);
verifyNotEnumerable(Array.prototype.entries, 'name');
verifyNotWritable(Array.prototype.entries, 'name');
verifyConfigurable(Array.prototype.entries, 'name');

View File

@ -1,14 +0,0 @@
// Copyright (C) 2013 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: >
The method should exist on the Array prototype, and it should be writable
and configurable, but not enumerable.
includes: [propertyHelper.js]
es6id: 17
---*/
verifyNotEnumerable(Array.prototype, 'entries');
verifyWritable(Array.prototype, 'entries');
verifyConfigurable(Array.prototype, 'entries');

View File

@ -0,0 +1,20 @@
// 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.3.4
description: >
Return abrupt from ToObject(this value).
info: >
22.1.3.4 Array.prototype.entries ( )
1. Let O be ToObject(this value).
2. ReturnIfAbrupt(O).
---*/
assert.throws(TypeError, function() {
Array.prototype.entries.call(undefined);
});
assert.throws(TypeError, function() {
Array.prototype.entries.call(null);
});

View File

@ -0,0 +1,25 @@
// 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.3.4
description: >
Creates an iterator from a custom object.
info: >
22.1.3.4 Array.prototype.entries ( )
1. Let O be ToObject(this value).
2. ReturnIfAbrupt(O).
3. Return CreateArrayIterator(O, "key+value").
features: [Symbol.iterator]
---*/
var obj = {
length: 2
};
var iter = Array.prototype.entries.call(obj);
var ArrayIteratorProto = Object.getPrototypeOf([][Symbol.iterator]());
assert.sameValue(
Object.getPrototypeOf(iter), ArrayIteratorProto,
'The prototype of [].entries() is %ArrayIteratorPrototype%'
);

View File

@ -1,13 +1,30 @@
// Copyright (C) 2013 the V8 project authors. All rights reserved. // Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/*--- /*---
description: > es6id: 22.1.3.4
The method should return an Iterator instance. description: >
es6id: 22.1.3.4 The method should return an Iterator instance.
---*/ info: >
22.1.3.4 Array.prototype.entries ( )
1. Let O be ToObject(this value).
2. ReturnIfAbrupt(O).
3. Return CreateArrayIterator(O, "key+value").
22.1.5.1 CreateArrayIterator Abstract Operation
...
2. Let iterator be ObjectCreate(%ArrayIteratorPrototype%, «[[IteratedObject]],
[[ArrayIteratorNextIndex]], [[ArrayIterationKind]]»).
...
6. Return iterator.
features: [Symbol.iterator]
---*/
var ArrayIteratorProto = Object.getPrototypeOf([][Symbol.iterator]()); var ArrayIteratorProto = Object.getPrototypeOf([][Symbol.iterator]());
var iter = [].entries(); var iter = [].entries();
assert.sameValue(Object.getPrototypeOf(iter), ArrayIteratorProto); assert.sameValue(
Object.getPrototypeOf(iter), ArrayIteratorProto,
'The prototype of [].entries() is %ArrayIteratorPrototype%'
);

View File

@ -1,15 +1,16 @@
// Copyright (C) 2013 the V8 project authors. All rights reserved. // Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/*--- /*---
description: > es6id: 22.1.3.13
When an item is added to the array after the iterator is created but description: >
before the iterator is "done" (as defined by 22.1.5.2.1), the new item's New items in the array are accessible via iteration until iterator is "done".
key should be accessible via iteration. When an item is added to the info: >
array after the iterator is "done", the new item's key should not be When an item is added to the array after the iterator is created but
accessible via iteration. before the iterator is "done" (as defined by 22.1.5.2.1), the new item's
es6id: 22.1.3.13 key should be accessible via iteration. When an item is added to the
---*/ array after the iterator is "done", the new item's key should not be
accessible via iteration.
---*/
var array = []; var array = [];
var iterator = array.keys(); var iterator = array.keys();
@ -28,5 +29,11 @@ assert.sameValue(result.value, undefined, 'Exhausted result `value`');
array.push('b'); array.push('b');
result = iterator.next(); result = iterator.next();
assert.sameValue(result.done, true, 'Exhausted result `done` flag (after push)'); assert.sameValue(
assert.sameValue(result.value, undefined, 'Exhausted result `value` (after push)'); result.done, true,
'Exhausted result `done` flag (after push)'
);
assert.sameValue(
result.value, undefined,
'Exhausted result `value` (after push)'
);

View File

@ -1,12 +1,16 @@
// Copyright (C) 2013 the V8 project authors. All rights reserved. // Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/*--- /*---
description: > es6id: 22.1.3.13
The method should return a valid iterator with the array's numeric description: >
properties as the IteratedObject. The return is a valid iterator with the array's numeric properties.
es6id: 22.1.3.13 info: >
---*/ 22.1.3.13 Array.prototype.keys ( )
1. Let O be ToObject(this value).
2. ReturnIfAbrupt(O).
3. Return CreateArrayIterator(O, "key").
---*/
var array = ['a', 'b', 'c']; var array = ['a', 'b', 'c'];
var iterator = array.keys(); var iterator = array.keys();

View File

@ -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.3.13
description: >
Property type and descriptor.
info: >
22.1.3.13 Array.prototype.keys ( )
17 ECMAScript Standard Built-in Objects
includes: [propertyHelper.js]
---*/
assert.sameValue(
typeof Array.prototype.keys,
'function',
'`typeof Array.prototype.keys` is `function`'
);
verifyNotEnumerable(Array.prototype, 'keys');
verifyWritable(Array.prototype, 'keys');
verifyConfigurable(Array.prototype, 'keys');

View File

@ -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.3.13
description: >
Array.prototype.keys.length value and descriptor.
info: >
22.1.3.13 Array.prototype.keys ( )
17 ECMAScript Standard Built-in Objects
includes: [propertyHelper.js]
---*/
assert.sameValue(
Array.prototype.keys.length, 0,
'The value of `Array.prototype.keys.length` is `0`'
);
verifyNotEnumerable(Array.prototype.keys, 'length');
verifyNotWritable(Array.prototype.keys, 'length');
verifyConfigurable(Array.prototype.keys, 'length');

View File

@ -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.3.13
description: >
Array.prototype.keys.name value and descriptor.
info: >
22.1.3.13 Array.prototype.keys ( )
17 ECMAScript Standard Built-in Objects
includes: [propertyHelper.js]
---*/
assert.sameValue(
Array.prototype.keys.name, 'keys',
'The value of `Array.prototype.keys.name` is `"keys"`'
);
verifyNotEnumerable(Array.prototype.keys, 'name');
verifyNotWritable(Array.prototype.keys, 'name');
verifyConfigurable(Array.prototype.keys, 'name');

View File

@ -1,14 +0,0 @@
// Copyright (C) 2013 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: >
The method should exist on the Array prototype, and it should be writable
and configurable, but not enumerable.
includes: [propertyHelper.js]
es6id: 22.1.3.13
---*/
verifyNotEnumerable(Array.prototype, 'keys');
verifyWritable(Array.prototype, 'keys');
verifyConfigurable(Array.prototype, 'keys');

View File

@ -0,0 +1,20 @@
// 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.3.13
description: >
Return abrupt from ToObject(this value).
info: >
22.1.3.13 Array.prototype.keys ( )
1. Let O be ToObject(this value).
2. ReturnIfAbrupt(O).
---*/
assert.throws(TypeError, function() {
Array.prototype.keys.call(undefined);
});
assert.throws(TypeError, function() {
Array.prototype.keys.call(null);
});

View File

@ -0,0 +1,25 @@
// 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.3.13
description: >
Creates an iterator from a custom object.
info: >
22.1.3.13 Array.prototype.keys ( )
1. Let O be ToObject(this value).
2. ReturnIfAbrupt(O).
3. Return CreateArrayIterator(O, "key").
features: [Symbol.iterator]
---*/
var obj = {
length: 2
};
var iter = Array.prototype.keys.call(obj);
var ArrayIteratorProto = Object.getPrototypeOf([][Symbol.iterator]());
assert.sameValue(
Object.getPrototypeOf(iter), ArrayIteratorProto,
'The prototype of [].keys() is %ArrayIteratorPrototype%'
);

View File

@ -1,13 +1,30 @@
// Copyright (C) 2013 the V8 project authors. All rights reserved. // Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/*--- /*---
description: > es6id: 22.1.3.13
The method should return an Iterator instance. description: >
es6id: 22.1.3.13 The method should return an Iterator instance.
---*/ info: >
22.1.3.13 Array.prototype.keys ( )
1. Let O be ToObject(this value).
2. ReturnIfAbrupt(O).
3. Return CreateArrayIterator(O, "key").
22.1.5.1 CreateArrayIterator Abstract Operation
...
2. Let iterator be ObjectCreate(%ArrayIteratorPrototype%, «[[IteratedObject]],
[[ArrayIteratorNextIndex]], [[ArrayIterationKind]]»).
...
6. Return iterator.
features: [Symbol.iterator]
---*/
var ArrayIteratorProto = Object.getPrototypeOf([][Symbol.iterator]()); var ArrayIteratorProto = Object.getPrototypeOf([][Symbol.iterator]());
var iter = [].keys(); var iter = [].keys();
assert.sameValue(Object.getPrototypeOf(iter), ArrayIteratorProto); assert.sameValue(
Object.getPrototypeOf(iter), ArrayIteratorProto,
'The prototype of [].keys() is %ArrayIteratorPrototype%'
);

View File

@ -0,0 +1,39 @@
// 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.3.29
description: >
New items in the array are accessible via iteration until iterator is "done".
info: >
When an item is added to the array after the iterator is created but
before the iterator is "done" (as defined by 22.1.5.2.1), the new item's
value should be accessible via iteration. When an item is added to the
array after the iterator is "done", the new item should not be
accessible via iteration.
---*/
var array = [];
var iterator = array.values();
var result;
array.push('a');
result = iterator.next();
assert.sameValue(result.done, false , 'First result `done` flag');
assert.sameValue(result.value, 'a', 'First result `value`');
result = iterator.next();
assert.sameValue(result.done, true, 'Exhausted result `done` flag');
assert.sameValue(result.value, undefined, 'Exhausted result `value`');
array.push('b');
result = iterator.next();
assert.sameValue(
result.done, true,
'Exhausted result `done` flag (after push)'
);
assert.sameValue(
result.value, undefined,
'Exhausted result `value` (after push)'
);

View File

@ -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.3.29
description: >
The return is a valid iterator with the array's numeric properties.
info: >
22.1.3.29 Array.prototype.values ( )
1. Let O be ToObject(this value).
2. ReturnIfAbrupt(O).
3. Return CreateArrayIterator(O, "value").
---*/
var array = ['a', 'b', 'c'];
var iterator = array.values();
var result;
result = iterator.next();
assert.sameValue(result.value, 'a', 'First result `value`');
assert.sameValue(result.done, false, 'First result `done` flag');
result = iterator.next();
assert.sameValue(result.value, 'b', 'Second result `value`');
assert.sameValue(result.done, false, 'Second result `done` flag');
result = iterator.next();
assert.sameValue(result.value, 'c', 'Third result `value`');
assert.sameValue(result.done, false, 'Third result `done` flag');
result = iterator.next();
assert.sameValue(result.value, undefined, 'Exhausted result `value`');
assert.sameValue(result.done, true, 'Exhausted result `done` flag');

View File

@ -0,0 +1,25 @@
// 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.3.29
description: >
Creates an iterator from a custom object.
info: >
22.1.3.29 Array.prototype.values ( )
1. Let O be ToObject(this value).
2. ReturnIfAbrupt(O).
3. Return CreateArrayIterator(O, "value").
features: [Symbol.iterator]
---*/
var obj = {
length: 2
};
var iter = Array.prototype.values.call(obj);
var ArrayIteratorProto = Object.getPrototypeOf([][Symbol.iterator]());
assert.sameValue(
Object.getPrototypeOf(iter), ArrayIteratorProto,
'The prototype of [].values() is %ArrayIteratorPrototype%'
);

View File

@ -0,0 +1,30 @@
// 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.3.29
description: >
The method should return an Iterator instance.
info: >
22.1.3.29 Array.prototype.values ( )
1. Let O be ToObject(this value).
2. ReturnIfAbrupt(O).
3. Return CreateArrayIterator(O, "value").
22.1.5.1 CreateArrayIterator Abstract Operation
...
2. Let iterator be ObjectCreate(%ArrayIteratorPrototype%, «[[IteratedObject]],
[[ArrayIteratorNextIndex]], [[ArrayIterationKind]]»).
...
6. Return iterator.
features: [Symbol.iterator]
---*/
var ArrayIteratorProto = Object.getPrototypeOf([][Symbol.iterator]());
var iter = [].values();
assert.sameValue(
Object.getPrototypeOf(iter), ArrayIteratorProto,
'The prototype of [].values() is %ArrayIteratorPrototype%'
);