Skip to content

Commit 8158a04

Browse files
committed
feat(select,input,form-field): move test harnesses out of experimental
Moves the test harnesses for the `select`, `input` and `form-field` packages out of `material-experimental`.
1 parent af6c13f commit 8158a04

32 files changed

+203
-101
lines changed

.github/CODEOWNERS

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,6 @@
8989

9090
# Material experimental package
9191
/src/material-experimental/* @jelbourn
92-
/src/material-experimental/input/** @devversion
93-
/src/material-experimental/form-field/** @devversion
9492
/src/material-experimental/mdc-autocomplete/** @crisbeto
9593
/src/material-experimental/mdc-button/** @andrewseguin
9694
/src/material-experimental/mdc-card/** @mmalerba
@@ -112,7 +110,6 @@
112110
/src/material-experimental/mdc-theming/** @mmalerba
113111
/src/material-experimental/mdc-typography/** @mmalerba
114112
/src/material-experimental/popover-edit/** @kseamon @andrewseguin
115-
/src/material-experimental/select/** @crisbeto
116113

117114
# CDK experimental package
118115
/src/cdk-experimental/* @jelbourn

src/material-experimental/config.bzl

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
entryPoints = [
2-
"form-field/testing",
3-
"form-field/testing/control",
4-
"input/testing",
52
"mdc-autocomplete",
63
"mdc-button",
74
"mdc-button/testing",
@@ -22,14 +19,13 @@ entryPoints = [
2219
"mdc-slider",
2320
"mdc-tabs",
2421
"popover-edit",
25-
"select/testing",
2622
]
2723

2824
# List of all non-testing entry-points of the Angular material-experimental package.
2925
MATERIAL_EXPERIMENTAL_ENTRYPOINTS = [
3026
ep
3127
for ep in entryPoints
32-
if not ep.endswith("/testing")
28+
if not "/testing" in ep
3329
]
3430

3531
# List of all testing entry-points of the Angular material-experimental package.

src/material/config.bzl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,17 @@ entryPoints = [
5353
"toolbar",
5454
"tooltip",
5555
"tree",
56+
"form-field/testing",
57+
"form-field/testing/control",
58+
"input/testing",
59+
"select/testing",
5660
]
5761

5862
# List of all non-testing entry-points of the Angular Material package.
5963
MATERIAL_ENTRYPOINTS = [
6064
ep
6165
for ep in entryPoints
62-
if not ep.endswith("/testing")
66+
if not "/testing" in ep
6367
]
6468

6569
# List of all testing entry-points of the Angular Material package.

src/material-experimental/form-field/testing/BUILD.bazel renamed to src/material/form-field/testing/BUILD.bazel

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,20 @@ ts_library(
88
["**/*.ts"],
99
exclude = ["**/*.spec.ts"],
1010
),
11-
module_name = "@angular/material-experimental/form-field/testing",
11+
module_name = "@angular/material/form-field/testing",
1212
deps = [
1313
"//src/cdk/testing",
14-
"//src/material-experimental/form-field/testing/control",
15-
"//src/material-experimental/input/testing",
16-
"//src/material-experimental/select/testing",
14+
"//src/material/form-field/testing/control",
15+
"//src/material/input/testing",
16+
"//src/material/select/testing",
1717
],
1818
)
1919

