diff --git a/src/material/datepicker/testing/date-range-input-harness-shared.spec.ts b/src/material/datepicker/testing/date-range-input-harness-shared.spec.ts
index 37271052e6c0..6e7227cc1490 100644
--- a/src/material/datepicker/testing/date-range-input-harness-shared.spec.ts
+++ b/src/material/datepicker/testing/date-range-input-harness-shared.spec.ts
@@ -195,6 +195,19 @@ export function runDateRangeInputHarnessTests(
expect(await Promise.all([start.getMax(), end.getMax()])).toEqual(['2020-01-01', '2020-01-01']);
});
+
+ it('should dispatch the dateChange event when the inner input values have changed', async () => {
+ const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'}));
+ const [start, end] = await Promise.all([input.getStartInput(), input.getEndInput()]);
+
+ expect(fixture.componentInstance.startDateChangeCount).toBe(0);
+ expect(fixture.componentInstance.endDateChangeCount).toBe(0);
+
+ await Promise.all([start.setValue('1/1/2020'), end.setValue('2/2/2020')]);
+
+ expect(fixture.componentInstance.startDateChangeCount).toBe(1);
+ expect(fixture.componentInstance.endDateChangeCount).toBe(1);
+ });
}
@Component({
@@ -209,12 +222,14 @@ export function runDateRangeInputHarnessTests(
@@ -237,4 +252,6 @@ class DateRangeInputHarnessTest {
required = false;
subInputsDisabled = false;
subInputsRequired = false;
+ startDateChangeCount = 0;
+ endDateChangeCount = 0;
}
diff --git a/src/material/datepicker/testing/datepicker-input-harness-base.ts b/src/material/datepicker/testing/datepicker-input-harness-base.ts
index 2e171910745d..64431bdd47ed 100644
--- a/src/material/datepicker/testing/datepicker-input-harness-base.ts
+++ b/src/material/datepicker/testing/datepicker-input-harness-base.ts
@@ -59,6 +59,11 @@ export abstract class MatDatepickerInputHarnessBase extends ComponentHarness {
if (newValue) {
await inputEl.sendKeys(newValue);
}
+
+ // @breaking-change 12.0.0 Remove null check once `dispatchEvent` is a required method.
+ if (inputEl.dispatchEvent) {
+ await inputEl.dispatchEvent('change');
+ }
}
/** Gets the placeholder of the input. */
diff --git a/src/material/datepicker/testing/datepicker-input-harness-shared.spec.ts b/src/material/datepicker/testing/datepicker-input-harness-shared.spec.ts
index 4cf29ab69ebd..e8b1088c4553 100644
--- a/src/material/datepicker/testing/datepicker-input-harness-shared.spec.ts
+++ b/src/material/datepicker/testing/datepicker-input-harness-shared.spec.ts
@@ -141,6 +141,14 @@ export function runDatepickerInputHarnessTests(
await input.openCalendar();
expect(await input.getCalendar()).toBeInstanceOf(calendarHarness);
});
+
+ it('should emit the `dateChange` event when the value is changed', async () => {
+ const input = await loader.getHarness(datepickerInputHarness.with({selector: '#basic'}));
+ expect(fixture.componentInstance.dateChangeCount).toBe(0);
+
+ await input.setValue('1/1/2020');
+ expect(fixture.componentInstance.dateChangeCount).toBe(1);
+ });
}
@Component({
@@ -149,6 +157,7 @@ export function runDatepickerInputHarnessTests(
id="basic"
matInput
[matDatepicker]="picker"
+ (dateChange)="dateChangeCount = dateChangeCount + 1"
[(ngModel)]="date"
[min]="minDate"
[max]="maxDate"
@@ -166,4 +175,5 @@ class DatepickerInputHarnessTest {
touchUi = false;
disabled = false;
required = false;
+ dateChangeCount = 0;
}