123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855 |
- // Copyright 2007 The Closure Library Authors. All Rights Reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS-IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- goog.provide('goog.iterTest');
- goog.setTestOnly('goog.iterTest');
- goog.require('goog.iter');
- goog.require('goog.iter.Iterator');
- goog.require('goog.iter.StopIteration');
- goog.require('goog.testing.jsunit');
- function ArrayIterator(array) {
- this.array_ = array;
- this.current_ = 0;
- }
- goog.inherits(ArrayIterator, goog.iter.Iterator);
- ArrayIterator.prototype.next = function() {
- if (this.current_ >= this.array_.length) {
- throw goog.iter.StopIteration;
- }
- return this.array_[this.current_++];
- };
- function testForEach() {
- var s = '';
- var iter = new ArrayIterator(['a', 'b', 'c', 'd']);
- goog.iter.forEach(iter, function(val, index, iter2) {
- assertEquals(iter, iter2);
- assertEquals('index should be undefined', 'undefined', typeof index);
- s += val;
- });
- assertEquals('abcd', s);
- }
- function testJoin() {
- var iter = new ArrayIterator(['a', 'b', 'c', 'd']);
- assertEquals('abcd', goog.iter.join(iter, ''));
- iter = new ArrayIterator(['a', 'b', 'c', 'd']);
- assertEquals('a,b,c,d', goog.iter.join(iter, ','));
- // make sure everything is treated as strings
- iter = new ArrayIterator([0, 1, 2, 3]);
- assertEquals('0123', goog.iter.join(iter, ''));
- iter = new ArrayIterator([0, 1, 2, 3]);
- assertEquals('0919293', goog.iter.join(iter, 9));
- // Joining an empty iterator should result in an empty string
- iter = new ArrayIterator([]);
- assertEquals('', goog.iter.join(iter, ','));
- }
- function testRange() {
- var iter = goog.iter.range(0, 5, 1);
- assertEquals('01234', goog.iter.join(iter, ''));
- iter = goog.iter.range(0, 5, 2);
- assertEquals('024', goog.iter.join(iter, ''));
- iter = goog.iter.range(0, 5, 5);
- assertEquals('0', goog.iter.join(iter, ''));
- iter = goog.iter.range(0, 5, 10);
- assertEquals('0', goog.iter.join(iter, ''));
- // negative step
- var iter = goog.iter.range(5, 0, -1);
- assertEquals('54321', goog.iter.join(iter, ''));
- iter = goog.iter.range(5, 0, -2);
- assertEquals('531', goog.iter.join(iter, ''));
- iter = goog.iter.range(5, 0, -5);
- assertEquals('5', goog.iter.join(iter, ''));
- iter = goog.iter.range(5, 0, -10);
- assertEquals('5', goog.iter.join(iter, ''));
- // wrong direction should result in empty iterator
- iter = goog.iter.range(0, 5, -1);
- assertEquals('', goog.iter.join(iter, ''));
- iter = goog.iter.range(5, 0, 1);
- assertEquals('', goog.iter.join(iter, ''));
- // a step of 0 is not allowed
- goog.iter.range(0, 5, 0);
- // test the opt args
- iter = goog.iter.range(0, 5);
- assertEquals('01234', goog.iter.join(iter, ''));
- iter = goog.iter.range(5);
- assertEquals('01234', goog.iter.join(iter, ''));
- }
- function testFilter() {
- var iter = goog.iter.range(5);
- var iter2 = goog.iter.filter(iter, function(val, index, iter3) {
- assertEquals(iter, iter3);
- assertEquals('index should be undefined', 'undefined', typeof index);
- return val > 1;
- });
- assertEquals('234', goog.iter.join(iter2, ''));
- // Chaining filters
- iter = goog.iter.range(10);
- var sb = [];
- var evens = goog.iter.filter(iter, function(v) {
- sb.push('a' + v);
- return v % 2 == 0;
- });
- var evens2 = goog.iter.filter(evens, function(v) {
- sb.push('b' + v);
- return v >= 5;
- });
- assertEquals('68', goog.iter.join(evens2, ''));
- // Note the order here. The next calls are done lazily.
- assertEquals('a0b0a1a2b2a3a4b4a5a6b6a7a8b8a9', sb.join(''));
- }
- function testFilterFalse() {
- var iter = goog.iter.range(5);
- var iter2 = goog.iter.filterFalse(iter, function(val, index, iter3) {
- assertEquals(iter, iter3);
- assertEquals('index should be undefined', 'undefined', typeof index);
- return val < 2;
- });
- assertEquals('234', goog.iter.join(iter2, ''));
- // Chaining filters
- iter = goog.iter.range(10);
- var sb = [];
- var odds = goog.iter.filterFalse(iter, function(v) {
- sb.push('a' + v);
- return v % 2 == 0;
- });
- var odds2 = goog.iter.filterFalse(odds, function(v) {
- sb.push('b' + v);
- return v <= 5;
- });
- assertEquals('79', goog.iter.join(odds2, ''));
- // Note the order here. The next calls are done lazily.
- assertEquals('a0a1b1a2a3b3a4a5b5a6a7b7a8a9b9', sb.join(''));
- }
- function testMap() {
- var iter = goog.iter.range(4);
- var iter2 = goog.iter.map(iter, function(val, index, iter3) {
- assertEquals(iter, iter3);
- assertEquals('index should be undefined', 'undefined', typeof index);
- return val * val;
- });
- assertEquals('0149', goog.iter.join(iter2, ''));
- }
- function testReduce() {
- var iter = goog.iter.range(1, 5);
- assertEquals(
- 10, // 1 + 2 + 3 + 4
- goog.iter.reduce(iter, function(val, el) { return val + el; }, 0));
- }
- function testReduce2() {
- var iter = goog.iter.range(1, 5);
- assertEquals(
- 24, // 4!
- goog.iter.reduce(iter, function(val, el) { return val * el; }, 1));
- }
- function testSome() {
- var iter = goog.iter.range(5);
- var b = goog.iter.some(iter, function(val, index, iter3) {
- assertEquals(iter, iter3);
- assertEquals('index should be undefined', 'undefined', typeof index);
- return val > 1;
- });
- assertTrue(b);
- iter = goog.iter.range(5);
- b = goog.iter.some(iter, function(val, index, iter3) {
- assertEquals(iter, iter3);
- assertEquals('index should be undefined', 'undefined', typeof index);
- return val > 100;
- });
- assertFalse(b);
- }
- function testEvery() {
- var iter = goog.iter.range(5);
- var b = goog.iter.every(iter, function(val, index, iter3) {
- assertEquals(iter, iter3);
- assertEquals('index should be undefined', 'undefined', typeof index);
- return val >= 0;
- });
- assertTrue(b);
- iter = goog.iter.range(5);
- b = goog.iter.every(iter, function(val, index, iter3) {
- assertEquals(iter, iter3);
- assertEquals('index should be undefined', 'undefined', typeof index);
- return val > 1;
- });
- assertFalse(b);
- }
- function testChain() {
- var iter = goog.iter.range(0, 2);
- var iter2 = goog.iter.range(2, 4);
- var iter3 = goog.iter.range(4, 6);
- var iter4 = goog.iter.chain(iter, iter2, iter3);
- assertEquals('012345', goog.iter.join(iter4, ''));
- // empty iter
- iter = new goog.iter.Iterator;
- iter2 = goog.iter.chain(iter);
- assertEquals('', goog.iter.join(iter2, ''));
- // no args
- iter2 = goog.iter.chain();
- assertEquals('', goog.iter.join(iter2, ''));
- // arrays
- var arr = [0, 1];
- var arr2 = [2, 3];
- var arr3 = [4, 5];
- iter = goog.iter.chain(arr, arr2, arr3);
- assertEquals('012345', goog.iter.join(iter, ''));
- }
- function testChainFromIterable() {
- var arg = [0, 1];
- var arg2 = [2, 3];
- var arg3 = goog.iter.range(4, 6);
- var iter = goog.iter.chainFromIterable([arg, arg2, arg3]);
- assertEquals('012345', goog.iter.join(iter, ''));
- }
- function testChainFromIterable2() {
- var arg = goog.iter.zip([0, 3], [1, 4], [2, 5]);
- var iter = goog.iter.chainFromIterable(arg);
- assertEquals('012345', goog.iter.join(iter, ''));
- }
- function testDropWhile() {
- var iter = goog.iter.range(10);
- var iter2 = goog.iter.dropWhile(iter, function(val, index, iter3) {
- assertEquals(iter, iter3);
- assertEquals('index should be undefined', 'undefined', typeof index);
- return val < 5;
- });
- assertEquals('56789', goog.iter.join(iter2, ''));
- }
- function testDropWhile2() {
- var iter = goog.iter.range(10);
- var iter2 = goog.iter.dropWhile(iter, function(val, index, iter3) {
- assertEquals(iter, iter3);
- assertEquals('index should be undefined', 'undefined', typeof index);
- return val != 5;
- });
- assertEquals('56789', goog.iter.join(iter2, ''));
- }
- function testTakeWhile() {
- var iter = goog.iter.range(10);
- var iter2 = goog.iter.takeWhile(iter, function(val, index, iter3) {
- assertEquals(iter, iter3);
- assertEquals('index should be undefined', 'undefined', typeof index);
- return val < 5;
- });
- assertEquals('01234', goog.iter.join(iter2, ''));
- // next() should not have been called on iter after the first failure and
- // therefore it should contain some elements. 5 failed so we should have
- // the rest
- assertEquals('6789', goog.iter.join(iter, ''));
- }
- function testTakeWhile2() {
- var iter = goog.iter.range(10);
- var iter2 = goog.iter.takeWhile(iter, function(val, index, iter3) {
- assertEquals(iter, iter3);
- assertEquals('index should be undefined', 'undefined', typeof index);
- return val != 5;
- });
- assertEquals('01234', goog.iter.join(iter2, ''));
- // next() should not have been called on iter after the first failure and
- // therefore it should contain some elements. 5 failed so we should have
- // the rest
- assertEquals('6789', goog.iter.join(iter, ''));
- }
- function testToArray() {
- var iter = goog.iter.range(5);
- var array = goog.iter.toArray(iter);
- assertEquals('01234', array.join(''));
- // Empty
- iter = new goog.iter.Iterator;
- array = goog.iter.toArray(iter);
- assertEquals('Empty iterator to array', '', array.join(''));
- }
- function testToArray2() {
- var iterable = [0, 1, 2, 3, 4];
- var array = goog.iter.toArray(iterable);
- assertEquals('01234', array.join(''));
- // Empty
- iterable = [];
- array = goog.iter.toArray(iterable);
- assertEquals('Empty iterator to array', '', array.join(''));
- }
- function testEquals() {
- var iter = goog.iter.range(5);
- var iter2 = goog.iter.range(5);
- assertTrue('Equal iterators', goog.iter.equals(iter, iter2));
- iter = goog.iter.range(4);
- iter2 = goog.iter.range(5);
- assertFalse('Second one is longer', goog.iter.equals(iter, iter2));
- iter = goog.iter.range(5);
- iter2 = goog.iter.range(4);
- assertFalse('First one is longer', goog.iter.equals(iter, iter2));
- // 2 empty iterators
- iter = new goog.iter.Iterator;
- iter2 = new goog.iter.Iterator;
- assertTrue('Two empty iterators are equal', goog.iter.equals(iter, iter2));
- iter = goog.iter.range(4);
- assertFalse('Same iterator', goog.iter.equals(iter, iter));
- // equality function
- iter = goog.iter.toIterator(['A', 'B', 'C']);
- iter2 = goog.iter.toIterator(['a', 'b', 'c']);
- var equalsFn = function(a, b) { return a.toLowerCase() == b.toLowerCase(); };
- assertTrue('Case-insensitive equal', goog.iter.equals(iter, iter2, equalsFn));
- }
- function testToIterator() {
- var iter = new goog.iter.range(5);
- var iter2 = goog.iter.toIterator(iter);
- assertEquals(
- 'toIterator on an iterator should return the same obejct', iter, iter2);
- var iterLikeObject = {next: function() { throw goog.iter.StopIteration; }};
- var obj = {
- __iterator__: function(opt_keys) {
- assertFalse(
- '__iterator__ should always be called with false in toIterator',
- opt_keys);
- return iterLikeObject;
- }
- };
- assertEquals(
- 'Should return the return value of __iterator_(false)', iterLikeObject,
- goog.iter.toIterator(obj));
- // Array
- var array = [0, 1, 2, 3, 4];
- iter = goog.iter.toIterator(array);
- assertEquals('01234', goog.iter.join(iter, ''));
- // Array like
- var arrayLike = {'0': 0, '1': 1, '2': 2, length: 3};
- iter = goog.iter.toIterator(arrayLike);
- assertEquals('012', goog.iter.join(iter, ''));
- // DOM
- var dom = document.getElementById('t1').childNodes;
- iter = goog.iter.toIterator(dom);
- iter2 = goog.iter.map(iter, function(el) { return el.innerHTML; });
- assertEquals('012', goog.iter.join(iter2, ''));
- }
- function testNextOrValue() {
- var iter = goog.iter.toIterator([1]);
- assertEquals(
- 'Should return value when iterator is non-empty', 1,
- goog.iter.nextOrValue(iter, null));
- assertNull(
- 'Should return given default when iterator is empty',
- goog.iter.nextOrValue(iter, null));
- assertEquals(
- 'Should return given default when iterator is (still) empty', -1,
- goog.iter.nextOrValue(iter, -1));
- }
- // Return the product of several arrays as an array
- function productAsArray(var_args) {
- var iter = goog.iter.product.apply(null, arguments);
- return goog.iter.toArray(iter);
- }
- function testProduct() {
- assertArrayEquals(
- [[1, 3], [1, 4], [2, 3], [2, 4]], productAsArray([1, 2], [3, 4]));
- assertArrayEquals(
- [
- [1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [2, 3, 5], [2, 3, 6],
- [2, 4, 5], [2, 4, 6]
- ],
- productAsArray([1, 2], [3, 4], [5, 6]));
- assertArrayEquals([[1]], productAsArray([1]));
- assertArrayEquals([], productAsArray([1], []));
- assertArrayEquals([], productAsArray());
- var expectedResult = [];
- var a = [1, 2, 3];
- var b = [4, 5, 6];
- var c = [7, 8, 9];
- for (var i = 0; i < a.length; i++) {
- for (var j = 0; j < b.length; j++) {
- for (var k = 0; k < c.length; k++) {
- expectedResult.push([a[i], b[j], c[k]]);
- }
- }
- }
- assertArrayEquals(expectedResult, productAsArray(a, b, c));
- }
- function testProductIteration() {
- var iter = goog.iter.product([1, 2], [3, 4]);
- assertArrayEquals([1, 3], iter.next());
- assertArrayEquals([1, 4], iter.next());
- assertArrayEquals([2, 3], iter.next());
- assertArrayEquals([2, 4], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- // Ensure the iterator forever throws StopIteration.
- for (var i = 0; i < 5; i++) {
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- iter = goog.iter.product();
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- iter = goog.iter.product([]);
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testCycle() {
- var regularArray = [1, 2, 3];
- var iter = goog.iter.cycle(regularArray);
- // Test 3 cycles to ensure proper cache behavior
- var values = [];
- for (var i = 0; i < 9; i++) {
- values.push(iter.next());
- }
- assertArrayEquals([1, 2, 3, 1, 2, 3, 1, 2, 3], values);
- }
- function testCycleSingleItemIterable() {
- var singleItemArray = [1];
- var iter = goog.iter.cycle(singleItemArray);
- var values = [];
- for (var i = 0; i < 5; i++) {
- values.push(iter.next());
- }
- assertArrayEquals([1, 1, 1, 1, 1], values);
- }
- function testCycleEmptyIterable() {
- var emptyArray = [];
- var iter = goog.iter.cycle(emptyArray);
- var ex = assertThrows(function() { iter.next(); });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testCountNoArgs() {
- var iter = goog.iter.count();
- var values = goog.iter.limit(iter, 5);
- assertArrayEquals([0, 1, 2, 3, 4], goog.iter.toArray(values));
- }
- function testCountStart() {
- var iter = goog.iter.count(10);
- var values = goog.iter.limit(iter, 5);
- assertArrayEquals([10, 11, 12, 13, 14], goog.iter.toArray(values));
- }
- function testCountStep() {
- var iter = goog.iter.count(10, 2);
- var values = goog.iter.limit(iter, 5);
- assertArrayEquals([10, 12, 14, 16, 18], goog.iter.toArray(values));
- }
- function testCountNegativeStep() {
- var iter = goog.iter.count(10, -2);
- var values = goog.iter.limit(iter, 5);
- assertArrayEquals([10, 8, 6, 4, 2], goog.iter.toArray(values));
- }
- function testCountZeroStep() {
- var iter = goog.iter.count(42, 0);
- assertEquals(42, iter.next());
- assertEquals(42, iter.next());
- assertEquals(42, iter.next());
- }
- function testCountFloat() {
- var iter = goog.iter.count(1.5, 0.5);
- var values = goog.iter.limit(iter, 5);
- assertArrayEquals([1.5, 2.0, 2.5, 3.0, 3.5], goog.iter.toArray(values));
- }
- function testRepeat() {
- var obj = {foo: 'bar'};
- var iter = goog.iter.repeat(obj);
- assertEquals(obj, iter.next());
- assertEquals(obj, iter.next());
- assertEquals(obj, iter.next());
- }
- function testAccumulateArray() {
- var iter = goog.iter.accumulate([1, 2, 3, 4, 5]);
- assertArrayEquals([1, 3, 6, 10, 15], goog.iter.toArray(iter));
- }
- function testAccumulateIterator() {
- var iter = goog.iter.accumulate(goog.iter.range(1, 6));
- assertArrayEquals([1, 3, 6, 10, 15], goog.iter.toArray(iter));
- }
- function testAccumulateFloat() {
- var iter = goog.iter.accumulate([1.0, 2.5, 0.5, 1.5, 0.5]);
- assertArrayEquals([1.0, 3.5, 4.0, 5.5, 6.0], goog.iter.toArray(iter));
- }
- function testZipArrays() {
- var iter = goog.iter.zip([1, 2, 3], [4, 5, 6], [7, 8, 9]);
- assertArrayEquals([1, 4, 7], iter.next());
- assertArrayEquals([2, 5, 8], iter.next());
- assertArrayEquals([3, 6, 9], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testZipSingleArg() {
- var iter = goog.iter.zip([1, 2, 3]);
- assertArrayEquals([1], iter.next());
- assertArrayEquals([2], iter.next());
- assertArrayEquals([3], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testZipUnevenArgs() {
- var iter = goog.iter.zip([1, 2, 3], [4, 5], [7]);
- assertArrayEquals([1, 4, 7], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testZipNoArgs() {
- var iter = goog.iter.zip();
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testZipIterators() {
- var iter = goog.iter.zip(goog.iter.count(), goog.iter.repeat('foo'));
- assertArrayEquals([0, 'foo'], iter.next());
- assertArrayEquals([1, 'foo'], iter.next());
- assertArrayEquals([2, 'foo'], iter.next());
- assertArrayEquals([3, 'foo'], iter.next());
- }
- function testZipLongestArrays() {
- var iter = goog.iter.zipLongest('-', 'ABCD'.split(''), 'xy'.split(''));
- assertArrayEquals(['A', 'x'], iter.next());
- assertArrayEquals(['B', 'y'], iter.next());
- assertArrayEquals(['C', '-'], iter.next());
- assertArrayEquals(['D', '-'], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testZipLongestSingleArg() {
- var iter = goog.iter.zipLongest('-', 'ABCD'.split(''));
- assertArrayEquals(['A'], iter.next());
- assertArrayEquals(['B'], iter.next());
- assertArrayEquals(['C'], iter.next());
- assertArrayEquals(['D'], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testZipLongestNoArgs() {
- var iter = goog.iter.zipLongest();
- assertArrayEquals([], goog.iter.toArray(iter));
- var iter = goog.iter.zipLongest('fill');
- assertArrayEquals([], goog.iter.toArray(iter));
- }
- function testZipLongestIterators() {
- var iter = goog.iter.zipLongest(null, goog.iter.range(3), goog.iter.range(5));
- assertArrayEquals([0, 0], iter.next());
- assertArrayEquals([1, 1], iter.next());
- assertArrayEquals([2, 2], iter.next());
- assertArrayEquals([null, 3], iter.next());
- assertArrayEquals([null, 4], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testCompressArray() {
- var iter = goog.iter.compress('ABCDEF'.split(''), [1, 0, 1, 0, 1, 1]);
- assertEquals('ACEF', goog.iter.join(iter, ''));
- }
- function testCompressUnevenArgs() {
- var iter = goog.iter.compress('ABCDEF'.split(''), [false, true, true]);
- assertEquals('BC', goog.iter.join(iter, ''));
- }
- function testCompressIterators() {
- var iter = goog.iter.compress(goog.iter.range(10), goog.iter.cycle([0, 1]));
- assertArrayEquals([1, 3, 5, 7, 9], goog.iter.toArray(iter));
- }
- function testGroupByNoKeyFunc() {
- var iter = goog.iter.groupBy('AAABBBBCDD'.split(''));
- assertArrayEquals(['A', ['A', 'A', 'A']], iter.next());
- assertArrayEquals(['B', ['B', 'B', 'B', 'B']], iter.next());
- assertArrayEquals(['C', ['C']], iter.next());
- assertArrayEquals(['D', ['D', 'D']], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testGroupByKeyFunc() {
- var keyFunc = function(x) { return x.toLowerCase(); };
- var iter = goog.iter.groupBy('AaAABBbbBCccddDD'.split(''), keyFunc);
- assertArrayEquals(['a', ['A', 'a', 'A', 'A']], iter.next());
- assertArrayEquals(['b', ['B', 'B', 'b', 'b', 'B']], iter.next());
- assertArrayEquals(['c', ['C', 'c', 'c']], iter.next());
- assertArrayEquals(['d', ['d', 'd', 'D', 'D']], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testStarMap() {
- var iter = goog.iter.starMap([[2, 5], [3, 2], [10, 3]], Math.pow);
- assertEquals(32, iter.next());
- assertEquals(9, iter.next());
- assertEquals(1000, iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testStarMapExtraArgs() {
- var func = function(string, radix, undef, iterator) {
- assertEquals('undef should be undefined', 'undefined', typeof undef);
- assertTrue(iterator instanceof goog.iter.Iterator);
- return parseInt(string, radix);
- };
- var iter = goog.iter.starMap([['42', 10], ['0xFF', 16], ['101', 2]], func);
- assertEquals(42, iter.next());
- assertEquals(255, iter.next());
- assertEquals(5, iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testTeeArray() {
- var iters = goog.iter.tee('ABC'.split(''));
- assertEquals(2, iters.length);
- var it0 = iters[0], it1 = iters[1];
- assertEquals('A', it0.next());
- assertEquals('A', it1.next());
- assertEquals('B', it0.next());
- assertEquals('B', it1.next());
- assertEquals('C', it0.next());
- assertEquals('C', it1.next());
- var ex = assertThrows(function() { it0.next() });
- assertEquals(goog.iter.StopIteration, ex);
- ex = assertThrows(function() { it1.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testTeeIterator() {
- var iters = goog.iter.tee(goog.iter.count(), 3);
- assertEquals(3, iters.length);
- var it0 = iters[0], it1 = iters[1], it2 = iters[2];
- assertEquals(0, it0.next());
- assertEquals(1, it0.next());
- assertEquals(0, it1.next());
- assertEquals(1, it1.next());
- assertEquals(2, it1.next());
- assertEquals(2, it0.next());
- assertEquals(0, it2.next());
- assertEquals(1, it2.next());
- assertEquals(2, it2.next());
- assertEquals(3, it0.next());
- assertEquals(3, it1.next());
- assertEquals(3, it2.next());
- }
- function testEnumerateNoStart() {
- var iter = goog.iter.enumerate('ABC'.split(''));
- assertArrayEquals([0, 'A'], iter.next());
- assertArrayEquals([1, 'B'], iter.next());
- assertArrayEquals([2, 'C'], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testEnumerateStart() {
- var iter = goog.iter.enumerate('DEF'.split(''), 3);
- assertArrayEquals([3, 'D'], iter.next());
- assertArrayEquals([4, 'E'], iter.next());
- assertArrayEquals([5, 'F'], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testLimitLess() {
- var iter = goog.iter.limit('ABCDEFG'.split(''), 3);
- assertEquals('ABC', goog.iter.join(iter, ''));
- }
- function testLimitGreater() {
- var iter = goog.iter.limit('ABCDEFG'.split(''), 10);
- assertEquals('ABCDEFG', goog.iter.join(iter, ''));
- }
- function testConsumeLess() {
- var iter = goog.iter.consume('ABCDEFG'.split(''), 3);
- assertEquals('DEFG', goog.iter.join(iter, ''));
- }
- function testConsumeGreater() {
- var iter = goog.iter.consume('ABCDEFG'.split(''), 10);
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testSliceStart() {
- var iter = goog.iter.slice('ABCDEFG'.split(''), 2);
- assertEquals('CDEFG', goog.iter.join(iter, ''));
- }
- function testSliceStop() {
- var iter = goog.iter.slice('ABCDEFG'.split(''), 2, 4);
- assertEquals('CD', goog.iter.join(iter, ''));
- }
- function testSliceStartStopEqual() {
- var iter = goog.iter.slice('ABCDEFG'.split(''), 1, 1);
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testSliceIterator() {
- var iter = goog.iter.slice(goog.iter.count(20), 0, 5);
- assertArrayEquals([20, 21, 22, 23, 24], goog.iter.toArray(iter));
- }
- function testSliceStartGreater() {
- var iter = goog.iter.slice('ABCDEFG'.split(''), 10);
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testPermutationsNoLength() {
- var iter = goog.iter.permutations(goog.iter.range(3));
- assertArrayEquals([0, 1, 2], iter.next());
- assertArrayEquals([0, 2, 1], iter.next());
- assertArrayEquals([1, 0, 2], iter.next());
- assertArrayEquals([1, 2, 0], iter.next());
- assertArrayEquals([2, 0, 1], iter.next());
- assertArrayEquals([2, 1, 0], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testPermutationsLength() {
- var iter = goog.iter.permutations('ABC'.split(''), 2);
- assertArrayEquals(['A', 'B'], iter.next());
- assertArrayEquals(['A', 'C'], iter.next());
- assertArrayEquals(['B', 'A'], iter.next());
- assertArrayEquals(['B', 'C'], iter.next());
- assertArrayEquals(['C', 'A'], iter.next());
- assertArrayEquals(['C', 'B'], iter.next());
- }
- function testCombinations() {
- var iter = goog.iter.combinations(goog.iter.range(4), 3);
- assertArrayEquals([0, 1, 2], iter.next());
- assertArrayEquals([0, 1, 3], iter.next());
- assertArrayEquals([0, 2, 3], iter.next());
- assertArrayEquals([1, 2, 3], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
- function testCombinationsWithReplacement() {
- var iter = goog.iter.combinationsWithReplacement('ABC'.split(''), 2);
- assertArrayEquals(['A', 'A'], iter.next());
- assertArrayEquals(['A', 'B'], iter.next());
- assertArrayEquals(['A', 'C'], iter.next());
- assertArrayEquals(['B', 'B'], iter.next());
- assertArrayEquals(['B', 'C'], iter.next());
- assertArrayEquals(['C', 'C'], iter.next());
- var ex = assertThrows(function() { iter.next() });
- assertEquals(goog.iter.StopIteration, ex);
- }
|