You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
5.4 KiB
200 lines
5.4 KiB
/*global require:true, setTimeout:true */ |
|
var forEach = require('../lib/foreach').forEach; |
|
|
|
exports['foreach'] = { |
|
setUp: function(done) { |
|
this.order = []; |
|
this.track = function() { |
|
[].push.apply(this.order, arguments); |
|
}; |
|
done(); |
|
}, |
|
'Synchronous': function(test) { |
|
test.expect(1); |
|
var that = this; |
|
|
|
var arr = ["a", "b", "c"]; |
|
forEach(arr, function(item, index, arr) { |
|
that.track("each", item, index, arr); |
|
}); |
|
|
|
test.deepEqual(that.order, [ |
|
"each", "a", 0, arr, |
|
"each", "b", 1, arr, |
|
"each", "c", 2, arr |
|
], "should call eachFn for each array item, in order."); |
|
test.done(); |
|
}, |
|
'Synchronous, done': function(test) { |
|
test.expect(1); |
|
var that = this; |
|
|
|
var arr = ["a", "b", "c"]; |
|
forEach(arr, function(item, index, arr) { |
|
that.track("each", item, index, arr); |
|
}, function(notAborted, arr) { |
|
that.track("done", notAborted, arr); |
|
}); |
|
|
|
test.deepEqual(that.order, [ |
|
"each", "a", 0, arr, |
|
"each", "b", 1, arr, |
|
"each", "c", 2, arr, |
|
"done", true, arr |
|
], "should call eachFn for each array item, in order, followed by doneFn."); |
|
test.done(); |
|
}, |
|
'Synchronous, early abort': function(test) { |
|
test.expect(1); |
|
var that = this; |
|
|
|
var arr = ["a", "b", "c"]; |
|
forEach(arr, function(item, index, arr) { |
|
that.track("each", item, index, arr); |
|
if (item === "b") { return false; } |
|
}, function(notAborted, arr) { |
|
that.track("done", notAborted, arr); |
|
}); |
|
|
|
test.deepEqual(that.order, [ |
|
"each", "a", 0, arr, |
|
"each", "b", 1, arr, |
|
"done", false, arr |
|
], "should call eachFn for each array item, in order, followed by doneFn."); |
|
test.done(); |
|
}, |
|
'Asynchronous': function(test) { |
|
test.expect(1); |
|
var that = this; |
|
|
|
var arr = ["a", "b", "c"]; |
|
forEach(arr, function(item, index, arr) { |
|
that.track("each", item, index, arr); |
|
var done = this.async(); |
|
setTimeout(done, 10); |
|
}); |
|
|
|
setTimeout(function() { |
|
test.deepEqual(that.order, [ |
|
"each", "a", 0, arr, |
|
"each", "b", 1, arr, |
|
"each", "c", 2, arr |
|
], "should call eachFn for each array item, in order."); |
|
test.done(); |
|
}, 100); |
|
}, |
|
'Asynchronous, done': function(test) { |
|
test.expect(1); |
|
var that = this; |
|
|
|
var arr = ["a", "b", "c"]; |
|
forEach(arr, function(item, index, arr) { |
|
that.track("each", item, index, arr); |
|
var done = this.async(); |
|
setTimeout(done, 10); |
|
}, function(notAborted, arr) { |
|
that.track("done", notAborted, arr); |
|
test.deepEqual(that.order, [ |
|
"each", "a", 0, arr, |
|
"each", "b", 1, arr, |
|
"each", "c", 2, arr, |
|
"done", true, arr |
|
], "should call eachFn for each array item, in order, followed by doneFn."); |
|
test.done(); |
|
}); |
|
}, |
|
'Asynchronous, early abort': function(test) { |
|
test.expect(1); |
|
var that = this; |
|
|
|
var arr = ["a", "b", "c"]; |
|
forEach(arr, function(item, index, arr) { |
|
that.track("each", item, index, arr); |
|
var done = this.async(); |
|
setTimeout(function() { |
|
done(item !== "b"); |
|
}, 10); |
|
}, function(notAborted, arr) { |
|
that.track("done", notAborted, arr); |
|
test.deepEqual(that.order, [ |
|
"each", "a", 0, arr, |
|
"each", "b", 1, arr, |
|
"done", false, arr |
|
], "should call eachFn for each array item, in order, followed by doneFn."); |
|
test.done(); |
|
}); |
|
}, |
|
'Not actually asynchronous': function(test) { |
|
test.expect(1); |
|
var that = this; |
|
|
|
var arr = ["a", "b", "c"]; |
|
forEach(arr, function(item, index, arr) { |
|
that.track("each", item, index, arr); |
|
var done = this.async(); |
|
done(); |
|
}, function(notAborted, arr) { |
|
that.track("done", notAborted, arr); |
|
test.deepEqual(that.order, [ |
|
"each", "a", 0, arr, |
|
"each", "b", 1, arr, |
|
"each", "c", 2, arr, |
|
"done", true, arr |
|
], "should call eachFn for each array item, in order, followed by doneFn."); |
|
test.done(); |
|
}); |
|
}, |
|
'Not actually asynchronous, early abort': function(test) { |
|
test.expect(1); |
|
var that = this; |
|
|
|
var arr = ["a", "b", "c"]; |
|
forEach(arr, function(item, index, arr) { |
|
that.track("each", item, index, arr); |
|
var done = this.async(); |
|
done(item !== "b"); |
|
}, function(notAborted, arr) { |
|
that.track("done", notAborted, arr); |
|
test.deepEqual(that.order, [ |
|
"each", "a", 0, arr, |
|
"each", "b", 1, arr, |
|
"done", false, arr |
|
], "should call eachFn for each array item, in order, followed by doneFn."); |
|
test.done(); |
|
}); |
|
}, |
|
'Sparse array support': function(test) { |
|
test.expect(1); |
|
var that = this; |
|
|
|
var arr = []; |
|
arr[0] = "a"; |
|
arr[9] = "z"; |
|
|
|
forEach(arr, function(item, index, arr) { |
|
that.track("each", item, index, arr); |
|
}); |
|
|
|
test.deepEqual(that.order, [ |
|
"each", "a", 0, arr, |
|
"each", "z", 9, arr |
|
], "should skip nonexistent array items."); |
|
test.done(); |
|
}, |
|
'Invalid length sanitization': function(test) { |
|
test.expect(1); |
|
var that = this; |
|
|
|
var obj = {length: 4294967299, 0: "a", 2: "b", 3: "c" }; |
|
|
|
forEach(obj, function(item, index, arr) { |
|
that.track("each", item, index, arr); |
|
}); |
|
|
|
test.deepEqual(that.order, [ |
|
"each", "a", 0, obj, |
|
"each", "b", 2, obj |
|
], "should sanitize length property (ToUint32)."); |
|
test.done(); |
|
} |
|
};
|
|
|