diff --git a/src/vaadin-number-field.html b/src/vaadin-number-field.html index 15c73d7d..eba61c09 100644 --- a/src/vaadin-number-field.html +++ b/src/vaadin-number-field.html @@ -303,7 +303,13 @@ } _stepChanged(step) { - this.inputElement.step = step; + if (!this.__stepChangedCalled) { + // Setting the initial value, avoid using it in validation. + this.inputElement.step = 'any'; + this.__stepChangedCalled = true; + } else { + this.inputElement.step = step; + } } _minChanged(min) { diff --git a/test/number-field.html b/test/number-field.html index 90a4262e..c2d7819f 100644 --- a/test/number-field.html +++ b/test/number-field.html @@ -749,6 +749,49 @@ expect(numberField.validate(), 'value should not be greater than max').to.be.false; }); + it('should validate by step when defined by user', () => { + numberField.step = 1.5; + + numberField.value = '0'; + expect(numberField.validate()).to.be.true; + + numberField.value = '-1.5'; + expect(numberField.validate()).to.be.true; + + numberField.value = '3'; + expect(numberField.validate()).to.be.true; + + numberField.value = '-1'; + expect(numberField.validate()).to.be.false; + + numberField.value = '2'; + expect(numberField.validate()).to.be.false; + }); + + it('should use min as step basis in validation when both are defined', () => { + numberField.min = 1; + numberField.step = 1.5; + + numberField.value = '1'; + expect(numberField.validate()).to.be.true; + + numberField.value = '2.5'; + expect(numberField.validate()).to.be.true; + + numberField.value = '4'; + expect(numberField.validate()).to.be.true; + + numberField.value = '1.5'; + expect(numberField.validate()).to.be.false; + }); + + it('should not validate by step when only min and max are set', () => { + numberField.min = 1; + numberField.max = 5; + numberField.value = 1.5; // would be invalid by default step=1 + expect(numberField.validate()).to.be.true; + }); + describe('removing validation constraints', () => { it('should update "invalid" state when "min" is removed', () => { numberField.value = '42';