20+
filegroup(
21+
name = "source-files",
22+
srcs = glob(["**/*.ts"]),
23+
)
24+
2025
ng_test_library(
2126
name = "harness_tests_lib",
2227
srcs = ["shared.spec.ts"],
@@ -39,12 +44,12 @@ ng_test_library(
3944
deps = [
4045
":harness_tests_lib",
4146
":testing",
42-
"//src/material-experimental/input/testing",
43-
"//src/material-experimental/select/testing",
4447
"//src/material/autocomplete",
4548
"//src/material/form-field",
4649
"//src/material/input",
50+
"//src/material/input/testing",
4751
"//src/material/select",
52+
"//src/material/select/testing",
4853
],
4954
)
5055

src/material-experimental/form-field/testing/control/BUILD.bazel renamed to src/material/form-field/testing/control/BUILD.bazel

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ load("//tools:defaults.bzl", "ts_library")
55
ts_library(
66
name = "control",
77
srcs = glob(["**/*.ts"]),
8-
module_name = "@angular/material-experimental/form-field/testing/control",
8+
module_name = "@angular/material/form-field/testing/control",
99
deps = ["//src/cdk/testing"],
1010
)
11+
12+
filegroup(
13+
name = "source-files",
14+
srcs = glob(["**/*.ts"]),
15+
)

src/material-experimental/form-field/testing/form-field-harness-filters.ts renamed to src/material/form-field/testing/form-field-harness-filters.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,7 @@
88

99
import {BaseHarnessFilters} from '@angular/cdk/testing';
1010

11-
export interface FormFieldHarnessFilters extends BaseHarnessFilters {}
11+
export interface FormFieldHarnessFilters extends BaseHarnessFilters {
12+
floatingLabelText?: string | RegExp;
13+
hasErrors?: boolean;
14+
}

src/material-experimental/form-field/testing/form-field-harness.spec.ts renamed to src/material/form-field/testing/form-field-harness.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import {MatInputHarness} from '@angular/material-experimental/input/testing';
2-
import {MatSelectHarness} from '@angular/material-experimental/select/testing';
1+
import {MatInputHarness} from '@angular/material/input/testing';
2+
import {MatSelectHarness} from '@angular/material/select/testing';
33
import {MatAutocompleteModule} from '@angular/material/autocomplete';
44
import {MatFormFieldModule} from '@angular/material/form-field';
55
import {MatInputModule} from '@angular/material/input';

src/material-experimental/form-field/testing/form-field-harness.ts renamed to src/material/form-field/testing/form-field-harness.ts

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,9 @@ import {
1313
HarnessQuery,
1414
TestElement
1515
} from '@angular/cdk/testing';
16-
import {
17-
MatFormFieldControlHarness
18-
} from '@angular/material-experimental/form-field/testing/control';
19-
import {MatInputHarness} from '@angular/material-experimental/input/testing';
20-
import {MatSelectHarness} from '@angular/material-experimental/select/testing';
16+
import {MatFormFieldControlHarness} from '@angular/material/form-field/testing/control';
17+
import {MatInputHarness} from '@angular/material/input/testing';
18+
import {MatSelectHarness} from '@angular/material/select/testing';
2119
import {FormFieldHarnessFilters} from './form-field-harness-filters';
2220

2321
// TODO(devversion): support datepicker harness once developed (COMP-203).
@@ -30,21 +28,24 @@ export class MatFormFieldHarness extends ComponentHarness {
3028
static hostSelector = '.mat-form-field';
3129

3230
/**
33-
* Gets a `HarnessPredicate` that can be used to search for an form-field with
34-
* specific attributes.
35-
* @param options Options for narrowing the search:
36-
* - `selector` finds a form-field that matches the given selector.
31+
* Gets a `HarnessPredicate` that can be used to search for a `MatFormFieldHarness` that meets
32+
* certain criteria.
33+
* @param options Options for filtering which form field instances are considered a match.
3734
* @return a `HarnessPredicate` configured with the given options.
3835
*/
3936
static with(options: FormFieldHarnessFilters = {}): HarnessPredicate<MatFormFieldHarness> {
40-
return new HarnessPredicate(MatFormFieldHarness, options);
37+
return new HarnessPredicate(MatFormFieldHarness, options)
38+
.addOption('floatingLabelText', options.floatingLabelText, async (harness, text) =>
39+
HarnessPredicate.stringMatches(await harness.getLabel(), text))
40+
.addOption('hasErrors', options.hasErrors, async (harness, hasErrors) =>
41+
await harness.hasErrors() === hasErrors);
4142
}
4243

4344
private _prefixContainer = this.locatorForOptional('.mat-form-field-prefix');
4445
private _suffixContainer = this.locatorForOptional('.mat-form-field-suffix');
4546
private _label = this.locatorForOptional('.mat-form-field-label');
4647
private _errors = this.locatorForAll('.mat-error');
47-
private _hints = this.locatorForAll('mat-hint,.mat-hint');
48+
private _hints = this.locatorForAll('mat-hint, .mat-hint');
4849

4950
private _inputControl = this.locatorForOptional(MatInputHarness);
5051
private _selectControl = this.locatorForOptional(MatSelectHarness);
@@ -117,6 +118,11 @@ export class MatFormFieldHarness extends ComponentHarness {
117118
return (await this.host()).hasClass('mat-form-field-can-float');
118119
}
119120

121+
/** Whether the form-field has errors. */
122+
async hasErrors(): Promise<boolean> {
123+
return (await this.getTextErrors()).length > 0;
124+
}
125+
120126
/** Whether the label is currently floating. */
121127
async isLabelFloating(): Promise<boolean> {
122128
return (await this.host()).hasClass('mat-form-field-should-float');
@@ -146,28 +152,28 @@ export class MatFormFieldHarness extends ComponentHarness {
146152
}
147153

148154
/** Gets error messages which are currently displayed in the form-field. */
149-
async getErrorMessages(): Promise<string[]> {
155+
async getTextErrors(): Promise<string[]> {
150156
return Promise.all((await this._errors()).map(e => e.text()));
151157
}
152158

153159
/** Gets hint messages which are currently displayed in the form-field. */
154-
async getHintMessages(): Promise<string[]> {
160+
async getTextHints(): Promise<string[]> {
155161
return Promise.all((await this._hints()).map(e => e.text()));
156162
}
157163

158164
/**
159165
* Gets a reference to the container element which contains all projected
160166
* prefixes of the form-field.
161167
*/
162-
async getPrefixContainer(): Promise<TestElement|null> {
168+
async getHarnessLoaderForPrefix(): Promise<TestElement|null> {
163169
return this._prefixContainer();
164170
}
165171

166172
/**
167173
* Gets a reference to the container element which contains all projected
168174
* suffixes of the form-field.
169175
*/
170-
async getSuffixContainer(): Promise<TestElement|null> {
176+
async getHarnessLoaderForSuffix(): Promise<TestElement|null> {
171177
return this._suffixContainer();
172178
}
173179

src/material-experimental/form-field/testing/public-api.ts renamed to src/material/form-field/testing/public-api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// Re-export everything from the "form-field/testing/control" entry-point. To avoid
1010
// circular dependencies, harnesses for default form-field controls (i.e. input, select)
1111
// need to import the base form-field control harness through a separate entry-point.
12-
export * from '@angular/material-experimental/form-field/testing/control';
12+
export * from '@angular/material/form-field/testing/control';
1313

1414
export * from './form-field-harness';
1515
export * from './form-field-harness-filters';

src/material-experimental/form-field/testing/shared.spec.ts renamed to src/material/form-field/testing/shared.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,33 +166,33 @@ export function runHarnessTests(
166166

167167
it('should be able to get error messages of form-field', async () => {
168168
const formFields = await loader.getAllHarnesses(formFieldHarness);
169-
expect(await formFields[1].getErrorMessages()).toEqual([]);
169+
expect(await formFields[1].getTextErrors()).toEqual([]);
170170

171171
fixture.componentInstance.requiredControl.setValue('');
172172
dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur');
173-
expect(await formFields[1].getErrorMessages()).toEqual(['Error 1', 'Error 2']);
173+
expect(await formFields[1].getTextErrors()).toEqual(['Error 1', 'Error 2']);
174174
});
175175

176176
it('should be able to get hint messages of form-field', async () => {
177177
const formFields = await loader.getAllHarnesses(formFieldHarness);
178-
expect(await formFields[1].getHintMessages()).toEqual(['Hint 1', 'Hint 2']);
178+
expect(await formFields[1].getTextHints()).toEqual(['Hint 1', 'Hint 2']);
179179

180180
fixture.componentInstance.requiredControl.setValue('');
181181
dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur');
182-
expect(await formFields[1].getHintMessages()).toEqual([]);
182+
expect(await formFields[1].getTextHints()).toEqual([]);
183183
});
184184

185185
it('should be able to get prefix container of form-field', async () => {
186186
const formFields = await loader.getAllHarnesses(formFieldHarness);
187-
const prefixContainers = await Promise.all(formFields.map(f => f.getPrefixContainer()));
187+
const prefixContainers = await Promise.all(formFields.map(f => f.getHarnessLoaderForPrefix()));
188188
expect(prefixContainers[0]).not.toBe(null);
189189
expect(await prefixContainers[0]!.text()).toBe('prefix_textprefix_text_2');
190190
expect(prefixContainers[1]).toBe(null);
191191
});
192192

193193
it('should be able to get suffix container of form-field', async () => {
194194
const formFields = await loader.getAllHarnesses(formFieldHarness);
195-
const suffixContainer = await Promise.all(formFields.map(f => f.getSuffixContainer()));
195+
const suffixContainer = await Promise.all(formFields.map(f => f.getHarnessLoaderForSuffix()));
196196
expect(suffixContainer[0]).not.toBe(null);
197197
expect(await suffixContainer[0]!.text()).toBe('suffix_text');
198198
expect(suffixContainer[1]).toBe(null);

src/material-experimental/input/testing/BUILD.bazel renamed to src/material/input/testing/BUILD.bazel

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,19 @@ ts_library(
88
["**/*.ts"],
99
exclude = ["**/*.spec.ts"],
1010
),
11-
module_name = "@angular/material-experimental/input/testing",
11+
module_name = "@angular/material/input/testing",
1212
deps = [
1313
"//src/cdk/coercion",
1414
"//src/cdk/testing",
15-
"//src/material-experimental/form-field/testing/control",
15+
"//src/material/form-field/testing/control",
1616
],
1717
)
1818

19+
filegroup(
20+
name = "source-files",
21+
srcs = glob(["**/*.ts"]),
22+
)
23+
1924
ng_test_library(
2025
name = "harness_tests_lib",
2126
srcs = ["shared.spec.ts"],

src/material-experimental/input/testing/input-harness-filters.ts renamed to src/material/input/testing/input-harness-filters.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@
99
import {BaseHarnessFilters} from '@angular/cdk/testing';
1010

1111
export interface InputHarnessFilters extends BaseHarnessFilters {
12-
value?: string;
12+
value?: string | RegExp;
13+
placeholder?: string | RegExp;
1314
}

src/material-experimental/input/testing/input-harness.ts renamed to src/material/input/testing/input-harness.ts

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,27 @@
77
*/
88

99
import {HarnessPredicate} from '@angular/cdk/testing';
10-
import {
11-
MatFormFieldControlHarness
12-
} from '@angular/material-experimental/form-field/testing/control';
10+
import {MatFormFieldControlHarness} from '@angular/material/form-field/testing/control';
1311
import {InputHarnessFilters} from './input-harness-filters';
1412

1513
/** Harness for interacting with a standard Material inputs in tests. */
1614
export class MatInputHarness extends MatFormFieldControlHarness {
1715
static hostSelector = '[matInput]';
1816

1917
/**
20-
* Gets a `HarnessPredicate` that can be used to search for an input with
21-
* specific attributes.
22-
* @param options Options for narrowing the search:
23-
* - `name` finds an input with specific name.
24-
* - `id` finds an input with specific id.
25-
* - `value` finds an input with specific value.
18+
* Gets a `HarnessPredicate` that can be used to search for a `MatInputHarness` that meets
19+
* certain criteria.
20+
* @param options Options for filtering which input instances are considered a match.
2621
* @return a `HarnessPredicate` configured with the given options.
2722
*/
2823
static with(options: InputHarnessFilters = {}): HarnessPredicate<MatInputHarness> {
2924
return new HarnessPredicate(MatInputHarness, options)
30-
.addOption(
31-
'value', options.value, async (harness, value) => (await harness.getValue()) === value);
25+
.addOption('value', options.value, async (harness, value) => {
26+
return (await harness.getValue()) === value;
27+
})
28+
.addOption('placeholder', options.placeholder, async (harness, placeholder) => {
29+
return (await harness.getPlaceholder()) === placeholder;
30+
});
3231
}
3332

3433
/** Whether the input is disabled. */
@@ -67,7 +66,7 @@ export class MatInputHarness extends MatFormFieldControlHarness {
6766
return (await (await this.host()).getProperty('type'))!;
6867
}
6968

70-
/** Gets the placeholder of the input. / */
69+
/** Gets the placeholder of the input. */
7170
async getPlaceholder(): Promise<string> {
7271
// The "placeholder" property of the native input is never undefined.
7372
return (await (await this.host()).getProperty('placeholder'))!;

src/material-experimental/select/testing/BUILD.bazel renamed to src/material/select/testing/BUILD.bazel

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,19 @@ ts_library(
88
["**/*.ts"],
99
exclude = ["**/*.spec.ts"],
1010
),
11-
module_name = "@angular/material-experimental/select/testing",
11+
module_name = "@angular/material/select/testing",
1212
deps = [
1313
"//src/cdk/coercion",
1414
"//src/cdk/testing",
15-
"//src/material-experimental/form-field/testing/control",
15+
"//src/material/form-field/testing/control",
1616
],
1717
)
1818

19+
filegroup(
20+
name = "source-files",
21+
srcs = glob(["**/*.ts"]),
22+
)
23+
1924
ng_test_library(
2025
name = "harness_tests_lib",
2126
srcs = ["shared.spec.ts"],

0 commit comments

Comments
 (0)