123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- /*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();
- }
- };
|