summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--server/src/main/java/com/vaadin/ui/AbstractDateField.java51
-rw-r--r--server/src/test/java/com/vaadin/ui/DateFieldTestCase.java13
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldBinderCrossValidationTest.java2
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldFaultyInputNotValidTest.java5
4 files changed, 51 insertions, 20 deletions
diff --git a/server/src/main/java/com/vaadin/ui/AbstractDateField.java b/server/src/main/java/com/vaadin/ui/AbstractDateField.java
index c252655e44..9c5d9bb656 100644
--- a/server/src/main/java/com/vaadin/ui/AbstractDateField.java
+++ b/server/src/main/java/com/vaadin/ui/AbstractDateField.java
@@ -297,7 +297,10 @@ public abstract class AbstractDateField<T extends Temporal & TemporalAdjuster &
* validate. If {@code startDate} is set to {@code null}, any value before
* {@code endDate} will be accepted by the range
* <p>
- * Note: Negative, i.e. BC dates are not supported
+ * Note: Negative, i.e. BC dates are not supported.
+ * <p>
+ * Note: It's usually recommended to use only one of the following at the same
+ * time: Range validator with Binder or DateField's setRangeStart check.
*
* @param startDate
* - the allowed range's start date
@@ -359,6 +362,9 @@ public abstract class AbstractDateField<T extends Temporal & TemporalAdjuster &
* date (taking the resolution into account), the component will not
* validate. If {@code endDate} is set to {@code null}, any value after
* {@code startDate} will be accepted by the range.
+ * <p>
+ * Note: It's usually recommended to use only one of the following at the same
+ * time: Range validator with Binder or DateField's setRangeEnd check.
*
* @param endDate
* the allowed range's end date (inclusive, based on the current
@@ -618,27 +624,38 @@ public abstract class AbstractDateField<T extends Temporal & TemporalAdjuster &
*
* @param value
* the new value, may be {@code null}
+ * @throws IllegalArgumentException
+ * if the value is not within range bounds
*/
@Override
public void setValue(T value) {
- currentErrorMessage = null;
- /*
- * First handle special case when the client side component have a date
- * string but value is null (e.g. unparsable date string typed in by the
- * user). No value changes should happen, but we need to do some
- * internal housekeeping.
- */
- if (value == null && !getState(false).parsable) {
+ RangeValidator<T> validator = getRangeValidator();
+ ValidationResult result = validator.apply(value,
+ new ValueContext(this, this));
+
+ if (result.isError()) {
+ throw new IllegalArgumentException(
+ "value is not within acceptable range");
+ } else {
+ currentErrorMessage = null;
/*
- * Side-effects of doSetValue clears possible previous strings and
- * flags about invalid input.
+ * First handle special case when the client side component has a date
+ * string but value is null (e.g. unparsable date string typed in by the
+ * user). No value changes should happen, but we need to do some
+ * internal housekeeping.
*/
- doSetValue(null);
-
- markAsDirty();
- return;
+ if (value == null && !getState(false).parsable) {
+ /*
+ * Side-effects of doSetValue clears possible previous strings and
+ * flags about invalid input.
+ */
+ doSetValue(null);
+
+ markAsDirty();
+ return;
+ }
+ super.setValue(value);
}
- super.setValue(value);
}
/**
@@ -785,8 +802,8 @@ public abstract class AbstractDateField<T extends Temporal & TemporalAdjuster &
@Override
protected void doSetValue(T value) {
- this.value = value;
// Also set the internal dateString
+ this.value = value;
if (value == null) {
value = getEmptyValue();
}
diff --git a/server/src/test/java/com/vaadin/ui/DateFieldTestCase.java b/server/src/test/java/com/vaadin/ui/DateFieldTestCase.java
index f50141df66..026388d623 100644
--- a/server/src/test/java/com/vaadin/ui/DateFieldTestCase.java
+++ b/server/src/test/java/com/vaadin/ui/DateFieldTestCase.java
@@ -10,12 +10,17 @@ import java.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
+import org.junit.Rule;
+import org.junit.rules.ExpectedException;
public class DateFieldTestCase {
private AbstractLocalDateField dateField;
private LocalDate date;
+ @Rule
+ public transient ExpectedException exceptionRule = ExpectedException.none();
+
@Before
public void setup() {
dateField = new AbstractLocalDateField() {
@@ -39,9 +44,11 @@ public class DateFieldTestCase {
@Test
public void belowRangeStartIsNotAcceptedAsValue() {
+ LocalDate currentDate = dateField.getValue();
dateField.setRangeStart(date);
+ exceptionRule.expect(IllegalArgumentException.class);
dateField.setValue(date.minusDays(1));
- assertNotNull(dateField.getComponentError());
+ assertThat(dateField.getValue(), is(currentDate));
}
@Test
@@ -60,8 +67,10 @@ public class DateFieldTestCase {
@Test
public void aboveRangeEndIsNotAcceptedAsValue() {
+ LocalDate currentDate = dateField.getValue();
dateField.setRangeEnd(date);
+ exceptionRule.expect(IllegalArgumentException.class);
dateField.setValue(date.plusDays(1));
- assertNotNull(dateField.getComponentError());
+ assertThat(dateField.getValue(), is(currentDate));
}
}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldBinderCrossValidationTest.java b/uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldBinderCrossValidationTest.java
index efbbf3f999..4a47f3786a 100644
--- a/uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldBinderCrossValidationTest.java
+++ b/uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldBinderCrossValidationTest.java
@@ -30,6 +30,8 @@ public class DateFieldBinderCrossValidationTest extends SingleBrowserTest {
fromFieldText.sendKeys("2019/01/01", Keys.ENTER);
toFieldText.sendKeys("2018/02/02", Keys.ENTER);
+ sleep(200);
+
assertEquals("Error message should contain the information",
EXPECTED_ERROR, label.getText());
diff --git a/uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldFaultyInputNotValidTest.java b/uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldFaultyInputNotValidTest.java
index 3a3b6cd069..87cb115ae5 100644
--- a/uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldFaultyInputNotValidTest.java
+++ b/uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldFaultyInputNotValidTest.java
@@ -6,7 +6,9 @@ import java.time.LocalDate;
import org.junit.Test;
import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
import org.openqa.selenium.interactions.Actions;
+import org.openqa.selenium.WebElement;
import com.vaadin.testbench.elements.ButtonElement;
import com.vaadin.testbench.elements.DateFieldElement;
@@ -46,6 +48,7 @@ public class DateFieldFaultyInputNotValidTest extends SingleBrowserTest {
public void testDateOutOfRange() {
openTestURL();
DateFieldElement dateField = $(DateFieldElement.class).first();
+ WebElement dateFieldText = dateField.findElement(By.tagName("input"));
dateField.setDate(LocalDate.now());
$(ButtonElement.class).first().click();
@@ -53,7 +56,7 @@ public class DateFieldFaultyInputNotValidTest extends SingleBrowserTest {
$(NotificationElement.class).first().getText());
$(NotificationElement.class).first().close();
- dateField.setDate(LocalDate.now().minusDays(7));
+ dateFieldText.sendKeys(LocalDate.now().minusDays(7).toString(), Keys.ENTER);
$(ButtonElement.class).first().click();
assertEquals("Last week should not be ok", "Fail",