diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index f3d24876d459f..85d3f57fda964 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -632,12 +632,6 @@ { "name": "cleanUpView" }, - { - "name": "coerceToAsyncValidator" - }, - { - "name": "coerceToValidator" - }, { "name": "collectNativeNodes" }, diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index d89114209186c..322393d2c42a7 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -608,15 +608,9 @@ { "name": "cleanUpView" }, - { - "name": "coerceToAsyncValidator" - }, { "name": "coerceToBoolean" }, - { - "name": "coerceToValidator" - }, { "name": "collectNativeNodes" }, diff --git a/packages/forms/src/model/abstract_model.ts b/packages/forms/src/model/abstract_model.ts index 015cb39ba54b0..5ce5c4aace521 100644 --- a/packages/forms/src/model/abstract_model.ts +++ b/packages/forms/src/model/abstract_model.ts @@ -372,7 +372,7 @@ export abstract class AbstractControl { expect(c.valid).toEqual(true); }); + it('should not mutate the validators array when overriding using setValidators', () => { + const control = new FormControl(''); + const originalValidators = [Validators.required]; + + control.setValidators(originalValidators); + control.addValidators(Validators.minLength(10)); + + expect(originalValidators.length).toBe(1); + }); + it('should override validators by setting `control.validator` field value', () => { const c = new FormControl(''); expect(c.valid).toEqual(true); @@ -357,6 +367,30 @@ describe('FormControl', () => { expect(c.hasValidator(Validators.required)).toEqual(false); }); + it('should not mutate the validators array when adding/removing sync validators', () => { + const originalValidators = [Validators.required]; + const control = new FormControl('', originalValidators); + + control.addValidators(Validators.min(10)); + expect(originalValidators.length).toBe(1); + + control.removeValidators(Validators.required); + expect(originalValidators.length).toBe(1); + }); + + it('should not mutate the validators array when adding/removing async validators', () => { + const firstValidator = asyncValidator('one'); + const secondValidator = asyncValidator('two'); + const originalValidators = [firstValidator]; + const control = new FormControl('', null, originalValidators); + + control.addAsyncValidators(secondValidator); + expect(originalValidators.length).toBe(1); + + control.removeAsyncValidators(firstValidator); + expect(originalValidators.length).toBe(1); + }); + it('should return false when checking presence of a validator not identical by reference', () => { const minValidator = Validators.min(5); @@ -518,6 +552,16 @@ describe('FormControl', () => { expect(c.valid).toEqual(true); })); + it('should not mutate the validators array when overriding using setValidators', () => { + const control = new FormControl(''); + const originalValidators = [asyncValidator('one')]; + + control.setAsyncValidators(originalValidators); + control.addAsyncValidators(asyncValidator('two')); + + expect(originalValidators.length).toBe(1); + }); + it('should override validators by setting `control.asyncValidator` field value', fakeAsync(() => { const c = new FormControl('');