7
7
*/
8
8
9
9
import { 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' ;
11
16
import {
12
17
MatOptgroupHarness ,
13
18
MatOptionHarness ,
@@ -16,24 +21,20 @@ import {
16
21
} from '@angular/material/core/testing' ;
17
22
import { AutocompleteHarnessFilters } from './autocomplete-harness-filters' ;
18
23
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 {
21
34
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 ;
37
38
38
39
/** Gets the value of the autocomplete input. */
39
40
async getValue ( ) : Promise < string > {
@@ -67,25 +68,23 @@ export class MatAutocompleteHarness extends ComponentHarness {
67
68
}
68
69
69
70
/** 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 || { } ) ,
74
74
ancestor : await this . _getPanelSelector ( )
75
- } ) ) ( ) ;
75
+ } as OptionFilters ) ) ( ) ;
76
76
}
77
77
78
78
/** 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 || { } ) ,
83
82
ancestor : await this . _getPanelSelector ( )
84
- } ) ) ( ) ;
83
+ } as OptionGroupFilters ) ) ( ) ;
85
84
}
86
85
87
86
/** Selects the first option matching the given filters. */
88
- async selectOption ( filters : OptionHarnessFilters ) : Promise < void > {
87
+ async selectOption ( filters : OptionFilters ) : Promise < void > {
89
88
await this . focus ( ) ; // Focus the input to make sure the autocomplete panel is shown.
90
89
const options = await this . getOptions ( filters ) ;
91
90
if ( ! options . length ) {
@@ -97,7 +96,7 @@ export class MatAutocompleteHarness extends ComponentHarness {
97
96
/** Whether the autocomplete is open. */
98
97
async isOpen ( ) : Promise < boolean > {
99
98
const panel = await this . _getPanel ( ) ;
100
- return ! ! panel && await panel . hasClass ( 'mat -autocomplete-visible' ) ;
99
+ return ! ! panel && await panel . hasClass ( ` ${ this . _prefix } -autocomplete-visible` ) ;
101
100
}
102
101
103
102
/** Gets the panel associated with this autocomplete trigger. */
@@ -112,3 +111,28 @@ export class MatAutocompleteHarness extends ComponentHarness {
112
111
return `#${ ( await ( await this . host ( ) ) . getAttribute ( 'aria-owns' ) ) } ` ;
113
112
}
114
113
}
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