]> source.dussan.org Git - vaadin-framework.git/blob
94ff10926f75697a4cb60e05c1475724e39e20da
[vaadin-framework.git] /
1 package com.vaadin.tests.server.component.abstractfield;
2
3 import java.util.Locale;
4
5 import junit.framework.TestCase;
6
7 import org.junit.Assert;
8 import org.junit.Test;
9
10 import com.vaadin.data.util.MethodProperty;
11 import com.vaadin.data.util.ObjectProperty;
12 import com.vaadin.data.util.converter.Converter;
13 import com.vaadin.data.util.converter.Converter.ConversionException;
14 import com.vaadin.data.util.converter.StringToIntegerConverter;
15 import com.vaadin.server.VaadinSession;
16 import com.vaadin.tests.data.bean.Address;
17 import com.vaadin.tests.data.bean.Country;
18 import com.vaadin.tests.data.bean.Person;
19 import com.vaadin.tests.data.bean.Sex;
20 import com.vaadin.tests.util.AlwaysLockedVaadinSession;
21 import com.vaadin.ui.CheckBox;
22 import com.vaadin.ui.TextField;
23
24 public class AbsFieldValueConversionsTest extends TestCase {
25
26     Person paulaBean = new Person("Paula", "Brilliant", "paula@brilliant.com",
27             34, Sex.FEMALE, new Address("Paula street 1", 12345, "P-town",
28                     Country.FINLAND));
29
30     /**
31      * Java uses a non-breaking space (ascii 160) instead of space when
32      * formatting
33      */
34     private static final char FORMATTED_SPACE = 160;
35
36     public void testWithoutConversion() {
37         TextField tf = new TextField();
38         tf.setPropertyDataSource(new MethodProperty<String>(paulaBean,
39                 "firstName"));
40         assertEquals("Paula", tf.getValue());
41         assertEquals("Paula", tf.getPropertyDataSource().getValue());
42         tf.setValue("abc");
43         assertEquals("abc", tf.getValue());
44         assertEquals("abc", tf.getPropertyDataSource().getValue());
45         assertEquals("abc", paulaBean.getFirstName());
46     }
47
48     public void testNonmodifiedBufferedFieldConversion() {
49         VaadinSession.setCurrent(new AlwaysLockedVaadinSession(null));
50         TextField tf = new TextField("salary");
51         tf.setBuffered(true);
52         tf.setLocale(new Locale("en", "US"));
53         ObjectProperty<Integer> ds = new ObjectProperty<Integer>(123456789);
54         tf.setPropertyDataSource(ds);
55         assertEquals((Integer) 123456789, ds.getValue());
56         assertEquals("123,456,789", tf.getValue());
57         tf.setLocale(new Locale("fi", "FI"));
58         assertEquals((Integer) 123456789, ds.getValue());
59         assertEquals("123" + FORMATTED_SPACE + "456" + FORMATTED_SPACE + "789",
60                 tf.getValue());
61
62     }
63
64     public void testModifiedBufferedFieldConversion() {
65         VaadinSession.setCurrent(new AlwaysLockedVaadinSession(null));
66         TextField tf = new TextField("salary");
67         tf.setBuffered(true);
68         tf.setLocale(new Locale("en", "US"));
69         ObjectProperty<Integer> ds = new ObjectProperty<Integer>(123456789);
70         tf.setPropertyDataSource(ds);
71         assertEquals((Integer) 123456789, ds.getValue());
72         assertEquals("123,456,789", tf.getValue());
73         tf.setValue("123,123");
74         assertEquals((Integer) 123456789, ds.getValue());
75         assertEquals("123,123", tf.getValue());
76
77         tf.setLocale(new Locale("fi", "FI"));
78         assertEquals((Integer) 123456789, ds.getValue());
79         // Value should not be updated when field is buffered
80         assertEquals("123,123", tf.getValue());
81     }
82
83     public void testStringIdentityConversion() {
84         TextField tf = new TextField();
85         tf.setConverter(new Converter<String, String>() {
86
87             @Override
88             public String convertToModel(String value,
89                     Class<? extends String> targetType, Locale locale) {
90                 return value;
91             }
92
93             @Override
94             public String convertToPresentation(String value,
95                     Class<? extends String> targetType, Locale locale) {
96                 return value;
97             }
98
99             @Override
100             public Class<String> getModelType() {
101                 return String.class;
102             }
103
104             @Override
105             public Class<String> getPresentationType() {
106                 return String.class;
107             }
108         });
109         tf.setPropertyDataSource(new MethodProperty<String>(paulaBean,
110                 "firstName"));
111         assertEquals("Paula", tf.getValue());
112         assertEquals("Paula", tf.getPropertyDataSource().getValue());
113         tf.setValue("abc");
114         assertEquals("abc", tf.getValue());
115         assertEquals("abc", tf.getPropertyDataSource().getValue());
116         assertEquals("abc", paulaBean.getFirstName());
117     }
118
119     public void testIntegerStringConversion() {
120         TextField tf = new TextField();
121
122         tf.setConverter(new StringToIntegerConverter());
123         tf.setPropertyDataSource(new MethodProperty<Integer>(paulaBean, "age"));
124         assertEquals(34, tf.getPropertyDataSource().getValue());
125         assertEquals("34", tf.getValue());
126         tf.setValue("12");
127         assertEquals(12, tf.getPropertyDataSource().getValue());
128         assertEquals("12", tf.getValue());
129         tf.getPropertyDataSource().setValue(42);
130         assertEquals(42, tf.getPropertyDataSource().getValue());
131         assertEquals("42", tf.getValue());
132     }
133
134     public void testChangeReadOnlyFieldLocale() {
135         VaadinSession.setCurrent(new AlwaysLockedVaadinSession(null));
136
137         TextField tf = new TextField("salary");
138         tf.setLocale(new Locale("en", "US"));
139         ObjectProperty<Integer> ds = new ObjectProperty<Integer>(123456789);
140         ds.setReadOnly(true);
141         tf.setPropertyDataSource(ds);
142         assertEquals((Integer) 123456789, ds.getValue());
143         assertEquals("123,456,789", tf.getValue());
144         tf.setLocale(new Locale("fi", "FI"));
145         assertEquals((Integer) 123456789, ds.getValue());
146         assertEquals("123" + FORMATTED_SPACE + "456" + FORMATTED_SPACE + "789",
147                 tf.getValue());
148     }
149
150     public void testBooleanNullConversion() {
151         CheckBox cb = new CheckBox();
152         cb.setConverter(new Converter<Boolean, Boolean>() {
153
154             @Override
155             public Boolean convertToModel(Boolean value,
156                     Class<? extends Boolean> targetType, Locale locale) {
157                 // value from a CheckBox should never be null as long as it is
158                 // not set to null (handled by conversion below).
159                 assertNotNull(value);
160                 return value;
161             }
162
163             @Override
164             public Boolean convertToPresentation(Boolean value,
165                     Class<? extends Boolean> targetType, Locale locale) {
166                 // Datamodel -> field
167                 if (value == null) {
168                     return false;
169                 }
170
171                 return value;
172             }
173
174             @Override
175             public Class<Boolean> getModelType() {
176                 return Boolean.class;
177             }
178
179             @Override
180             public Class<Boolean> getPresentationType() {
181                 return Boolean.class;
182             }
183
184         });
185         MethodProperty<Boolean> property = new MethodProperty<Boolean>(
186                 paulaBean, "deceased");
187         cb.setPropertyDataSource(property);
188         assertEquals(Boolean.FALSE, property.getValue());
189         assertEquals(Boolean.FALSE, cb.getValue());
190         Boolean newDmValue = cb.getConverter().convertToPresentation(
191                 cb.getValue(), Boolean.class, new Locale("fi", "FI"));
192         assertEquals(Boolean.FALSE, newDmValue);
193
194         // FIXME: Should be able to set to false here to cause datamodel to be
195         // set to false but the change will not be propagated to the Property
196         // (field value is already false)
197
198         cb.setValue(true);
199         assertEquals(Boolean.TRUE, cb.getValue());
200         assertEquals(Boolean.TRUE, property.getValue());
201
202         cb.setValue(false);
203         assertEquals(Boolean.FALSE, cb.getValue());
204         assertEquals(Boolean.FALSE, property.getValue());
205
206     }
207
208     // Now specific to Integer because StringToNumberConverter has been removed
209     public static class NumberBean {
210         private Integer number;
211
212         public Integer getNumber() {
213             return number;
214         }
215
216         public void setNumber(Integer number) {
217             this.number = number;
218         }
219
220     }
221
222     public void testNumberDoubleConverterChange() {
223         final VaadinSession a = new AlwaysLockedVaadinSession(null);
224         VaadinSession.setCurrent(a);
225         TextField tf = new TextField() {
226             @Override
227             public VaadinSession getSession() {
228                 return a;
229             }
230         };
231         NumberBean nb = new NumberBean();
232         nb.setNumber(490);
233
234         tf.setPropertyDataSource(new MethodProperty<Number>(nb, "number"));
235         assertEquals(490, tf.getPropertyDataSource().getValue());
236         assertEquals("490", tf.getValue());
237
238         Converter c1 = tf.getConverter();
239
240         tf.setPropertyDataSource(new MethodProperty<Number>(nb, "number"));
241         Converter c2 = tf.getConverter();
242         assertTrue(
243                 "StringToInteger converter is ok for integer types and should stay even though property is changed",
244                 c1 == c2);
245         assertEquals(490, tf.getPropertyDataSource().getValue());
246         assertEquals("490", tf.getValue());
247
248     }
249
250     @Test
251     public void testNullConverter() {
252         TextField tf = new TextField("foo");
253         tf.setConverter(new StringToIntegerConverter());
254         tf.setPropertyDataSource(new ObjectProperty<Integer>(12));
255         tf.setConverter((Converter) null);
256         try {
257             Object v = tf.getConvertedValue();
258             System.out.println(v);
259             Assert.fail("Trying to convert String -> Integer should fail when there is no converter");
260         } catch (ConversionException e) {
261             // ok, should happen when there is no converter but conversion is
262             // needed
263         }
264     }
265
266 }