// TODO: can be removed as soon as https://github.com/tapjs/node-tap/pull/607 is merged
///
import { EventEmitter } from "events";
/**
* Tap v15 deprecates **ALL** synonyms for assertions.
*/
declare class DeprecatedAssertionSynonyms {
/**
* @deprecated use ok() instead.
*/
true: Assertions.Basic;
/**
* @deprecated use ok() instead.
*/
assert: Assertions.Basic;
/**
* @deprecated use teardown() instead.
*/
tearDown(fn: () => void | Promise): void;
/**
* @deprecated use notOk() instead.
*/
false: Assertions.Basic;
/**
* @deprecated use assertNot() instead.
*/
assertNot: Assertions.Basic;
/**
* @deprecated use error() instead.
*/
ifErr: Assertions.Basic;
/**
* @deprecated use error() instead.
*/
ifError: Assertions.Basic;
/**
* @deprecated use doesNotThrow() instead.
*/
notThrow: Assertions.DoesNotThrow;
/**
* @deprecated use throws() instead.
*/
throw: Assertions.Throws;
/**
* @deprecated use equal() instead.
*/
equals: Assertions.Equal;
/**
* @deprecated use equal() instead.
*/
isEqual: Assertions.Equal;
/**
* @deprecated use equal() instead.
*/
is: Assertions.Equal;
/**
* @deprecated use equal() instead.
*/
strictEqual: Assertions.Equal;
/**
* @deprecated use equal() instead.
*/
strictEquals: Assertions.Equal;
/**
* @deprecated use equal() instead.
*/
strictIs: Assertions.Equal;
/**
* @deprecated use equal() instead.
*/
isStrict: Assertions.Equal;
/**
* @deprecated use equal() instead.
*/
isStrictly: Assertions.Equal;
/**
* @deprecated use not() instead.
*/
notEqual: Assertions.NotEqual;
/**
* @deprecated use not() instead.
*/
notEquals: Assertions.NotEqual;
/**
* @deprecated use not() instead.
*/
inequal: Assertions.NotEqual;
/**
* @deprecated use not() instead.
*/
notStrictEqual: Assertions.NotEqual;
/**
* @deprecated use not() instead.
*/
notStrictEquals: Assertions.NotEqual;
/**
* @deprecated use not() instead.
*/
isNotEqual: Assertions.NotEqual;
/**
* @deprecated use not() instead.
*/
isNot: Assertions.NotEqual;
/**
* @deprecated use not() instead.
*/
doesNotEqual: Assertions.NotEqual;
/**
* @deprecated use not() instead.
*/
isInequal: Assertions.NotEqual;
/**
* @deprecated use same() instead.
*/
equivalent: Assertions.Equal;
/**
* @deprecated use same() instead.
*/
looseEqual: Assertions.Equal;
/**
* @deprecated use same() instead.
*/
looseEquals: Assertions.Equal;
/**
* @deprecated use same() instead.
*/
deepEqual: Assertions.Equal;
/**
* @deprecated use same() instead.
*/
deepEquals: Assertions.Equal;
/**
* @deprecated use same() instead.
*/
isLoose: Assertions.Equal;
/**
* @deprecated use same() instead.
*/
looseIs: Assertions.Equal;
/**
* @deprecated use notSame() instead.
*/
inequivalent: Assertions.NotEqual;
/**
* @deprecated use notSame() instead.
*/
looseInequal: Assertions.NotEqual;
/**
* @deprecated use notSame() instead.
*/
notDeep: Assertions.NotEqual;
/**
* @deprecated use notSame() instead.
*/
deepInequal: Assertions.NotEqual;
/**
* @deprecated use notSame() instead.
*/
notLoose: Assertions.NotEqual;
/**
* @deprecated use notSame() instead.
*/
looseNot: Assertions.NotEqual;
/**
* @deprecated use strictSame() instead.
*/
strictEquivalent: Assertions.Equal;
/**
* @deprecated use strictSame() instead.
*/
strictDeepEqual: Assertions.Equal;
/**
* @deprecated use strictSame() instead.
*/
sameStrict: Assertions.Equal;
/**
* @deprecated use strictSame() instead.
*/
deepIs: Assertions.Equal;
/**
* @deprecated use strictSame() instead.
*/
isDeeply: Assertions.Equal;
/**
* @deprecated use strictSame() instead.
*/
isDeep: Assertions.Equal;
/**
* @deprecated use strictSame() instead.
*/
strictDeepEquals: Assertions.Equal;
/**
* @deprecated use strictNotSame() instead.
*/
strictInequivalent: Assertions.NotEqual;
/**
* @deprecated use strictNotSame() instead.
*/
strictDeepInequal: Assertions.NotEqual;
/**
* @deprecated use strictNotSame() instead.
*/
notSameStrict: Assertions.NotEqual;
/**
* @deprecated use strictNotSame() instead.
*/
deepNot: Assertions.NotEqual;
/**
* @deprecated use strictNotSame() instead.
*/
notDeeply: Assertions.NotEqual;
/**
* @deprecated use strictNotSame() instead.
*/
strictDeepInequals: Assertions.NotEqual;
/**
* @deprecated use strictNotSame() instead.
*/
notStrictSame: Assertions.NotEqual;
/**
* @deprecated use match() instead.
*/
matches: Assertions.Match;
/**
* @deprecated use match() instead.
*/
similar: Assertions.Match;
/**
* @deprecated use match() instead.
*/
like: Assertions.Match;
/**
* @deprecated use match() instead.
*/
isLike: Assertions.Match;
/**
* @deprecated use match() instead.
*/
isSimilar: Assertions.Match;
/**
* @deprecated use notMatch() instead.
*/
dissimilar: Assertions.Match;
/**
* @deprecated use notMatch() instead.
*/
unsimilar: Assertions.Match;
/**
* @deprecated use notMatch() instead.
*/
notSimilar: Assertions.Match;
/**
* @deprecated use notMatch() instead.
*/
unlike: Assertions.Match;
/**
* @deprecated use notMatch() instead.
*/
isUnlike: Assertions.Match;
/**
* @deprecated use notMatch() instead.
*/
notLike: Assertions.Match;
/**
* @deprecated use notMatch() instead.
*/
isNotLike: Assertions.Match;
/**
* @deprecated use notMatch() instead.
*/
doesNotHave: Assertions.Match;
/**
* @deprecated use notMatch() instead.
*/
isNotSimilar: Assertions.Match;
/**
* @deprecated use notMatch() instead.
*/
isDissimilar: Assertions.Match;
/**
* @deprecated use type() instead.
*/
isa: Assertions.Type;
/**
* @deprecated use type() instead.
*/
isA: Assertions.Type;
/**
* @deprecated use has() instead.
*/
hasFields: Assertions.Match;
/**
* @deprecated use has() instead.
*/
includes: Assertions.Match;
/**
* @deprecated use has() instead.
*/
include: Assertions.Match;
/**
* @deprecated use has() instead.
*/
contains: Assertions.Match;
}
declare namespace Assertions {
type Basic = (obj: any, message?: string, extra?: Options.Assert) => boolean;
interface Throws {
(fn?: (...args: any[]) => any, expectedError?: any, message?: string, extra?: Options.Assert): boolean;
(fn?: (...args: any[]) => any, expectedError?: any, extra?: Options.Assert): boolean;
}
type DoesNotThrow = (fn?: (...args: any[]) => any, message?: string, extra?: Options.Assert) => boolean;
type Equal = (found: any, wanted: any, message?: string, extra?: Options.Assert) => boolean;
type NotEqual = (found: any, notWanted: any, message?: string, extra?: Options.Assert) => boolean;
type Match = (
found: any,
pattern: any,
message?: string,
extra?: Options.Assert,
) => boolean;
type Type = (
found: any,
type: string | (new(...args: any[]) => object),
message?: string,
extra?: Options.Assert,
) => boolean;
}
declare namespace Options {
interface Bag {
[key: string]: any;
}
interface Pragma {
[key: string]: boolean;
}
interface Assert extends Bag {
todo?: boolean | string | undefined;
skip?: boolean | string | undefined;
diagnostic?: boolean | undefined;
}
interface Spawn extends Assert {
bail?: boolean | undefined;
timeout?: number | undefined;
}
interface Test extends Assert {
timeout?: number | undefined;
bail?: boolean | undefined;
autoend?: boolean | undefined;
buffered?: boolean | undefined;
jobs?: number | undefined;
grep?: RegExp[] | undefined;
only?: boolean | undefined;
runOnly?: boolean | undefined;
}
}
declare global {
namespace Tap {
class Test extends DeprecatedAssertionSynonyms {
constructor(options?: Options.Test);
/**
* Run the supplied function when t.end() is called, or when t.plan is met.
*
* This function can return a promise to support async actions.
* @see {@link https://node-tap.org/docs/api/test-lifecycle-events}
* @param fn
*/
teardown(fn: () => void | Promise): void;
/**
* Fail the test with a timeout error if it goes longer than the specified number of ms.
*
* Call t.setTimeout(0) to remove the timeout setting.
*
* When this is called on the top-level tap object, it sets the runners timeout value
* to the specified value for that test process as well.
*/
setTimeout(n: number): void;
/**
* Call the end() method on all child tests, and then on this one.
*/
endAll(): void;
/**
* Automatically end() the test on the next turn of the event loop after its internal queue is drained.
*/
autoend(value: boolean): void;
/**
* When an uncaught exception is raised in the context of a test,
* then this method is used to handle the error. It fails the test,
* and prints out appropriate information about the stack, message, current test,
* and so on.
*
* Generally, you never need to worry about this directly.
*/
threw(error: Error, extra?: Error, proxy?: Test): void;
/**
* Sets a pragma switch for a set of boolean keys in the argument.
*
* The only pragma currently supported by the TAP parser is strict,
* which tells the parser to treat non-TAP output as a failure.
*/
pragma(set: Options.Pragma): void;
/**
* Specify that a given number of tests are going to be run.
*
* This may only be called before running any asserts or child tests.
*/
plan(n: number, comment?: string): void;
/**
* Call when tests are done running. This is not necessary if t.plan() was used,
* or if the test function returns a Promise.
*
* If you call t.end() explicitly more than once, an error will be raised.
*/
end(): void;
/**
* Create a subtest.
*
* Returns a Promise which resolves with the parent when the child test is completed.
* @param name - The name for this subtest.
* @param extra - Any options this subtest should adhere to.
* @param cb - The function containing the sub-tests. If not present, the test
* will automatically be marked as a todo.
*/
test(name: string, extra?: Options.Test, cb?: (t: Test) => Promise | void): Promise;
/**
* Create a subtest.
*
* Returns a Promise which resolves with the parent when the child test is completed.
* @param name - The name for this subtest.
* @param cb - The function containing the sub-tests. If not present, the test
* will automatically be marked as a todo.
*/
test(name: string, cb?: (t: Test) => Promise | void): Promise;
/**
* Exactly the same as t.test(), but adds todo: true in the options.
*/
todo(name: string, cb?: (t: Test) => Promise | void): Promise;
todo(name: string, extra?: Options.Test, cb?: (t: Test) => Promise | void): Promise;
/**
* Exactly the same as t.test(), but adds skip: true in the options.
*/
skip(name: string, cb?: (t: Test) => Promise | void): Promise;
skip(name: string, extra?: Options.Test, cb?: (t: Test) => Promise | void): Promise;
/**
* Exactly the same as t.test(), but adds only: true in the options.
*
* @see {@link https://node-tap.org/docs/api/only}
*/
only(name: string, cb?: (t: Test) => Promise | void): Promise;
only(name: string, extra?: Options.Test, cb?: (t: Test) => Promise | void): Promise;
current(): Test;
/**
* Parse standard input as if it was a child test named /dev/stdin.
*
* Returns a Promise which resolves with the parent when the input stream is
* completed.
*/
stdin(name: string, extra?: Options.Bag): Promise;
/**
* Sometimes, instead of running a child test directly inline, you might
* want to run a TAP producting test as a child process, and treat its
* standard output as the TAP stream.
*
* Returns a Promise which resolves with the parent when the child process
* is completed.
*
* @see {@link https://node-tap.org/docs/api/advanced/#tspawncommand-arguments-options-name}
*/
spawn(
cmd: string,
args: string,
options?: Options.Bag,
name?: string,
extra?: Options.Spawn,
): Promise;
done(): void;
/**
* Return true if everything so far is ok.
*/
passing(): boolean;
pass(message?: string, extra?: Options.Assert): boolean;
fail(message?: string, extra?: Options.Assert): boolean;
/**
* This is used for creating assertion methods on the Test class.
*
* @param name The name of the assertion method.
* @param length The amount of arguments the assertion has.
* @param fn The code to be ran when this assertion is called.
*
* @example
* // Add an assertion that a string is in Title Case
* // It takes one argument (the string to be tested)
* t.Test.prototype.addAssert('titleCase', 1, function (str, message, extra) {
* message = message || 'should be in Title Case'
* // the string in Title Case
* const tc = str.toLowerCase().replace(/\b./, match => match.toUpperCase())
* // should always return another assert call, or
* // this.pass(message) or this.fail(message, extra)
* return this.equal(str, tc, message, extra)
* })
*
* t.titleCase('This Passes')
* t.titleCase('however, tHis tOTaLLy faILS')
*/
addAssert(name: string, length: number, fn: (...args: any[]) => boolean): boolean;
comment(message: string, ...args: any[]): void;
/**
* Use this when things are severely broken, and cannot be reasonably handled. Immediately terminates the entire test run.
*/
bailout(reason?: string): void;
/**
* Run the provided function once before any tests are ran.
* If this function returns a promise, it will wait for the promise to
* resolve, before running any tests.
*/
before(fn: () => any): void;
/**
* Before any child test (or any children of any child tests, etc.) the
* supplied function is called with the test object that it's prefixing.
*
* If the function returns a Promise, then that is used as the indication of
* doneness. Thus, async functions automatically end when all of their
* awaited Promises are complete.
*/
beforeEach(fn: (() => any) | ((childTest: any) => any)): void;
/**
* This is called after each child test (or any children of any child tests,
* on down the tree). Like beforeEach, it's called with the child test
* object, and can return a Promise to perform asynchronous operations.
*/
afterEach(fn: (() => any) | ((childTest: any) => any)): void;
/**
* Formats a string from a snapshot. This can be used to remove variables
* and replace them with sentinel values.
*
* @see {@link https://node-tap.org/docs/api/snapshot-testing/}
*
* @example
* t.cleanSnapshot = s => {
* return s.replace(/ time=[0-9]+$/g, ' time={time}')
* }
*/
cleanSnapshot: (s: string) => string;
/**
* Formats the data argument of any snapshot into this string.
*
* @see {@link https://node-tap.org/docs/api/snapshot-testing/}
*
* @example t.formatSnapshot = object => JSON.stringify(object)
*/
formatSnapshot: (obj: any) => string;
/**
* Create a fixture object to specify hard links and symbolic links
* in the fixture definition object passed to t.testdir().
*/
fixture(type: "symlink" | "link", content: string): Fixture.Instance;
fixture(type: "file", content: string | Buffer): Fixture.Instance;
fixture(type: "dir", content: Fixture.Spec): Fixture.Instance;
/**
* Create a fresh directory with the specified fixtures,
* which is deleted on test teardown. Returns the directory name.
*
* @see {@link https://node-tap.org/docs/api/fixtures/}
*/
testdir(spec?: Fixture.Spec): string;
readonly testdirName: string;
/**
* This is an object which is inherited by child tests, and is a handy place to put
* various contextual information.
*
* t.context will only be inherited by child tests if it is an object.
*
* This typically will be used with lifecycle events, such as beforeEach or afterEach.
* @see {@link https://node-tap.org/docs/api/test-lifecycle-events}
*/
context: any;
/**
* This is a read-only property set to the string value provided
* as the name argument to t.test(), or an empty string if no name is provided.
*/
readonly name: string;
/**
* Set to true to only run child tests that have only: true
* set in their options (or are run with t.only(), which is the same thing).
*/
runOnly: boolean;
/**
* If you set the t.jobs property to a number greater than 1,
* then it will enable parallel execution of all of this test's children.
*/
jobs: number;
// TODO: Investigate whether - using generics - this could
// return the type of module provided unioned with the mocks?
/**
* Takes a path to a module and returns the specified module in context of the
* mocks provided.
*
* @see {@link https://node-tap.org/docs/api/mocks/}
*
* @param modulePath - The string path to the module that is being required,
* relative to the current test file.
* @param mocks - The key/value pairs of paths (relative to the current test)
* and the value that should be returned when anything in the loaded module requires
* those modules.
*/
mock(modulePath: string, mocks: Record): any;
// ----
// Assertions below this line!
// ----
/**
* Verifies that the object is truthy.
*/
ok: Assertions.Basic;
/**
* Verifies that the object is not truthy.
*/
notOk: Assertions.Basic;
/**
* If the object is an error, then the assertion fails.
*
* Note: if an error is encountered unexpectedly,
* it's often better to simply throw it. The Test object will handle this as a failure.
*/
error: Assertions.Basic;
/**
* Verify that the event emitter emits the named event before the end of the test.
*/
emits(eventEmitter: EventEmitter, event: string, message?: string, extra?: Options.Assert): void;
/**
* Verifies that the promise (or promise-returning function) rejects.
*
* If an expected error is provided,
* then also verify that the rejection matches the expected error.
*/
rejects(
promiseOrFn: Promise | ((...args: any[]) => Promise),
expectedError: any,
message?: string,
extra?: Options.Assert,
): Promise;
rejects(
promiseOrFn: Promise | ((...args: any[]) => Promise),
message?: string,
extra?: Options.Assert,
): Promise;
/**
* Verifies that the promise (or promise-returning function) resolves,
* making no expectation about the value that the promise resolves to.
*/
resolves(
promiseOrFn: Promise | ((...args: any[]) => Promise),
message?: string,
extra?: Options.Assert,
): Promise;
/**
* Verifies that the promise (or promise-returning function) resolves
* and that the value of the promise matches the wanted pattern using t.match.
*
* @see match
*/
resolveMatch(
promiseOrFn: Promise | ((...args: any[]) => Promise),
wanted: any,
message?: string,
extra?: Options.Assert,
): Promise;
/**
* Verifies that the promise (or promise-returning function) resolves, and
* furthermore that the value of the promise matches the snapshot.
*
* Note: since promises always reject and resolve asynchronously, this
* assertion is implemented asynchronously. As such, it does not return a
* boolean to indicate its passing status. Instead, it returns a Promise
* that resolves when it is completed.
*/
resolveMatchSnapshot(
promiseOrFn: Promise | ((...args: any[]) => Promise),
message?: string,
extra?: Options.Assert,
): Promise;
// WARN: This is not described in the documentation formally anymore?
/**
* Checks if the output in data matches the data with this snapshot name.
*
* @see {@link https://node-tap.org/docs/api/snapshot-testing/}
*/
matchSnapshot(output: any, message?: string, extra?: Options.Assert): boolean;
/**
* Expect the function to throw an error.
* If an expected error is provided, then also verify that the thrown error
* matches the expected error.
*
* If the function has a name, and the message is not provided,
* then the function name will be used as the message.
*
* If the function is not provided, then this will be treated as a todo test.
*/
throws: Assertions.Throws;
/**
* Verify that the provided function does not throw.
*
* If the function has a name, and the message is not provided,
* then the function name will be used as the message.
*
* If the function is not provided, then this will be treated as a todo test.
*
* Note: If an error is encountered unexpectedly,
* it's often better to simply throw it. The Test object will handle this as a failure.
*/
doesNotThrow: Assertions.DoesNotThrow;
/**
* Expect the function to throw an uncaught exception at some point in the future,
* before the test ends.
* If the test ends without having thrown the expected error, then the test fails.
*
* If the error is thrown synchronously, or within a promise,
* then the t.throws() or t.rejects() methods are more appropriate.
*
* If called multiple times, then the uncaught exception errors must be emitted in the order called.
*/
expectUncaughtException(
fn?: (...args: any[]) => any,
expectedError?: Error,
message?: string,
extra?: Options.Assert,
): boolean;
/**
* Verify that the object found is exactly the same (that is, ===)
* to the object that is wanted.
*/
equal: Assertions.Equal;
/**
* Inverse of t.equal().
*
* Verify that the object found is not exactly the same (that is, !==)
* as the object that is wanted.
*/
not: Assertions.NotEqual;
/**
* Verify that the found object is deeply equivalent to the wanted object.
*
* Uses non-strict equality for scalars (ie, ==).
*/
same: Assertions.Equal;
/**
* Inverse of t.same().
*
* Verify that the found object is not deeply equivalent to the unwanted object.
* Uses non-strict inequality (ie, !=) for scalars.
*/
notSame: Assertions.NotEqual;
/**
* Strict version of t.same().
*
* Verify that the found object is deeply equivalent to the wanted object.
* Uses strict equality for scalars (ie, ===).
*/
strictSame: Assertions.Equal;
/**
* Inverse of t.strictSame().
*
* Verify that the found object is not deeply equivalent to the unwanted object.
* Uses strict equality for scalars (ie, ===).
*/
strictNotSame: Assertions.NotEqual;
/**
* Verify that the found object contains all of the provided fields,
* and that they are of the same type and value as the pattern provided.
*
* @see has
*/
hasStrict: Assertions.Match;
/**
* Verify that the found object matches the pattern provided.
*
* If pattern is a regular expression, and found is a string, then verify that the string matches the pattern.
* If the pattern is a string, and found is a string, then verify that the pattern occurs within the string somewhere.
* If pattern is an object, then verify that all of the (enumerable) fields in the pattern match the corresponding fields in the object using this same algorithm.
*
* This is useful when you want to verify that an object has a certain set of required fields, but additional fields are ok.
*
* @example {x:/a[sdf]{3}/} would successfully match {x:'asdf',y:'z'}.
*/
match: Assertions.Match;
/**
* Verify that the found object contains all of the provided fields, and that they coerce to the same values, even if the types do not match.
*
* This does not do advanced/loose matching based on constructor, regexp patterns, and so on, like t.match() does.
* You may specify key: undefined in the pattern to ensure that a field is not defined in the found object,
* but it will not differentiate between a missing property and a property set to undefined.
*/
has: Assertions.Match;
/**
* Verify that the found object contains the provided property and that it is not undefined. Searches the prototype chain as well as "own" properties.
*
* @example t.hasProp({ a: 1, b: 2 }, 'a') would succeed, while both t.hasProp({ a: 1, b: 2 }, 'c') and t.hasProp({ a: undefined, b: 2 }, 'a') would fail.
*/
hasProp: Assertions.Match;
/**
* Verifies that the object found contains each of the property names in propertyList, and that they are not undefined. Searches prototype chain as well as "own" properties.
*
* @example t.hasProps({ a: 1, b: 2 }, ['a', 'b']) would succeed, while both t.hasProp({ a: 1, b: 2 }, ['a', 'c']) and t.hasProp({ a: undefined, b: 2 }, ['a', 'b']) would fail.
*/
hasProps: Assertions.Match;
/**
* Inverse of match().
*
* Verify that the found object does not match the pattern provided.
*/
notMatch: Assertions.Match;
/**
* Verify that the object is of the type provided.
*
* Type can be a string that matches the typeof value of the object,
* or the string name of any constructor in the object's prototype chain,
* or a constructor function in the object's prototype chain.
*
* @example type(new Date(), "object") - true
* @example type(new Date(), "Date") - true
* @example type(new Date(), Date) - true
*/
type: Assertions.Type;
}
namespace Fixture {
interface Instance {
type: "symlink" | "link" | "file" | "dir";
content: string | Buffer | Spec;
}
interface Spec {
[pathname: string]: string | Buffer | Instance | Spec;
}
}
interface MochaIt {
(name?: string, fn?: (a: any) => any): void;
skip: (name?: string, fn?: (a: any) => any) => void;
todo: (name?: string, fn?: (a: any) => any) => void;
}
interface Mocha {
it: MochaIt;
describe: (name?: string, fn?: (a: any) => any) => void;
global: () => void;
}
// Little hack to simulate the Test class on the tap export
interface TestConstructor {
new(options?: Options.Test): Test;
prototype: Test;
}
class Tap extends Test {
Test: TestConstructor;
mocha: Mocha;
mochaGlobals: () => void;
}
}
}
declare const tap: Tap.Tap;
export = tap;