AirBnb only imports JavaScript rules and some fail for TypeScript files. This commit overrides those rules with TypeScript equivalents. Changes here can be mostly replaced when Vue natively support TypeScript for Airbnb (vuejs/eslint-config-airbnb#23). Enables @typescript-eslint/indent even though it's broken and it will not be fixed typescript-eslint/typescript-eslint#1824 until prettifier is used, because it is still useful. Change broken rules with TypeScript variants: - `no-useless-constructor` eslint/eslint#14118 typescript-eslint/typescript-eslint#873 - `no-shadow` eslint/eslint#13044 typescript-eslint/typescript-eslint#2483 typescript-eslint/typescript-eslint#325 typescript-eslint/typescript-eslint#2552 typescript-eslint/typescript-eslint#2484 typescript-eslint/typescript-eslint#2466
84 lines
2.3 KiB
TypeScript
84 lines
2.3 KiB
TypeScript
import 'mocha';
|
|
import { expect } from 'chai';
|
|
import { sleep, SchedulerType, SchedulerCallbackType } from '@/infrastructure/Threading/AsyncSleep';
|
|
|
|
describe('AsyncSleep', () => {
|
|
describe('sleep', () => {
|
|
it('fulfills after delay', async () => {
|
|
// arrange
|
|
const delayInMs = 10;
|
|
const scheduler = new SchedulerMock();
|
|
// act
|
|
const promise = sleep(delayInMs, scheduler.mock);
|
|
const promiseState = watchPromiseState(promise);
|
|
scheduler.tickNext(delayInMs);
|
|
await flushPromiseResolutionQueue();
|
|
// assert
|
|
const actual = promiseState.isFulfilled();
|
|
expect(actual).to.equal(true);
|
|
});
|
|
it('pending before delay', async () => {
|
|
// arrange
|
|
const delayInMs = 10;
|
|
const scheduler = new SchedulerMock();
|
|
// act
|
|
const promise = sleep(delayInMs, scheduler.mock);
|
|
const promiseState = watchPromiseState(promise);
|
|
scheduler.tickNext(delayInMs / 5);
|
|
await flushPromiseResolutionQueue();
|
|
// assert
|
|
const actual = promiseState.isPending();
|
|
expect(actual).to.equal(true);
|
|
});
|
|
});
|
|
});
|
|
|
|
function flushPromiseResolutionQueue() {
|
|
return Promise.resolve();
|
|
}
|
|
|
|
class SchedulerMock {
|
|
public readonly mock: SchedulerType;
|
|
|
|
private currentTime = 0;
|
|
|
|
private scheduledActions = new Array<{ time: number, action: SchedulerCallbackType }>();
|
|
|
|
constructor() {
|
|
this.mock = (callback: SchedulerCallbackType, ms: number) => {
|
|
this.scheduledActions.push({ time: this.currentTime + ms, action: callback });
|
|
};
|
|
}
|
|
|
|
public tickNext(ms: number) {
|
|
const newTime = this.currentTime + ms;
|
|
const dueActions = this.scheduledActions
|
|
.filter((action) => newTime >= action.time);
|
|
for (const action of dueActions) {
|
|
action.action();
|
|
}
|
|
this.scheduledActions = this.scheduledActions.filter((action) => !dueActions.includes(action));
|
|
}
|
|
}
|
|
|
|
function watchPromiseState<T>(promise: Promise<T>) {
|
|
let isPending = true;
|
|
let isRejected = false;
|
|
let isFulfilled = false;
|
|
promise.then(
|
|
() => {
|
|
isFulfilled = true;
|
|
isPending = false;
|
|
},
|
|
() => {
|
|
isRejected = true;
|
|
isPending = false;
|
|
},
|
|
);
|
|
return {
|
|
isFulfilled: () => isFulfilled,
|
|
isPending: () => isPending,
|
|
isRejected: () => isRejected,
|
|
};
|
|
}
|