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';