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) => 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;
}
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[];
}
export declare function runSuite(suite: Suite): Execution;
