import axe from 'axe-core';

/**
 * @internal
 */
interface _SkyA11yAnalyzerConfig {
    rules: Record<string, {
        enabled: boolean;
    }>;
}

/**
 * @internal
 */
declare abstract class _SkyA11yAnalyzer {
    private static analyzer;
    static run(element?: axe.ElementContext, config?: _SkyA11yAnalyzerConfig): Promise<void>;
}

interface MatcherResult {
    pass: boolean;
    message: string;
}

/**
 * @internal
 */
declare function _skyTestingCheckAccessibility(el: Element | Document, options?: _SkyA11yAnalyzerConfig): Promise<MatcherResult>;

/**
 * @internal
 */
declare function _skyTestingCheckExistence(el: Element | null | undefined): MatcherResult;

/**
 * @internal
 */
declare function _skyTestingCheckLibResourceTemplate(el: Element, resourceKey: string): Promise<MatcherResult>;

/**
 * @internal
 */
declare function _skyTestingCheckLibResourceText(actualText: string, resourceKey: string, resourceArgs?: unknown[]): Promise<MatcherResult>;

/**
 * @internal
 */
declare function _skyTestingCheckResourceTemplate(el: Element, resourceKey: string): Promise<MatcherResult>;

/**
 * @internal
 */
declare function _skyTestingCheckResourceText(actualText: string, resourceKey: string, resourceArgs?: unknown[]): Promise<MatcherResult>;

/**
 * @internal
 */
interface _SkyTestingCheckVisibilityOptions {
    /**
     * Indicates if the CSS `display` property should be considered when checking an element's
     * visibility. If the `display` property is set to "none", the element is not considered visible.
     */
    checkCssDisplay?: boolean;
    /**
     * Indicates if the CSS `visibility` property should be considered when checking an element's
     * visibility. If the `visibility` property is set to "hidden", the element is not considered
     * visible.
     */
    checkCssVisibility?: boolean;
    /**
     * Indicates if the element's height and width should be considered when checking an element's
     * visibility. If the element has a height and width greater than zero, the element is considered
     * visible.
     */
    checkDimensions?: boolean;
    /**
     * Indicates if the element's existence on the document should be considered when checking an
     * element's visibility. If the element exists, it is considered visible.
     */
    checkExists?: boolean;
}

/**
 * @internal
 */
declare function _skyTestingCheckVisibility(el: Element, options?: _SkyTestingCheckVisibilityOptions): MatcherResult;

declare function _skyTestingHasCssClass(el: Element, expectedClassName: string): MatcherResult;

/**
 * @internal
 */
declare function _skyTestingHasLibResourceText(el: Element, resourceKey: string, resourceArgs: unknown[] | undefined, trimWhitespace: boolean): Promise<MatcherResult>;

/**
 * @internal
 */
declare function _skyTestingHasResourceText(el: Element, resourceKey: string, resourceArgs: unknown[] | undefined, trimWhitespace: boolean): Promise<MatcherResult>;

/**
 * @internal
 */
declare function _skyTestingHasStyle(el: Element, expectedStyles: Record<string, string>): MatcherResult;

declare function _skyTestingHasText(el: Element, expectedText: string, trimWhitespace: boolean): MatcherResult;

export { _SkyA11yAnalyzer, _skyTestingCheckAccessibility, _skyTestingCheckExistence, _skyTestingCheckLibResourceTemplate, _skyTestingCheckLibResourceText, _skyTestingCheckResourceTemplate, _skyTestingCheckResourceText, _skyTestingCheckVisibility, _skyTestingHasCssClass, _skyTestingHasLibResourceText, _skyTestingHasResourceText, _skyTestingHasStyle, _skyTestingHasText };
export type { _SkyA11yAnalyzerConfig, _SkyTestingCheckVisibilityOptions };
