/**
 * Object interface for registering suites
 *
 * Suites are described using objects. The object structure is a subset of suite properties, specifically name, the
 * lifecycle methods, and tests.
 *
 *     registerSuite('foo', {
 *         before() {},
 *         afterEach() {},
 *         tests: {
 *             bar() {},
 *             baz() {}
 *         }
 *     });
 *
 * Tests may also describe sub-suites:
 *
 *     registerSuite('foo', {
 *         tests: {
 *             fooStuff {
 *                 tests: {
 *                     bar() {},
 *                     baz() {}
 *                 }
 *             }
 *         }
 *     });
 *
 * Sub-suites don't need name properties, and may also omit the 'tests' nesting if no lifecycle functions are in use.
 * The rule is that if a 'tests' property isn't in the sub-suite object, then every property is assumed to refer to a
 * test.
 *
 *     registerSuite('foo', {
 *         fooStuff {
 *             bar() {},
 *             baz() {}
 *         }
 *     });
 */
import Suite, { SuiteProperties } from '../Suite';
import Test, { TestFunction } from '../Test';
import Executor from '../executors/Executor';
/**
 * Importable interface that uses the currently installed global executor
 */
export default function registerSuite(name: string, descriptorOrFactory: ObjectSuiteDescriptor | ObjectSuiteFactory | Tests): void;
/**
 * Interface factory used by Executor
 */
export declare function getInterface(executor: Executor): {
    registerSuite(name: string, descriptorOrFactory: ObjectSuiteDescriptor | ObjectSuiteFactory | Tests): void;
};
export interface ObjectInterface {
    registerSuite(name: string, mainDescriptor: ObjectSuiteDescriptor | ObjectSuiteFactory | Tests): void;
}
export interface Tests {
    [name: string]: ObjectSuiteDescriptor | TestFunction | Tests;
}
export declare type ObjectSuiteDescriptor = Partial<SuiteProperties> & {
    tests: Tests;
};
export interface ObjectSuiteFactory {
    (): ObjectSuiteDescriptor | Tests;
}
export declare function isSuiteDescriptorFactory<T>(value: any): value is T;
export declare function createSuite<S extends typeof Suite, T extends typeof Test>(name: string, parent: Suite, descriptor: ObjectSuiteDescriptor | Tests, SuiteClass: S, TestClass: T): Suite;
