2017-05-28 00:38:50 +02:00
|
|
|
/* @flow */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Misc Setup Types
|
|
|
|
*/
|
|
|
|
|
|
|
|
type PromiseLike<R> = {
|
|
|
|
then<U>(
|
|
|
|
onFulfill?: (value: R) => Promise<U> | U,
|
|
|
|
onReject?: (error: any) => Promise<U> | U
|
|
|
|
): Promise<U>;
|
|
|
|
}
|
|
|
|
|
|
|
|
type ObservableLike = {
|
|
|
|
subscribe(observer: (value: {}) => void): void;
|
|
|
|
};
|
|
|
|
|
|
|
|
type SpecialReturnTypes =
|
|
|
|
| PromiseLike<any>
|
|
|
|
| Iterator<any>
|
|
|
|
| ObservableLike;
|
|
|
|
|
|
|
|
type Constructor = Class<{
|
|
|
|
constructor(...args: Array<any>): any
|
|
|
|
}>;
|
|
|
|
|
|
|
|
type ErrorValidator =
|
|
|
|
| Constructor
|
|
|
|
| RegExp
|
|
|
|
| string
|
|
|
|
| ((error: any) => boolean);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Assertion Types
|
|
|
|
*/
|
|
|
|
|
|
|
|
type AssertContext = {
|
|
|
|
// Passing assertion.
|
|
|
|
pass(message?: string): void;
|
|
|
|
// Failing assertion.
|
|
|
|
fail(message?: string): void;
|
|
|
|
// Assert that value is truthy.
|
|
|
|
truthy(value: mixed, message?: string): void;
|
|
|
|
// Assert that value is falsy.
|
|
|
|
falsy(value: mixed, message?: string): void;
|
|
|
|
// Assert that value is true.
|
|
|
|
true(value: mixed, message?: string): void;
|
|
|
|
// Assert that value is false.
|
|
|
|
false(value: mixed, message?: string): void;
|
|
|
|
// Assert that value is equal to expected.
|
|
|
|
is<U>(value: U, expected: U, message?: string): void;
|
|
|
|
// Assert that value is not equal to expected.
|
|
|
|
not<U>(value: U, expected: U, message?: string): void;
|
|
|
|
// Assert that value is deep equal to expected.
|
|
|
|
deepEqual<U>(value: U, expected: U, message?: string): void;
|
|
|
|
// Assert that value is not deep equal to expected.
|
|
|
|
notDeepEqual<U>(value: U, expected: U, message?: string): void;
|
|
|
|
// Assert that function throws an error or promise rejects.
|
|
|
|
// @param error Can be a constructor, regex, error message or validation function.
|
|
|
|
throws: {
|
2017-08-14 05:01:11 +02:00
|
|
|
(value: PromiseLike<mixed>, error?: ErrorValidator, message?: string): Promise<any>;
|
|
|
|
(value: () => mixed, error?: ErrorValidator, message?: string): any;
|
2017-05-28 00:38:50 +02:00
|
|
|
};
|
|
|
|
// Assert that function doesn't throw an error or promise resolves.
|
|
|
|
notThrows: {
|
|
|
|
(value: PromiseLike<mixed>, message?: string): Promise<void>;
|
|
|
|
(value: () => mixed, message?: string): void;
|
|
|
|
};
|
|
|
|
// Assert that contents matches regex.
|
|
|
|
regex(contents: string, regex: RegExp, message?: string): void;
|
|
|
|
// Assert that contents matches a snapshot.
|
|
|
|
snapshot(contents: any, message?: string): void;
|
|
|
|
// Assert that contents does not match regex.
|
|
|
|
notRegex(contents: string, regex: RegExp, message?: string): void;
|
|
|
|
// Assert that error is falsy.
|
|
|
|
ifError(error: any, message?: string): void;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Context Types
|
|
|
|
*/
|
|
|
|
|
|
|
|
type TestContext = AssertContext & {
|
|
|
|
plan(count: number): void;
|
|
|
|
skip: AssertContext;
|
|
|
|
};
|
2017-08-14 05:01:11 +02:00
|
|
|
type ContextualTestContext = TestContext & { context: any; };
|
|
|
|
type ContextualCallbackTestContext = TestContext & { context: any; end(): void; };
|
2017-05-28 00:38:50 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Test Implementations
|
|
|
|
*/
|
|
|
|
|
|
|
|
type TestFunction<T, R> = {
|
|
|
|
(t: T, ...args: Array<any>): R;
|
|
|
|
title?: (providedTitle: string, ...args: Array<any>) => string;
|
|
|
|
};
|
|
|
|
|
|
|
|
type TestImplementation<T, R> =
|
|
|
|
| TestFunction<T, R>
|
|
|
|
| Array<TestFunction<T, R>>;
|
|
|
|
|
|
|
|
type ContextualTest = TestImplementation<ContextualTestContext, SpecialReturnTypes | void>;
|
|
|
|
type ContextualCallbackTest = TestImplementation<ContextualCallbackTestContext, void>;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Method Types
|
|
|
|
*/
|
|
|
|
|
|
|
|
type ContextualTestMethod = {
|
|
|
|
( implementation: ContextualTest): void;
|
|
|
|
(name: string, implementation: ContextualTest): void;
|
|
|
|
|
|
|
|
serial : ContextualTestMethod;
|
|
|
|
before : ContextualTestMethod;
|
|
|
|
after : ContextualTestMethod;
|
|
|
|
skip : ContextualTestMethod;
|
|
|
|
todo : ContextualTestMethod;
|
|
|
|
failing : ContextualTestMethod;
|
|
|
|
only : ContextualTestMethod;
|
|
|
|
beforeEach : ContextualTestMethod;
|
|
|
|
afterEach : ContextualTestMethod;
|
|
|
|
cb : ContextualCallbackTestMethod;
|
|
|
|
always : ContextualTestMethod;
|
|
|
|
};
|
|
|
|
|
|
|
|
type ContextualCallbackTestMethod = {
|
|
|
|
( implementation: ContextualCallbackTest): void;
|
|
|
|
(name: string, implementation: ContextualCallbackTest): void;
|
|
|
|
|
|
|
|
serial : ContextualCallbackTestMethod;
|
|
|
|
before : ContextualCallbackTestMethod;
|
|
|
|
after : ContextualCallbackTestMethod;
|
|
|
|
skip : ContextualCallbackTestMethod;
|
|
|
|
todo : ContextualCallbackTestMethod;
|
|
|
|
failing : ContextualCallbackTestMethod;
|
|
|
|
only : ContextualCallbackTestMethod;
|
|
|
|
beforeEach : ContextualCallbackTestMethod;
|
|
|
|
afterEach : ContextualCallbackTestMethod;
|
|
|
|
cb : ContextualCallbackTestMethod;
|
|
|
|
always : ContextualCallbackTestMethod;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Public API
|
|
|
|
*/
|
|
|
|
|
|
|
|
declare module.exports: {
|
2017-08-14 05:01:11 +02:00
|
|
|
( run: ContextualTest, ...args: any): void;
|
|
|
|
(name: string, run: ContextualTest, ...args: any): void;
|
2017-05-28 00:38:50 +02:00
|
|
|
|
|
|
|
beforeEach : ContextualTestMethod;
|
|
|
|
afterEach : ContextualTestMethod;
|
|
|
|
serial : ContextualTestMethod;
|
|
|
|
before : ContextualTestMethod;
|
|
|
|
after : ContextualTestMethod;
|
|
|
|
skip : ContextualTestMethod;
|
|
|
|
todo : ContextualTestMethod;
|
|
|
|
failing : ContextualTestMethod;
|
|
|
|
only : ContextualTestMethod;
|
|
|
|
cb : ContextualCallbackTestMethod;
|
|
|
|
always : ContextualTestMethod;
|
|
|
|
};
|