import { Definition, Program } from './core.cjs';
import 'yargs';

declare class ProgramTester<T extends Definition, U extends Required<Omit<T, 'it' | 'yes' | 'no'>>> {
    readonly program: Program<T, U>;
    constructor(program: Program<T, U>);
    intercept(question: string, answer: unknown): this;
    scanString(message: string, initialValue?: string): Promise<ValueTester>;
    scanBoolean(definition: T, message: string, initialValue?: boolean): Promise<ValueTester>;
    scanChoice(message: string, options: {
        value: string;
        label: string;
    }[], initialValue?: string): Promise<ValueTester>;
    parse(args: string[]): DefinitionTester<T>;
    interact(definition: T): Promise<DefinitionTester<U>>;
    execute(input: U): Promise<ResultTester>;
    run(args: string[]): Promise<ResultTester>;
}
declare class DefinitionTester<T extends Definition> {
    readonly definition: T;
    constructor(definition: T);
    has(key: string, ...keys: string[]): boolean;
    get(key: string): ValueTester;
}
declare class ValueTester {
    readonly value: unknown;
    constructor(value: unknown);
    isUndefined(): boolean;
    isNull(): boolean;
    isBoolean(): boolean;
    isTrue(): boolean;
    isFalse(): boolean;
    isNumber(validate?: (value: number) => boolean): boolean;
    isString(validate?: (value: string) => boolean): boolean;
    equals(value: unknown): boolean;
}
declare class ResultTester {
    readonly result: number;
    constructor(result: number);
    isSuccess(): boolean;
    isFailure(): boolean;
    isInvalid(): boolean;
    isUnknown(): boolean;
}
declare class PathTester {
    readonly path: string;
    constructor(path: string);
    isFile(): boolean;
    isDir(): boolean;
    isSymbolicLink(): boolean;
    exists(): boolean;
}

export { DefinitionTester, PathTester, ProgramTester, ResultTester, ValueTester };
