sku-pg
Version:
Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!
390 lines (313 loc) • 10.5 kB
HTML
<html>
<!--
Copyright 2007 The Closure Library Authors. All Rights Reserved.
Use of this source code is governed by an Apache 2.0 License.
See the COPYING file for details.
-->
<head>
<title>Closure Unit Tests - goog.iter</title>
<script src="../base.js"></script>
<script>
goog.require('goog.iter');
goog.require('goog.testing.jsunit');
</script>
</head>
<body>
<div id="t1"
style="display:none"><span>0</span><span>1</span><span>2</span></div>
<script>
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
try {
iter = goog.iter.range(0, 5, 0);
fail('Step 0 is not allowed');
} catch(ex) {
if (ex === goog.iter.StopIteration) {
fail('Invalid exception thrown');
}
}
// 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, ''));
// Not the order here. The next calls are done lazily
assertEquals('a0b0a1a2b2a3a4b4a5a6b6a7a8b8a9', 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, ''));
}
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));
}
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));
}
</script>
</body>
</html>