{"version":3,"file":"aposin-ng-aquila-button-testing.mjs","sources":["../../../projects/ng-aquila/src/button/testing/button-harness.ts","../../../projects/ng-aquila/src/button/testing/aposin-ng-aquila-button-testing.ts"],"sourcesContent":["import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { BaseHarnessFilters, ComponentHarnessConstructor, ContentContainerComponentHarness, HarnessPredicate, parallel } from '@angular/cdk/testing';\nimport { NxButtonType } from '@aposin/ng-aquila/button';\n\ntype Type = 'basic' | 'icon' | 'plain';\n\ninterface NxButtonHarnessFilters extends BaseHarnessFilters {\n    type?: Type;\n    variant?: NxButtonType;\n    critical?: boolean;\n    text?: string | RegExp;\n}\n\nexport class NxButtonHarness extends ContentContainerComponentHarness {\n    static hostSelector = `.nx-button, .nx-icon-button, .nx-plain-button`;\n\n    static with<T extends NxButtonHarness>(this: ComponentHarnessConstructor<T>, options: NxButtonHarnessFilters = {}) {\n        return new HarnessPredicate<NxButtonHarness>(this, options)\n            .addOption('type', options.type, async (harness, type) => HarnessPredicate.stringMatches(await harness.getType(), type))\n            .addOption('variant', options.variant, async (harness, variant) => HarnessPredicate.stringMatches(await harness.getVariant(), variant))\n            .addOption('critical', options.critical, async (harness, critical) => (await harness.isCritical()) === critical)\n            .addOption('text', options.text, async (harness, text) => HarnessPredicate.stringMatches(await harness.getText(), text));\n    }\n\n    private _basicButtonContent = this.locatorFor('span.nx-button__content');\n    private _plainButtonContent = this.locatorFor('span.nx-plain-button__content');\n\n    /**\n     * Clicks the button at the given position relative to its top-left.\n     * @param relativeX The relative x position of the click.\n     * @param relativeY The relative y position of the click.\n     */\n    click(relativeX: number, relativeY: number): Promise<void>;\n    /** Clicks the button at its center. */\n    click(location?: 'center'): Promise<void>;\n    async click(...args: [center?: 'center'] | [number, number]): Promise<void> {\n        return (await this.host()).click(...(args as []));\n    }\n\n    async getHref(): Promise<string | null> {\n        const host = await this.host();\n        return host.getAttribute('href');\n    }\n\n    async getText(): Promise<string> {\n        const type = await this.getType();\n        switch (type) {\n            case 'basic':\n                return (await (await this._basicButtonContent()).text()).trim();\n            case 'plain':\n                return (await (await this._plainButtonContent()).text()).trim();\n            case 'icon':\n                return '';\n        }\n    }\n\n    private _criticalClasses = ['nx-plain-button--danger', 'nx-button--danger'] as const;\n    async isCritical(): Promise<boolean> {\n        const host = await this.host();\n        return (await parallel(() => this._criticalClasses.map(clazz => host.hasClass(clazz)))).some(v => v);\n    }\n\n    async getType(): Promise<Type> {\n        const host = await this.host();\n        // eslint-disable-next-line eqeqeq\n        if (await host.hasClass('nx-button')) {\n            return 'basic';\n            // eslint-disable-next-line eqeqeq\n        } else if (await host.hasClass('nx-icon-button')) {\n            return 'icon';\n            // eslint-disable-next-line eqeqeq\n        } else if (await host.hasClass('nx-plain-button')) {\n            return 'plain';\n        }\n\n        return 'basic';\n    }\n\n    async getVariant(): Promise<NxButtonType> {\n        const host = await this.host();\n        if (await host.hasClass('nx-button--primary')) {\n            return 'primary';\n        }\n        if (await host.hasClass('nx-button--secondary')) {\n            return 'secondary';\n        }\n        if (await host.hasClass('nx-button--tertiary')) {\n            return 'tertiary';\n        }\n        if (await host.hasClass('nx-button--cta')) {\n            return 'cta';\n        }\n        if (await host.hasClass('nx-button--emphasis')) {\n            return 'emphasis';\n        }\n        if (await host.hasClass('nx-button--attention')) {\n            return 'attention';\n        }\n        return 'primary';\n    }\n\n    async isDisabled() {\n        const host = await this.host();\n        const disabled = await host.getAttribute('disabled');\n        const ariaDisabled = await host.getAttribute('aria-disabled');\n\n        return coerceBooleanProperty(disabled) || coerceBooleanProperty(ariaDisabled);\n    }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}