KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > bridge > DataTypesTest


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10
11 package org.mmbase.bridge;
12
13 import org.mmbase.datatypes.*;
14 import java.util.*;
15 import org.mmbase.util.*;
16 import org.mmbase.tests.*;
17 import junit.framework.*;
18
19 /**
20  *
21  * @author Michiel Meeuwissen
22  * @since MMBase-1.8
23  */

24 public class DataTypesTest extends BridgeTest {
25
26
27     public DataTypesTest(String JavaDoc name) {
28         super(name);
29     }
30     protected static Object JavaDoc[] cases = null;
31
32
33     public void setUp() throws Exception JavaDoc {
34         if (cases == null) {
35             Cloud cloud = getCloud();
36             Node node1 = cloud.getNodeManager("datatypes");
37             NodeManager object = cloud.getNodeManager("object");
38             Node node2 = object.getList(object.createQuery()).getNode(0);
39             NodeManager aa = cloud.getNodeManager("aa");
40             Node node3 = aa.createNode();
41             commit(node3);
42
43             cases = new Object JavaDoc[] {
44                 /* {field {valid values} {invalid values}} */
45                 new Object JavaDoc[] {"string",
46                               new Object JavaDoc[] {"abcdefg", "ijklm\nopqrstx", null},
47                               new Object JavaDoc[] {}},
48                 new Object JavaDoc[] {"line",
49                               new Object JavaDoc[] {"abcdefg", new Integer JavaDoc(40), new Float JavaDoc(3.141592), null},
50                               new Object JavaDoc[] {"ijklm\nopqrstx"}},
51                 new Object JavaDoc[] {"field",
52                               new Object JavaDoc[] {"xyz", "zyz\nkloink", null} ,
53                               new Object JavaDoc[] {}},
54                 new Object JavaDoc[] {"zipcode",
55                               new Object JavaDoc[] {"7081EA", "7081 ea", null},
56                               new Object JavaDoc[] {"70823b", "xx 7081 EA", "xx\n7081 EA"}},
57                 new Object JavaDoc[] {"pattern",
58                               new Object JavaDoc[] {"ababa", "aBB", null},
59                               new Object JavaDoc[] {"c", "abaxbab"}},
60                 new Object JavaDoc[] {"stringrange",
61                               new Object JavaDoc[] {"a", "ab", "xyzab", "zzzzz", "zzzzaaaaa", null},
62                               new Object JavaDoc[] {"", "zzzzza", "\na"}},
63                 new Object JavaDoc[] {"stringlength",
64                               new Object JavaDoc[] {"a", "0123456789", "123456789\n", "\n123456789", null},
65                               new Object JavaDoc[] {"", "bbbbbbbbbbb", "123456789\n\n"}},
66                 new Object JavaDoc[] {"languages",
67                               new Object JavaDoc[] {"nl", "en", null},
68                               new Object JavaDoc[] {"c", "ababab", ""}},
69                 new Object JavaDoc[] {"integer",
70                               new Object JavaDoc[] {new Integer JavaDoc(-100), "-1", new Integer JavaDoc(100), "-100", new Float JavaDoc(10.0), "1234", "1234.4", "1e7", null},
71                               new Object JavaDoc[] {new Long JavaDoc(Long.MAX_VALUE), "1e30", "asdfe"
72                               }},
73                 new Object JavaDoc[] {"range",
74                               new Object JavaDoc[] {new Integer JavaDoc(5), "1", "6.0", new Float JavaDoc(2.0), null},
75                               new Object JavaDoc[] {"-1", "11", "xyz", new Integer JavaDoc(0), new Integer JavaDoc(10)}},
76                 new Object JavaDoc[] {"datetime",
77                               new Object JavaDoc[] {new Date(), "2005-01-01", DynamicDate.getInstance("now - 5 year"), null},
78                               new Object JavaDoc[] {"xxx"}},
79                 new Object JavaDoc[] {"period",
80                               new Object JavaDoc[] {new Date(), "2005-01-01", "2006-01-01", null},
81                               new Object JavaDoc[] {"1973-03-05", "2050-01-01"}},
82                 new Object JavaDoc[] {"dynamic_period",
83                               new Object JavaDoc[] {new Date(), "today + 100 year", null},
84                               new Object JavaDoc[] {"now - 4 day", "today + 101 year"}},
85                 new Object JavaDoc[] {"integer_datetime",
86                               new Object JavaDoc[] {new Date(), "2005-01-01", DynamicDate.getInstance("now - 5 year"), new Integer JavaDoc(Integer.MAX_VALUE), null},
87                               new Object JavaDoc[] {"xxx", "2100-01-01", DynamicDate.getInstance("now + 100 year"), new Long JavaDoc(Long.MAX_VALUE)}},
88                 new Object JavaDoc[] {"mmbase_state_enumeration",
89                               new Object JavaDoc[] {"ACTIVE", "inactive", "unknown", new Integer JavaDoc(1), "1", null},
90                               new Object JavaDoc[] {"-2", new Long JavaDoc(71221111112L), "bla bla"}},
91                 new Object JavaDoc[] {"enumeration",
92                               new Object JavaDoc[] {"2", "4", new Integer JavaDoc(6), null},
93                               new Object JavaDoc[] {"-1", "xxx"}},
94                 new Object JavaDoc[] {"restricted_ordinals",
95                               new Object JavaDoc[] {"2", "4", new Integer JavaDoc(6), null},
96                               new Object JavaDoc[] {"1", "21", new Integer JavaDoc(10)}},
97                 new Object JavaDoc[] {"float",
98                               new Object JavaDoc[] {"2", "4", new Integer JavaDoc(6), null, new Double JavaDoc(1.0), "1.0", "1e20", null},
99                               new Object JavaDoc[] {new Double JavaDoc(Double.POSITIVE_INFINITY), "bla bla"
100                               }},
101                 new Object JavaDoc[] {"handle",
102                               new Object JavaDoc[] {new byte[] {4, 3, 2, 1}, getBinary(), null},
103                               new Object JavaDoc[] {new byte[] {1, 2}}
104                 },
105                 new Object JavaDoc[] {"boolean",
106                               new Object JavaDoc[] {Boolean.TRUE, Boolean.FALSE, "true", "false", new Integer JavaDoc(1), new Integer JavaDoc(0), null},
107                               new Object JavaDoc[] {"asjdlkf", "21", "yes", new Integer JavaDoc(10)}},
108                 new Object JavaDoc[] {"yesno",
109                               new Object JavaDoc[] {Boolean.TRUE, Boolean.FALSE,"true", "false", new Integer JavaDoc(1), new Integer JavaDoc(0), null},
110                               new Object JavaDoc[] {"asjdlkf", "21", new Integer JavaDoc(10)}},
111                 new Object JavaDoc[] {"integer_boolean",
112                               new Object JavaDoc[] {Boolean.TRUE, Boolean.FALSE, "true", "false", new Integer JavaDoc(1), new Integer JavaDoc(0), null},
113                               new Object JavaDoc[] {"asjdlkf", "21", new Integer JavaDoc(10)}},
114
115                 new Object JavaDoc[] {"string_boolean",
116                               new Object JavaDoc[] {Boolean.TRUE, Boolean.FALSE, "true", "false", new Integer JavaDoc(1), new Integer JavaDoc(0), null},
117                               new Object JavaDoc[] {"asjdlkf", "21", new Integer JavaDoc(10)}},
118                 new Object JavaDoc[] {"boolean_string",
119                               new Object JavaDoc[] {Boolean.TRUE, Boolean.FALSE, "true", "false", null},
120                               new Object JavaDoc[] { "asjdlkf", "21", new Integer JavaDoc(10)}},
121                 new Object JavaDoc[] {"integer_string",
122                               new Object JavaDoc[] {"1", "100", new Integer JavaDoc(10), new Integer JavaDoc(-1), "-1" , null},
123                               new Object JavaDoc[] { "asjdlkf"}},
124                 new Object JavaDoc[] {"node",
125                               new Object JavaDoc[] {node1, node2, "" + node1.getNumber(), new Integer JavaDoc(node1.getNumber()), new Integer JavaDoc(node2.getNumber()), new Integer JavaDoc(-1), null},
126                               new Object JavaDoc[] {"", "asjdlkf", new Integer JavaDoc(-2), new Integer JavaDoc(-100)}}
127                 ,
128                 new Object JavaDoc[] {"typedef",
129                               new Object JavaDoc[] {node1, new Integer JavaDoc(node1.getNumber()), null},
130                               new Object JavaDoc[] {"", "asjdlkf", node3, new Integer JavaDoc(node3.getNumber()), new Integer JavaDoc(-2), new Integer JavaDoc(-100)}}
131                 /*
132                   XML not very well supported yet
133                 new Object[] {"xml",
134                               new Object[] {"<p />", null},
135                               new Object[] {"asjdlkf", new Integer(-1), new Integer(-100), new Float(2.0)}
136                 }
137                 */

138
139             };
140         }
141     }
142
143     protected Node getNewNode() {
144         Cloud cloud = getCloud();
145         NodeManager nodeManager = cloud.getNodeManager("datatypes");
146         return nodeManager.createNode();
147     }
148
149     protected void commit(Node node) {
150         node.commit();
151         if (node.getCloud() instanceof Transaction) {
152             ((Transaction) node.getCloud()).commit();
153         }
154     }
155
156     public void testCheckValid() {
157         Cloud cloud = getCloud();
158         NodeManager nodeManager = cloud.getNodeManager("datatypes");
159         StringBuffer JavaDoc err = new StringBuffer JavaDoc();
160         for (int i = 0; i < cases.length; i++) {
161             Object JavaDoc[] kase = (Object JavaDoc[]) cases[i];
162             Field field = nodeManager.getField((String JavaDoc)kase[0]);
163             Object JavaDoc[] validValues = (Object JavaDoc[]) kase[1];
164             Object JavaDoc[] invalidValues = (Object JavaDoc[]) kase[2];
165             for (int j = 0; j < validValues.length; j++) {
166                 field.getDataType().validate(validValues[j]); // should not give exception
167
Collection errors = field.getDataType().validate(validValues[j], null, field);
168                 if(errors.size() != 0) {
169                     err.append("V Field " + field.getName() + " value '" + (validValues[j] == null ? "" : validValues[j].getClass().getName() + " ") + Casting.toString(validValues[j]) + "' was expected to be valid, but: " + LocalizedString.toStrings(errors, Locale.US) + "\n");
170                 }
171             }
172             for (int j = 0; j < invalidValues.length; j++) {
173                 field.getDataType().validate(invalidValues[j]); // should not give exception
174
if (field.getDataType().validate(invalidValues[j], null, field).size() == 0) {
175                     err.append("I Field " + field.getName() + " value '" + (invalidValues[j] == null ? "" : invalidValues[j].getClass().getName() + " ") + Casting.toString(invalidValues[j]) + "' was expected to be invalid according to datatype " + field.getDataType() + "\n");
176                 }
177
178
179             }
180         }
181         assertTrue(err.toString(), err.length() == 0);
182
183     }
184
185     public void testEnumeration() {
186         Cloud cloud = getCloud();
187         NodeManager nodeManager = cloud.getNodeManager("datatypes");
188         Field field = nodeManager.getField("boolean_string");
189         DataType dt = field.getDataType();
190         LocalizedEntryListFactory fact = dt.getEnumerationFactory();
191         assertTrue(dt instanceof StringDataType);
192         assertEquals(fact.size(), 2);
193         assertEquals("" + fact, "bla", fact.castKey("bla"));
194         assertEquals("true", fact.castKey("true"));
195         assertEquals("21", fact.castKey("21"));
196     }
197     public void testEnumeration2() {
198         Cloud cloud = getCloud();
199         NodeManager nodeManager = cloud.getNodeManager("datatypes");
200         Field field = nodeManager.getField("integer_boolean");
201         DataType dt = field.getDataType();
202         LocalizedEntryListFactory fact = dt.getEnumerationFactory();
203         assertTrue(dt instanceof BooleanDataType);
204         assertEquals(fact.size(), 2);
205         assertEquals("" + fact, "bla", fact.castKey("bla"));
206         assertEquals(Boolean.TRUE, fact.castKey("true"));
207         assertEquals("21", fact.castKey("21"));
208     }
209     public void testEnumeration3() {
210         Cloud cloud = getCloud();
211         NodeManager nodeManager = cloud.getNodeManager("datatypes");
212         Field field = nodeManager.getField("string_boolean");
213         DataType dt = field.getDataType();
214         LocalizedEntryListFactory fact = dt.getEnumerationFactory();
215         assertFalse(fact.isEmpty());
216         assertTrue(dt instanceof BooleanDataType);
217         assertEquals(fact.size(), 2);
218         assertEquals("" + fact, "bla", fact.castKey("bla"));
219         assertEquals(Boolean.TRUE, fact.castKey("true"));
220         assertEquals("21", fact.castKey("21"));
221         assertEquals(Boolean.TRUE, dt.cast("true", null, field));
222         assertEquals(Boolean.FALSE, dt.cast("21", null, field));
223         assertEquals(Boolean.FALSE, dt.cast("bla", null, field));
224     }
225
226     public void testEnumeration4() {
227         Cloud cloud = getCloud();
228         NodeManager nodeManager = cloud.getNodeManager("datatypes");
229         Field field = nodeManager.getField("typedef");
230         DataType dt = field.getDataType();
231         assertNotNull(dt.getEnumerationValues(null, field.getNodeManager().getCloud(), null, field));
232         LocalizedEntryListFactory fact = dt.getEnumerationFactory();
233         assertFalse(fact.isEmpty());
234         assertTrue(dt instanceof NodeDataType);
235         int numberOfTypes = cloud.getList(null, "typedef", null, null, null, null, null, false).size();
236         assertEquals(fact.size(cloud), numberOfTypes);
237         assertEquals(fact.get(null, cloud).size(), numberOfTypes);
238         assertEquals(fact.get(Locale.US, cloud).size(), numberOfTypes);
239         assertEquals(fact.get(new Locale("dk", "CN"), cloud).size(), numberOfTypes);
240         assertEquals(nodeManager, fact.castKey("" + nodeManager.getNumber(), cloud));
241         assertEquals("bla", fact.castKey("bla", cloud));
242         assertEquals(null, fact.castKey(null, cloud));
243         assertEquals("", fact.castKey("", cloud));
244         // I think DataType.cast must really return righ ttype, so if necessary even return null?
245
assertEquals(nodeManager, dt.cast(nodeManager, null, field));
246         assertEquals(null, dt.cast("bla", null, field));
247         assertEquals(null, dt.cast(null, null, field));
248         assertEquals(null, dt.cast("", null, field));
249     }
250
251
252
253     protected Object JavaDoc getDefaultValue(Field field) {
254        Object JavaDoc defaultValue = field.getDataType().getDefaultValue();
255        if (defaultValue == null && false) { // && field.isNotNull(),, cannot be checked through bridge. The 'datatypes' builder only has nullable fields.
256
defaultValue = Casting.toType(org.mmbase.core.util.Fields.typeToClass(field.getType()), "");
257        }
258        return defaultValue;
259     }
260
261     protected boolean sufficientlyEqual(Object JavaDoc value1, Object JavaDoc value2) {
262         if (value1 == null) return value2 == null;
263         if (value1 instanceof Date && value2 instanceof Date) {
264             // for dynamic dates.
265
return Math.abs(((Date) value1).getTime() - ((Date) value2).getTime()) < 10000L;
266         } else {
267             return value1.equals(value2);
268         }
269     }
270
271     public void testDefaultValuesUncommited() {
272         Node newNode = getNewNode();
273         NodeManager nodeManager = newNode.getNodeManager();
274         for (int i = 0; i < cases.length; i++) {
275             Object JavaDoc[] kase = (Object JavaDoc[]) cases[i];
276             Field field = nodeManager.getField((String JavaDoc)kase[0]);
277             Object JavaDoc defaultValue = getDefaultValue(field);
278             Object JavaDoc value = newNode.getValue(field.getName());
279             assertTrue("default value of uncommitted node is not as expected for field " + field + " " + defaultValue + " != " + value,
280                        sufficientlyEqual(value, defaultValue));
281
282         }
283         commit(newNode);
284
285     }
286     public void testDefaultValuesCommited() {
287         Node newNode = getNewNode();
288         NodeManager nodeManager = newNode.getNodeManager();
289         commit(newNode);
290         for (int i = 0; i < cases.length; i++) {
291             Object JavaDoc[] kase = (Object JavaDoc[]) cases[i];
292             Field field = nodeManager.getField((String JavaDoc)kase[0]);
293             Object JavaDoc defaultValue = getDefaultValue(field);
294             Object JavaDoc value = newNode.getValue(field.getName());
295             assertTrue("default value of committed node is not as expected for field " + field + " " + defaultValue + " != " + value,
296                        sufficientlyEqual(value, defaultValue));
297         }
298     }
299
300
301     public void testValidValuesCommit() {
302         Cloud cloud = getCloud();
303         NodeManager nodeManager = cloud.getNodeManager("datatypes");
304         for (int i = 0; i < cases.length; i++) {
305             Object JavaDoc[] kase = (Object JavaDoc[]) cases[i];
306             Field field = nodeManager.getField((String JavaDoc)kase[0]);
307             Object JavaDoc[] validValues = (Object JavaDoc[]) kase[1];
308             for (int j = 0; j < validValues.length; j++) {
309                 Node newNode = nodeManager.createNode();
310                 try {
311                     newNode.setValue(field.getName(), validValues[j]);
312                     newNode.setValue(field.getName(), null);
313                     newNode.setValue(field.getName(), validValues[j]);
314                     newNode.commit(); // should not give exception
315
if(field.getName().equals("handle") && validValues[j] != null) {
316                         assertFalse("Checksum is null", newNode.isNull("checksum"));
317                     }
318                     if (validValues[j] != null &&
319                         ! (field.getDataType() instanceof NodeDataType && validValues[j].equals(new Integer JavaDoc(-1))) // -1 casts to null for node-fields.
320
) {
321                         assertFalse("field " + field.getName() + " was null, after we set " + validValues[j] + " in it", newNode.isNull(field.getName()));
322                     }
323                     // all fields are nullable in 'datatypes' so, it must be possible to set field back to null.
324
newNode.setValue(field.getName(), null);
325
326                     assertNull(newNode.getValue(field.getName()));
327                     assertTrue(newNode.isNull(field.getName()));
328                     newNode.commit();
329                     assertNull(newNode.getValue(field.getName()));
330                     assertTrue(newNode.isNull(field.getName()));
331                     if(field.getName().equals("handle")) {
332                         assertTrue(newNode.isNull("checksum"));
333                     }
334                 } catch (Throwable JavaDoc t) {
335                     AssertionFailedError fail = new AssertionFailedError("During field " + field + " of " + newNode);
336                     fail.initCause(t);
337                     throw fail;
338                 }
339             }
340         }
341     }
342
343     // Often is _is_ possible to set invalid values, which will be cast to valid values then.
344
// This is perhaps a backwards compatibility issue.
345
// Not really happy with it though.
346
/*
347     public void testInValidValuesCommit() {
348         Cloud cloud = getCloud();
349         NodeManager nodeManager = cloud.getNodeManager("datatypes");
350         StringBuffer errors = new StringBuffer();
351         for (int i = 0; i < cases.length; i++) {
352             Object[] kase = (Object[]) cases[i];
353             Field field = nodeManager.getField((String)kase[0]);
354             Object[] invalidValues = (Object[]) kase[2];
355             for (int j = 0; j < invalidValues.length; j++) {
356                 Node newNode = getNewNode();
357                 try {
358                     newNode.setValue(field.getName(), invalidValues[j]);
359                     commit(newNode);
360                     errors.append("Invalid value " + invalidValues[j] + " should have given exception for " + field + " but evaluated to " + newNode.getValue(field.getName()) + "\n");
361                 } catch (Throwable e) {
362                 }
363             }
364         }
365         assertTrue(errors.toString(), errors.length() == 0);
366     }
367     */

368
369
370     public void testEnumerations() {
371         Node newNode = getNewNode();
372         newNode.setValue("mmbase_state_enumeration", "ERROR");
373         commit(newNode);
374         int value = newNode.getIntValue("mmbase_state_enumeration");
375         assertTrue("ERROR did evaluate to 3 but to " + value, value == 3);
376         newNode = getNewNode();
377         newNode.setStringValue("mmbase_state_enumeration", "ERROR");
378         commit(newNode);
379         value = newNode.getIntValue("mmbase_state_enumeration");
380         assertTrue("ERROR did evaluate to 3 but to " + value, value == 3);
381
382     }
383
384
385     protected byte[] getBinary() {
386         return new byte[] {1, 2, 3, 4};
387     }
388     public void testBinary() {
389         Node newNode = getNewNode();
390         assertTrue("handle is not default null", newNode.getNodeManager().getField("handle").getDataType().getDefaultValue() == null);
391         newNode.setValue("handle", getBinary());
392         commit(newNode);
393         try {
394             Node newNode2 = getNewNode();
395             newNode2.setValue("handle", getBinary());
396             commit(newNode2);
397             fail("There is unique on the 'checksum' of handle, so setting same value for second time should have thrown exception");
398         } catch (Exception JavaDoc e) {
399         }
400     }
401
402     public void testNotNull() {
403         Cloud cloud = getCloud();
404         NodeManager nodeManager = cloud.getNodeManager("datatypes");
405         FieldIterator iterator = nodeManager.getFields(NodeManager.ORDER_EDIT).fieldIterator();
406         while(iterator.hasNext()) {
407             Field field = iterator.nextField();
408             DataType dt = (BasicDataType) field.getDataType().clone();
409             dt.setRequired(true);
410             dt.finish("bla");
411
412             assertTrue(dt.isRequired());
413             assertEquals(dt.getRequiredRestriction().getValue(), Boolean.TRUE);
414             assertFalse(dt.getRequiredRestriction().valid(null, null, null));
415             Collection errors = dt.validate(null);
416             assertTrue("According to " + dt + " null should be invalid, but it was", errors.size() > 0);
417         }
418     }
419
420     public void testIntegerDateTime() {
421         Cloud cloud = getCloud();
422         NodeManager nodeManager = cloud.getNodeManager("datatypes");
423         Field field = nodeManager.getField("integer_datetime");
424         DataType dt = field.getDataType();
425         assertTrue(dt instanceof DateTimeDataType);
426     }
427
428
429 }
430
Popular Tags