import Task from '@dojo/core/async/Task';
import Deferred from './Deferred';
import Executor from './executors/Executor';
import Test from './Test';
import { InternError } from './types';
import { Remote } from './executors/WebDriver';
import Promise from '@dojo/shim/Promise';
export default class Suite implements SuiteProperties {
    after: SuiteLifecycleFunction;
    afterEach: TestLifecycleFunction;
    async: (timeout?: number) => Deferred<void>;
    before: SuiteLifecycleFunction;
    beforeEach: TestLifecycleFunction;
    error: InternError;
    name: string;
    parent: Suite;
    publishAfterSetup: boolean;
    skipped: string;
    tests: (Suite | Test)[];
    timeElapsed: number;
    private _bail;
    private _executor;
    private _grep;
    private _remote;
    private _sessionId;
    private _timeout;
    constructor(options: SuiteOptions | RootSuiteOptions);
    bail: boolean;
    executor: Executor;
    grep: RegExp;
    readonly id: string;
    readonly parentId: string;
    remote: Remote;
    sessionId: string;
    readonly numTests: number;
    readonly numFailedTests: number;
    readonly numSkippedTests: number;
    readonly hasParent: boolean;
    timeout: number;
    add(suiteOrTest: Suite | Test): void;
    run(): Task<any>;
    skip(message?: string): void;
    toJSON(): Object;
}
export declare function isSuite(value: any): value is Suite;
export declare function isSuiteOptions(value: any): value is SuiteOptions;
export interface SuiteLifecycleFunction {
    (this: Suite, suite: Suite): void | Promise<any>;
}
export interface TestLifecycleFunction {
    (this: Test, test: Test): void | Promise<any>;
}
export interface SuiteProperties {
    after: SuiteLifecycleFunction;
    afterEach: TestLifecycleFunction;
    bail: boolean;
    before: SuiteLifecycleFunction;
    beforeEach: TestLifecycleFunction;
    executor: Executor;
    grep: RegExp;
    name: string;
    parent: Suite;
    publishAfterSetup: boolean;
    timeout: number;
}
export declare type SuiteOptions = Partial<SuiteProperties> & {
    name: string;
    tests?: (Suite | Test)[];
};
export declare type RootSuiteOptions = Partial<SuiteProperties> & {
    executor: Executor;
    tests?: (Suite | Test)[];
};
