@erfffun/utils
Version:
Energi javascript utilities for web development
866 lines (856 loc) • 17 kB
JavaScript
/* eslint-disable func-names */
/* global describe, test, expect, jest */
import { later } from '../index';
jest.useFakeTimers();
describe('Testing later-method', () => {
describe('without repeat', () => {
test('later', done => {
let count = 0;
later(() => {
count += 1;
}, 100);
// purposly, check after >2x timeout --> count should only increase 1x
setTimeout(() => {
expect(count).toBe(1);
done();
}, 280);
jest.advanceTimersByTime(280);
});
test('canceled later', done => {
let count = 0;
const handle = later(() => {
count += 1;
}, 100);
setTimeout(() => {
handle.cancel();
}, 10);
setTimeout(() => {
expect(count).toBe(0);
done();
}, 180);
jest.advanceTimersByTime(180);
});
test('without timeout', async done => {
jest.useRealTimers();
let count = 0;
later(() => {
count += 1;
});
// also check `countbefore` --> in case later doesn"t run asynchronously,
// count will be 1 at this stage (which has to be 0)
const countbefore = count;
await new Promise(resolve =>
setTimeout(() => {
expect(count).toBe(1);
expect(countbefore).toBe(0);
resolve();
}, 50),
);
done();
});
test('canceled without timeout', done => {
jest.useFakeTimers();
let count = 0;
const handle = later(() => {
count += 1;
});
handle.cancel();
setTimeout(() => {
expect(count).toBe(0);
done();
}, 80);
jest.advanceTimersByTime(80);
});
});
describe('repeated', () => {
jest.useFakeTimers();
test('later repeated every 100ms, check at 50ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
true,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(0);
done();
}, 50);
jest.advanceTimersByTime(50);
});
test('later repeated every 100ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
true,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(3);
done();
}, 350);
jest.advanceTimersByTime(350);
});
test('later repeated every 100ms canceled at 50ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
true,
);
setTimeout(() => {
handle.cancel();
}, 50);
setTimeout(() => {
expect(count).toBe(0);
done();
}, 280);
jest.advanceTimersByTime(280);
});
test('later repeated every 100ms canceled at 250ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
true,
);
setTimeout(() => {
handle.cancel();
}, 250);
setTimeout(() => {
expect(count).toBe(2);
done();
}, 480);
jest.advanceTimersByTime(480);
});
});
describe('repeated with different first interval', () => {
test('later first 100ms, repeated every 200ms, check at 50ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
200,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(0);
done();
}, 50);
jest.advanceTimersByTime(50);
});
test('later first 100ms, repeated every 200ms, check at 150ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
200,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(1);
done();
}, 150);
jest.advanceTimersByTime(150);
});
test('later first 100ms, repeated every 200ms, check at 250ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
200,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(1);
done();
}, 250);
jest.advanceTimersByTime(250);
});
test('later first 100ms, repeated every 200ms, check at 350ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
200,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(2);
done();
}, 350);
jest.advanceTimersByTime(350);
});
test('later first 100ms, repeated every 200ms, check at 450ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
200,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(2);
done();
}, 450);
jest.advanceTimersByTime(450);
});
test('later first 100ms, repeated every 200ms, check at 550ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
200,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(3);
done();
}, 550);
jest.advanceTimersByTime(550);
});
test('later first 100ms, repeated every 200ms canceled at 50ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
200,
);
setTimeout(() => {
handle.cancel();
}, 50);
setTimeout(() => {
expect(count).toBe(0);
done();
}, 650);
jest.advanceTimersByTime(650);
});
test('later first 100ms, repeated every 200ms canceled at 250ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
200,
);
setTimeout(() => {
handle.cancel();
}, 250);
setTimeout(() => {
expect(count).toBe(1);
done();
}, 650);
jest.advanceTimersByTime(650);
});
test('later first 100ms, repeated every 200ms canceled at 600ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
200,
);
setTimeout(() => {
handle.cancel();
}, 600);
setTimeout(() => {
expect(count).toBe(3);
done();
}, 850);
jest.advanceTimersByTime(850);
});
test('check context without interval', done => {
jest.useRealTimers();
const a = {};
const fn = function () {
expect(this).toBe(a);
done();
};
later(fn.bind(a), 0);
});
test('check context with interval', done => {
jest.useFakeTimers();
const a = {};
const fn = function () {
expect(this).toBe(a);
};
const handle = later(fn.bind(a), 50, true);
setTimeout(() => {
handle.cancel();
done();
}, 100);
jest.advanceTimersByTime(100);
});
test('check going to async', done => {
later(done);
});
});
});
describe('Testing later-method with long timeout', () => {
// jest.setTimeout(10000);
describe('without repeat', () => {
test('later', done => {
let count = 0;
later(() => {
count += 1;
}, 1000);
// purposly, check after >2x timeout --> count should only increase 1x
setTimeout(() => {
expect(count).toBe(1);
done();
}, 2080);
jest.advanceTimersByTime(2080);
});
test('canceled later within first loop', done => {
let count = 0;
const handle = later(() => {
count += 1;
}, 1000);
setTimeout(() => {
handle.cancel();
}, 10);
setTimeout(() => {
expect(count).toBe(0);
done();
}, 1080);
jest.advanceTimersByTime(1080);
});
test('canceled later within second loop', done => {
let count = 0;
const handle = later(() => {
count += 1;
}, 1000);
setTimeout(() => {
handle.cancel();
}, 550);
setTimeout(() => {
expect(count).toBe(0);
done();
}, 1080);
jest.advanceTimersByTime(1080);
});
test('canceled later within third loop', done => {
let count = 0;
const handle = later(() => {
count += 1;
}, 1000);
setTimeout(() => {
handle.cancel();
}, 950);
setTimeout(() => {
expect(count).toBe(0);
done();
}, 1080);
jest.advanceTimersByTime(1080);
});
});
describe('repeated', () => {
test('later repeated every 1000ms, check at 50ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
1000,
true,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(0);
done();
}, 50);
jest.advanceTimersByTime(50);
});
test('later repeated every 1000ms check at 1100ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
1000,
true,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(1);
done();
}, 1100);
jest.advanceTimersByTime(1100);
});
test('later repeated every 1000ms check at 2100ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
1000,
true,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(2);
done();
}, 2100);
jest.advanceTimersByTime(2100);
});
test('later repeated every 1000ms canceled at 50ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
1000,
true,
);
setTimeout(() => {
handle.cancel();
}, 50);
setTimeout(() => {
expect(count).toBe(0);
done();
}, 1080);
jest.advanceTimersByTime(1080);
});
test('later repeated every 1000ms canceled at 1100ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
1000,
true,
);
setTimeout(() => {
handle.cancel();
}, 1100);
setTimeout(() => {
expect(count).toBe(1);
done();
}, 1180);
jest.advanceTimersByTime(1180);
});
test('later repeated every 1000ms canceled at 2100ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
1000,
true,
);
setTimeout(() => {
handle.cancel();
}, 2100);
setTimeout(() => {
expect(count).toBe(2);
done();
}, 2180);
jest.advanceTimersByTime(2180);
});
});
describe('repeated with different first interval - first large, second large', () => {
test('later repeated 450ms/500ms, check at 50ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
450,
500,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(0);
done();
}, 50);
jest.advanceTimersByTime(50);
});
test('later repeated 450ms/500ms, check at 550ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
450,
500,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(1);
done();
}, 550);
jest.advanceTimersByTime(550);
});
test('later repeated 450ms/500ms, check at 1050ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
450,
500,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(2);
done();
}, 1050);
jest.advanceTimersByTime(1050);
});
test('later repeated 450ms/500ms, canceled at 50ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
450,
500,
);
setTimeout(() => {
handle.cancel();
}, 50);
setTimeout(() => {
expect(count).toBe(0);
done();
}, 1050);
jest.advanceTimersByTime(1050);
});
test('later repeated 450ms/500ms, canceled at 550ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
450,
500,
);
setTimeout(() => {
handle.cancel();
}, 550);
setTimeout(() => {
expect(count).toBe(1);
done();
}, 1550);
jest.advanceTimersByTime(1550);
});
test('later repeated 450ms/500ms, canceled at 1050ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
450,
500,
);
setTimeout(() => {
handle.cancel();
}, 1050);
setTimeout(() => {
expect(count).toBe(2);
done();
}, 2050);
jest.advanceTimersByTime(2050);
});
});
describe('repeated with different first interval - first small, second large', () => {
test('later repeated 100ms/500ms, check at 50ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
500,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(0);
done();
}, 50);
jest.advanceTimersByTime(50);
});
test('later repeated 100ms/500ms, check at 250ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
500,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(1);
done();
}, 250);
jest.advanceTimersByTime(250);
});
test('later repeated 100ms/500ms, check at 750ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
500,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(2);
done();
}, 750);
jest.advanceTimersByTime(750);
});
test('later repeated 100ms/500ms, check at 1250ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
500,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(3);
done();
}, 1250);
jest.advanceTimersByTime(1250);
});
test('later repeated 100ms/500ms, canceled at 50ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
500,
);
setTimeout(() => {
handle.cancel();
}, 50);
setTimeout(() => {
expect(count).toBe(0);
done();
}, 1150);
jest.advanceTimersByTime(1150);
});
test('later repeated 100ms/500ms, canceled at 250ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
500,
);
setTimeout(() => {
handle.cancel();
}, 250);
setTimeout(() => {
expect(count).toBe(1);
done();
}, 1650);
jest.advanceTimersByTime(1650);
});
test('later repeated 100ms/500ms, canceled at 750ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
500,
);
setTimeout(() => {
handle.cancel();
}, 750);
setTimeout(() => {
expect(count).toBe(2);
done();
}, 2150);
jest.advanceTimersByTime(2150);
});
test('later repeated 100ms/500ms, canceled at 1250ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
100,
500,
);
setTimeout(() => {
handle.cancel();
}, 1250);
setTimeout(() => {
expect(count).toBe(3);
done();
}, 2650);
jest.advanceTimersByTime(2650);
});
});
describe('repeated with different first interval - first large, second small', () => {
test('later repeated 500ms/100ms, check at 50ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
500,
100,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(0);
done();
}, 50);
jest.advanceTimersByTime(50);
});
test('later repeated 500ms/100ms, check at 550ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
500,
100,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(1);
done();
}, 550);
jest.advanceTimersByTime(550);
});
test('later repeated 500ms/100ms, check at 650ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
500,
100,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(2);
done();
}, 650);
jest.advanceTimersByTime(650);
});
test('later repeated 500ms/100ms, check at 750ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
500,
100,
);
setTimeout(() => {
handle.cancel();
expect(count).toBe(3);
done();
}, 750);
jest.advanceTimersByTime(750);
});
test('later repeated 500ms/100ms, canceled at 50ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
500,
100,
);
setTimeout(() => {
handle.cancel();
}, 50);
setTimeout(() => {
expect(count).toBe(0);
done();
}, 750);
jest.advanceTimersByTime(750);
});
test('later repeated 500ms/100ms, canceled at 550ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
500,
100,
);
setTimeout(() => {
handle.cancel();
}, 550);
setTimeout(() => {
expect(count).toBe(1);
done();
}, 850);
jest.advanceTimersByTime(850);
});
test('later repeated 500ms/100ms, canceled at 650ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
500,
100,
);
setTimeout(() => {
handle.cancel();
}, 650);
setTimeout(() => {
expect(count).toBe(2);
done();
}, 950);
jest.advanceTimersByTime(950);
});
test('later repeated 500ms/100ms, canceled at 750ms', done => {
let count = 0;
const handle = later(
() => {
count += 1;
},
500,
100,
);
setTimeout(() => {
handle.cancel();
}, 750);
setTimeout(() => {
expect(count).toBe(3);
done();
}, 1050);
jest.advanceTimersByTime(1050);
});
});
});