77 */
88
99import { coerceBooleanProperty } from '@angular/cdk/coercion' ;
10- import { ComponentHarness , HarnessPredicate } from '@angular/cdk/testing' ;
10+ import {
11+ BaseHarnessFilters ,
12+ ComponentHarness ,
13+ ComponentHarnessConstructor ,
14+ HarnessPredicate ,
15+ } from '@angular/cdk/testing' ;
1116import {
1217 MatOptgroupHarness ,
1318 MatOptionHarness ,
@@ -16,24 +21,20 @@ import {
1621} from '@angular/material/core/testing' ;
1722import { AutocompleteHarnessFilters } from './autocomplete-harness-filters' ;
1823
19- /** Harness for interacting with a standard mat-autocomplete in tests. */
20- export class MatAutocompleteHarness extends ComponentHarness {
24+ export abstract class _MatAutocompleteHarnessBase <
25+ OptionType extends ( ComponentHarnessConstructor < Option > & {
26+ with : ( options ?: OptionFilters ) => HarnessPredicate < Option > } ) ,
27+ Option extends ComponentHarness & { click ( ) : Promise < void > } ,
28+ OptionFilters extends BaseHarnessFilters ,
29+ OptionGroupType extends ( ComponentHarnessConstructor < OptionGroup > & {
30+ with : ( options ?: OptionGroupFilters ) => HarnessPredicate < OptionGroup > } ) ,
31+ OptionGroup extends ComponentHarness ,
32+ OptionGroupFilters extends BaseHarnessFilters
33+ > extends ComponentHarness {
2134 private _documentRootLocator = this . documentRootLocatorFactory ( ) ;
22-
23- /** The selector for the host element of a `MatAutocomplete` instance. */
24- static hostSelector = '.mat-autocomplete-trigger' ;
25-
26- /**
27- * Gets a `HarnessPredicate` that can be used to search for a `MatAutocompleteHarness` that meets
28- * certain criteria.
29- * @param options Options for filtering which autocomplete instances are considered a match.
30- * @return a `HarnessPredicate` configured with the given options.
31- */
32- static with ( options : AutocompleteHarnessFilters = { } ) : HarnessPredicate < MatAutocompleteHarness > {
33- return new HarnessPredicate ( MatAutocompleteHarness , options )
34- . addOption ( 'value' , options . value ,
35- ( harness , value ) => HarnessPredicate . stringMatches ( harness . getValue ( ) , value ) ) ;
36- }
35+ protected abstract _prefix : string ;
36+ protected abstract _optionClass : OptionType ;
37+ protected abstract _optionGroupClass : OptionGroupType ;
3738
3839 /** Gets the value of the autocomplete input. */
3940 async getValue ( ) : Promise < string > {
@@ -67,25 +68,23 @@ export class MatAutocompleteHarness extends ComponentHarness {
6768 }
6869
6970 /** Gets the options inside the autocomplete panel. */
70- async getOptions ( filters : Omit < OptionHarnessFilters , 'ancestor' > = { } ) :
71- Promise < MatOptionHarness [ ] > {
72- return this . _documentRootLocator . locatorForAll ( MatOptionHarness . with ( {
73- ...filters ,
71+ async getOptions ( filters ?: Omit < OptionFilters , 'ancestor' > ) : Promise < Option [ ] > {
72+ return this . _documentRootLocator . locatorForAll ( this . _optionClass . with ( {
73+ ...( filters || { } ) ,
7474 ancestor : await this . _getPanelSelector ( )
75- } ) ) ( ) ;
75+ } as OptionFilters ) ) ( ) ;
7676 }
7777
7878 /** Gets the option groups inside the autocomplete panel. */
79- async getOptionGroups ( filters : Omit < OptgroupHarnessFilters , 'ancestor' > = { } ) :
80- Promise < MatOptgroupHarness [ ] > {
81- return this . _documentRootLocator . locatorForAll ( MatOptgroupHarness . with ( {
82- ...filters ,
79+ async getOptionGroups ( filters ?: Omit < OptionGroupFilters , 'ancestor' > ) : Promise < OptionGroup [ ] > {
80+ return this . _documentRootLocator . locatorForAll ( this . _optionGroupClass . with ( {
81+ ...( filters || { } ) ,
8382 ancestor : await this . _getPanelSelector ( )
84- } ) ) ( ) ;
83+ } as OptionGroupFilters ) ) ( ) ;
8584 }
8685
8786 /** Selects the first option matching the given filters. */
88- async selectOption ( filters : OptionHarnessFilters ) : Promise < void > {
87+ async selectOption ( filters : OptionFilters ) : Promise < void > {
8988 await this . focus ( ) ; // Focus the input to make sure the autocomplete panel is shown.
9089 const options = await this . getOptions ( filters ) ;
9190 if ( ! options . length ) {
@@ -97,7 +96,7 @@ export class MatAutocompleteHarness extends ComponentHarness {
9796 /** Whether the autocomplete is open. */
9897 async isOpen ( ) : Promise < boolean > {
9998 const panel = await this . _getPanel ( ) ;
100- return ! ! panel && await panel . hasClass ( 'mat -autocomplete-visible' ) ;
99+ return ! ! panel && await panel . hasClass ( ` ${ this . _prefix } -autocomplete-visible` ) ;
101100 }
102101
103102 /** Gets the panel associated with this autocomplete trigger. */
@@ -112,3 +111,28 @@ export class MatAutocompleteHarness extends ComponentHarness {
112111 return `#${ ( await ( await this . host ( ) ) . getAttribute ( 'aria-owns' ) ) } ` ;
113112 }
114113}
114+
115+ /** Harness for interacting with a standard mat-autocomplete in tests. */
116+ export class MatAutocompleteHarness extends _MatAutocompleteHarnessBase <
117+ typeof MatOptionHarness , MatOptionHarness , OptionHarnessFilters ,
118+ typeof MatOptgroupHarness , MatOptgroupHarness , OptgroupHarnessFilters
119+ > {
120+ protected _prefix = 'mat' ;
121+ protected _optionClass = MatOptionHarness ;
122+ protected _optionGroupClass = MatOptgroupHarness ;
123+
124+ /** The selector for the host element of a `MatAutocomplete` instance. */
125+ static hostSelector = '.mat-autocomplete-trigger' ;
126+
127+ /**
128+ * Gets a `HarnessPredicate` that can be used to search for a `MatAutocompleteHarness` that meets
129+ * certain criteria.
130+ * @param options Options for filtering which autocomplete instances are considered a match.
131+ * @return a `HarnessPredicate` configured with the given options.
132+ */
133+ static with ( options : AutocompleteHarnessFilters = { } ) : HarnessPredicate < MatAutocompleteHarness > {
134+ return new HarnessPredicate ( MatAutocompleteHarness , options )
135+ . addOption ( 'value' , options . value ,
136+ ( harness , value ) => HarnessPredicate . stringMatches ( harness . getValue ( ) , value ) ) ;
137+ }
138+ }
0 commit comments