diff options
author | Denis Anisimov <denis@vaadin.com> | 2016-08-26 15:04:05 +0300 |
---|---|---|
committer | Denis Anisimov <denis@vaadin.com> | 2016-10-25 09:12:41 +0300 |
commit | 0decd87411d98cf0d03db35fb6e5d70637ff864c (patch) | |
tree | 80af2fd0a2cd35c8ed613987f70c66c049088d4b /server/src/test | |
parent | eb39bd3df37fe0704c7bf2de95a85a7bf1e627a8 (diff) | |
download | vaadin-framework-0decd87411d98cf0d03db35fb6e5d70637ff864c.tar.gz vaadin-framework-0decd87411d98cf0d03db35fb6e5d70637ff864c.zip |
Binder.bindInstanceFields(Object) method implementation (#47).
Binds class instance fields using reflection using Binder.forField()
Change-Id: I597f3832d112cfa69c73fb185f1564c482e4eb15
Diffstat (limited to 'server/src/test')
-rw-r--r-- | server/src/test/java/com/vaadin/data/BeanBinderInstanceFieldTest.java | 387 | ||||
-rw-r--r-- | server/src/test/java/com/vaadin/tests/data/bean/Person.java | 8 |
2 files changed, 391 insertions, 4 deletions
diff --git a/server/src/test/java/com/vaadin/data/BeanBinderInstanceFieldTest.java b/server/src/test/java/com/vaadin/data/BeanBinderInstanceFieldTest.java new file mode 100644 index 0000000000..37b328f97c --- /dev/null +++ b/server/src/test/java/com/vaadin/data/BeanBinderInstanceFieldTest.java @@ -0,0 +1,387 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.data; + +import java.time.LocalDate; + +import org.junit.Assert; +import org.junit.Test; + +import com.vaadin.annotations.PropertyId; +import com.vaadin.data.util.converter.StringToIntegerConverter; +import com.vaadin.data.validator.StringLengthValidator; +import com.vaadin.tests.data.bean.Person; +import com.vaadin.ui.AbstractField; +import com.vaadin.ui.AbstractTextField; +import com.vaadin.ui.DateField; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.TextField; + +/** + * Unit tests for {@link BeanBinder#bindInstanceFields(Object)} method. + * + * @author Vaadin Ltd + * + */ +public class BeanBinderInstanceFieldTest { + + public static class BindAllFields extends FormLayout { + private TextField firstName; + private DateField birthDate; + } + + public static class BindFieldsUsingAnnotation extends FormLayout { + @PropertyId("firstName") + private TextField nameField; + + @PropertyId("birthDate") + private DateField birthDateField; + } + + public static class BindOnlyOneField extends FormLayout { + private TextField firstName; + private TextField noFieldInPerson; + } + + public static class BindNoHasValueField extends FormLayout { + private String firstName; + } + + public static class BindGenericField extends FormLayout { + private CustomField<String> firstName; + } + + public static class BindGenericWrongTypeParameterField extends FormLayout { + private CustomField<Boolean> firstName; + } + + public static class BindWrongTypeParameterField extends FormLayout { + private IntegerTextField firstName; + } + + public static class BindGeneric<T> extends FormLayout { + private CustomField<T> firstName; + } + + public static class BindRaw extends FormLayout { + private CustomField firstName; + } + + public static class BindAbstract extends FormLayout { + private AbstractTextField firstName; + } + + public static class BindNonInstantiatableType extends FormLayout { + private NoDefaultCtor firstName; + } + + public static class BindComplextHierarchyGenericType extends FormLayout { + private ComplexHierarchy firstName; + } + + public static class NoDefaultCtor extends TextField { + public NoDefaultCtor(int arg) { + } + } + + public static class IntegerTextField extends CustomField<Integer> { + + } + + public static class ComplexHierarchy extends Generic<Long> { + + } + + public static class Generic<T> extends ComplexGeneric<Boolean, String, T> { + + } + + public static class ComplexGeneric<U, V, S> extends CustomField<V> { + + } + + public static class CustomField<T> extends AbstractField<T> { + + private T value; + + @Override + public T getValue() { + return value; + } + + @Override + protected void doSetValue(T value) { + this.value = value; + } + + } + + @Test + public void bindInstanceFields_bindAllFields() { + BindAllFields form = new BindAllFields(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + binder.bindInstanceFields(form); + + Person person = new Person(); + person.setFirstName("foo"); + person.setBirthDate(LocalDate.now()); + + binder.bind(person); + + Assert.assertEquals(person.getFirstName(), form.firstName.getValue()); + Assert.assertEquals(person.getBirthDate(), form.birthDate.getValue()); + + form.firstName.setValue("bar"); + form.birthDate.setValue(person.getBirthDate().plusDays(345)); + + Assert.assertEquals(form.firstName.getValue(), person.getFirstName()); + Assert.assertEquals(form.birthDate.getValue(), person.getBirthDate()); + } + + @Test + public void bindInstanceFields_bindOnlyOneFields() { + BindOnlyOneField form = new BindOnlyOneField(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + binder.bindInstanceFields(form); + + Person person = new Person(); + person.setFirstName("foo"); + + binder.bind(person); + + Assert.assertEquals(person.getFirstName(), form.firstName.getValue()); + + Assert.assertNull(form.noFieldInPerson); + + form.firstName.setValue("bar"); + + Assert.assertEquals(form.firstName.getValue(), person.getFirstName()); + } + + @Test + public void bindInstanceFields_bindNotHasValueField_fieldIsNull() { + BindNoHasValueField form = new BindNoHasValueField(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + binder.bindInstanceFields(form); + + Person person = new Person(); + person.setFirstName("foo"); + + binder.bind(person); + + Assert.assertNull(form.firstName); + } + + @Test + public void bindInstanceFields_genericField() { + BindGenericField form = new BindGenericField(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + binder.bindInstanceFields(form); + + Person person = new Person(); + person.setFirstName("foo"); + + binder.bind(person); + + Assert.assertEquals(person.getFirstName(), form.firstName.getValue()); + + form.firstName.setValue("bar"); + + Assert.assertEquals(form.firstName.getValue(), person.getFirstName()); + } + + @Test(expected = IllegalStateException.class) + public void bindInstanceFields_genericFieldWithWrongTypeParameter() { + BindGenericWrongTypeParameterField form = new BindGenericWrongTypeParameterField(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + binder.bindInstanceFields(form); + } + + @Test(expected = IllegalStateException.class) + public void bindInstanceFields_generic() { + BindGeneric<String> form = new BindGeneric<>(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + binder.bindInstanceFields(form); + } + + @Test(expected = IllegalStateException.class) + public void bindInstanceFields_rawFieldType() { + BindRaw form = new BindRaw(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + binder.bindInstanceFields(form); + } + + @Test(expected = IllegalStateException.class) + public void bindInstanceFields_abstractFieldType() { + BindAbstract form = new BindAbstract(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + binder.bindInstanceFields(form); + } + + @Test(expected = IllegalStateException.class) + public void bindInstanceFields_noInstantiatableFieldType() { + BindNonInstantiatableType form = new BindNonInstantiatableType(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + binder.bindInstanceFields(form); + } + + @Test(expected = IllegalStateException.class) + public void bindInstanceFields_wrongFieldType() { + BindWrongTypeParameterField form = new BindWrongTypeParameterField(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + binder.bindInstanceFields(form); + } + + @Test + public void bindInstanceFields_complexGenericHierarchy() { + BindComplextHierarchyGenericType form = new BindComplextHierarchyGenericType(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + binder.bindInstanceFields(form); + + Person person = new Person(); + person.setFirstName("foo"); + + binder.bind(person); + + Assert.assertEquals(person.getFirstName(), form.firstName.getValue()); + + form.firstName.setValue("bar"); + + Assert.assertEquals(form.firstName.getValue(), person.getFirstName()); + } + + @Test + public void bindInstanceFields_bindNotHasValueField_fieldIsNotReplaced() { + BindNoHasValueField form = new BindNoHasValueField(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + + String name = "foo"; + form.firstName = name; + + binder.bindInstanceFields(form); + + Person person = new Person(); + person.setFirstName("foo"); + + binder.bind(person); + + Assert.assertEquals(name, form.firstName); + } + + @Test + public void bindInstanceFields_bindAllFieldsUsingAnnotations() { + BindFieldsUsingAnnotation form = new BindFieldsUsingAnnotation(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + binder.bindInstanceFields(form); + + Person person = new Person(); + person.setFirstName("foo"); + person.setBirthDate(LocalDate.now()); + + binder.bind(person); + + Assert.assertEquals(person.getFirstName(), form.nameField.getValue()); + Assert.assertEquals(person.getBirthDate(), + form.birthDateField.getValue()); + + form.nameField.setValue("bar"); + form.birthDateField.setValue(person.getBirthDate().plusDays(345)); + + Assert.assertEquals(form.nameField.getValue(), person.getFirstName()); + Assert.assertEquals(form.birthDateField.getValue(), + person.getBirthDate()); + } + + @Test + public void bindInstanceFields_bindNotBoundFieldsOnly_customBindingIsNotReplaced() { + BindAllFields form = new BindAllFields(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + + TextField name = new TextField(); + form.firstName = name; + binder.forField(form.firstName) + .withValidator( + new StringLengthValidator("Name is invalid", 3, 10)) + .bind("firstName"); + + binder.bindInstanceFields(form); + + Person person = new Person(); + String personName = "foo"; + person.setFirstName(personName); + person.setBirthDate(LocalDate.now()); + + binder.bind(person); + + Assert.assertEquals(person.getFirstName(), form.firstName.getValue()); + Assert.assertEquals(person.getBirthDate(), form.birthDate.getValue()); + // the instance is not overridden + Assert.assertEquals(name, form.firstName); + + form.firstName.setValue("aa"); + form.birthDate.setValue(person.getBirthDate().plusDays(345)); + + Assert.assertEquals(personName, person.getFirstName()); + Assert.assertEquals(form.birthDate.getValue(), person.getBirthDate()); + + Assert.assertFalse(binder.validate().isOk()); + } + + @Test + public void bindInstanceFields_fieldsAreConfigured_customBindingIsNotReplaced() { + BindOnlyOneField form = new BindOnlyOneField(); + BeanBinder<Person> binder = new BeanBinder<>(Person.class); + + TextField name = new TextField(); + form.firstName = name; + binder.forField(form.firstName) + .withValidator( + new StringLengthValidator("Name is invalid", 3, 10)) + .bind("firstName"); + TextField ageField = new TextField(); + form.noFieldInPerson = ageField; + binder.forField(form.noFieldInPerson) + .withConverter(new StringToIntegerConverter("")) + .bind(Person::getAge, Person::setAge); + + binder.bindInstanceFields(form); + + Person person = new Person(); + String personName = "foo"; + int age = 11; + person.setFirstName(personName); + person.setAge(age); + + binder.bind(person); + + Assert.assertEquals(person.getFirstName(), form.firstName.getValue()); + Assert.assertEquals(String.valueOf(person.getAge()), + form.noFieldInPerson.getValue()); + // the instances are not overridden + Assert.assertEquals(name, form.firstName); + Assert.assertEquals(ageField, form.noFieldInPerson); + + form.firstName.setValue("aa"); + age = age + 56; + form.noFieldInPerson.setValue(String.valueOf(age)); + + Assert.assertEquals(personName, person.getFirstName()); + Assert.assertEquals(form.noFieldInPerson.getValue(), + String.valueOf(person.getAge())); + + Assert.assertFalse(binder.validate().isOk()); + } +} diff --git a/server/src/test/java/com/vaadin/tests/data/bean/Person.java b/server/src/test/java/com/vaadin/tests/data/bean/Person.java index 00d28a1cd8..861006318f 100644 --- a/server/src/test/java/com/vaadin/tests/data/bean/Person.java +++ b/server/src/test/java/com/vaadin/tests/data/bean/Person.java @@ -1,7 +1,7 @@ package com.vaadin.tests.data.bean; import java.math.BigDecimal; -import java.util.Date; +import java.time.LocalDate; public class Person { private String firstName; @@ -11,7 +11,7 @@ public class Person { private Sex sex; private Address address; private boolean deceased; - private Date birthDate; + private LocalDate birthDate; private Integer salary; // null if unknown private Double salaryDouble; // null if unknown @@ -122,11 +122,11 @@ public class Person { this.salaryDouble = salaryDouble; } - public Date getBirthDate() { + public LocalDate getBirthDate() { return birthDate; } - public void setBirthDate(Date birthDate) { + public void setBirthDate(LocalDate birthDate) { this.birthDate = birthDate; } |