import { Hook, Spec, Suite } from './executable';
export interface ExecutionFailure {
    number: number;
    error: Error;
    source: Suite | Spec | Hook;
    type: 'suite' | 'spec' | 'hook';
}
export interface ExecutionEvents {
    'suite:start': (suite: Suite) => void;
    'suite:done': (suite: Suite, time: number) => void;
    'spec:start': (spec: Spec) => void;
    'spec:error': (spec: Spec, failure: ExecutionFailure) => void;
    'spec:skip': (spec: Spec, time: number) => void;
    'spec:pass': (spec: Spec, time: number, slow: boolean) => void;
    'spec:fail': (spec: Spec, time: number, failure: ExecutionFailure) => void;
    'hook:start': (hook: Hook) => void;
    'hook:error': (hook: Hook, failure: ExecutionFailure) => void;
    'hook:skip': (hook: Hook, time: number) => void;
    'hook:pass': (hook: Hook, time: number) => void;
    'hook:fail': (hook: Hook, time: number, failure: ExecutionFailure) => void;
}
interface SuiteRecord {
    type: 'suite';
    name: string;
    records: (SuiteRecord | SpecRecord | HookRecord)[];
}
interface SpecRecord {
    type: 'spec';
    name: string;
    result: 'passed' | 'failed' | 'skipped';
    failure?: number;
    slow?: boolean;
    ms: number;
}
interface HookRecord {
    type: 'hook';
    name: string;
    result: 'failed';
    failure: number;
}
export type Record = SuiteRecord | SpecRecord | HookRecord;
export interface Execution {
    on<E extends keyof ExecutionEvents>(event: E, listener: ExecutionEvents[E]): this;
    off<E extends keyof ExecutionEvents>(event: E, listener: ExecutionEvents[E]): this;
    once<E extends keyof ExecutionEvents>(event: E, listener: ExecutionEvents[E]): this;
    result: Promise<ExecutionResult>;
}
export interface ExecutionResult {
    passed: number;
    failed: number;
    skipped: number;
    time: number;
    failures: ExecutionFailure[];
    records: Record[];
}
export declare function runSuite(suite: Suite): Execution;
export {};
