1 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 24 public class DataTypesTest extends BridgeTest { 25 26 27 public DataTypesTest(String name) { 28 super(name); 29 } 30 protected static Object [] cases = null; 31 32 33 public void setUp() throws Exception { 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 [] { 44 45 new Object [] {"string", 46 new Object [] {"abcdefg", "ijklm\nopqrstx", null}, 47 new Object [] {}}, 48 new Object [] {"line", 49 new Object [] {"abcdefg", new Integer (40), new Float (3.141592), null}, 50 new Object [] {"ijklm\nopqrstx"}}, 51 new Object [] {"field", 52 new Object [] {"xyz", "zyz\nkloink", null} , 53 new Object [] {}}, 54 new Object [] {"zipcode", 55 new Object [] {"7081EA", "7081 ea", null}, 56 new Object [] {"70823b", "xx 7081 EA", "xx\n7081 EA"}}, 57 new Object [] {"pattern", 58 new Object [] {"ababa", "aBB", null}, 59 new Object [] {"c", "abaxbab"}}, 60 new Object [] {"stringrange", 61 new Object [] {"a", "ab", "xyzab", "zzzzz", "zzzzaaaaa", null}, 62 new Object [] {"", "zzzzza", "\na"}}, 63 new Object [] {"stringlength", 64 new Object [] {"a", "0123456789", "123456789\n", "\n123456789", null}, 65 new Object [] {"", "bbbbbbbbbbb", "123456789\n\n"}}, 66 new Object [] {"languages", 67 new Object [] {"nl", "en", null}, 68 new Object [] {"c", "ababab", ""}}, 69 new Object [] {"integer", 70 new Object [] {new Integer (-100), "-1", new Integer (100), "-100", new Float (10.0), "1234", "1234.4", "1e7", null}, 71 new Object [] {new Long (Long.MAX_VALUE), "1e30", "asdfe" 72 }}, 73 new Object [] {"range", 74 new Object [] {new Integer (5), "1", "6.0", new Float (2.0), null}, 75 new Object [] {"-1", "11", "xyz", new Integer (0), new Integer (10)}}, 76 new Object [] {"datetime", 77 new Object [] {new Date(), "2005-01-01", DynamicDate.getInstance("now - 5 year"), null}, 78 new Object [] {"xxx"}}, 79 new Object [] {"period", 80 new Object [] {new Date(), "2005-01-01", "2006-01-01", null}, 81 new Object [] {"1973-03-05", "2050-01-01"}}, 82 new Object [] {"dynamic_period", 83 new Object [] {new Date(), "today + 100 year", null}, 84 new Object [] {"now - 4 day", "today + 101 year"}}, 85 new Object [] {"integer_datetime", 86 new Object [] {new Date(), "2005-01-01", DynamicDate.getInstance("now - 5 year"), new Integer (Integer.MAX_VALUE), null}, 87 new Object [] {"xxx", "2100-01-01", DynamicDate.getInstance("now + 100 year"), new Long (Long.MAX_VALUE)}}, 88 new Object [] {"mmbase_state_enumeration", 89 new Object [] {"ACTIVE", "inactive", "unknown", new Integer (1), "1", null}, 90 new Object [] {"-2", new Long (71221111112L), "bla bla"}}, 91 new Object [] {"enumeration", 92 new Object [] {"2", "4", new Integer (6), null}, 93 new Object [] {"-1", "xxx"}}, 94 new Object [] {"restricted_ordinals", 95 new Object [] {"2", "4", new Integer (6), null}, 96 new Object [] {"1", "21", new Integer (10)}}, 97 new Object [] {"float", 98 new Object [] {"2", "4", new Integer (6), null, new Double (1.0), "1.0", "1e20", null}, 99 new Object [] {new Double (Double.POSITIVE_INFINITY), "bla bla" 100 }}, 101 new Object [] {"handle", 102 new Object [] {new byte[] {4, 3, 2, 1}, getBinary(), null}, 103 new Object [] {new byte[] {1, 2}} 104 }, 105 new Object [] {"boolean", 106 new Object [] {Boolean.TRUE, Boolean.FALSE, "true", "false", new Integer (1), new Integer (0), null}, 107 new Object [] {"asjdlkf", "21", "yes", new Integer (10)}}, 108 new Object [] {"yesno", 109 new Object [] {Boolean.TRUE, Boolean.FALSE,"true", "false", new Integer (1), new Integer (0), null}, 110 new Object [] {"asjdlkf", "21", new Integer (10)}}, 111 new Object [] {"integer_boolean", 112 new Object [] {Boolean.TRUE, Boolean.FALSE, "true", "false", new Integer (1), new Integer (0), null}, 113 new Object [] {"asjdlkf", "21", new Integer (10)}}, 114 115 new Object [] {"string_boolean", 116 new Object [] {Boolean.TRUE, Boolean.FALSE, "true", "false", new Integer (1), new Integer (0), null}, 117 new Object [] {"asjdlkf", "21", new Integer (10)}}, 118 new Object [] {"boolean_string", 119 new Object [] {Boolean.TRUE, Boolean.FALSE, "true", "false", null}, 120 new Object [] { "asjdlkf", "21", new Integer (10)}}, 121 new Object [] {"integer_string", 122 new Object [] {"1", "100", new Integer (10), new Integer (-1), "-1" , null}, 123 new Object [] { "asjdlkf"}}, 124 new Object [] {"node", 125 new Object [] {node1, node2, "" + node1.getNumber(), new Integer (node1.getNumber()), new Integer (node2.getNumber()), new Integer (-1), null}, 126 new Object [] {"", "asjdlkf", new Integer (-2), new Integer (-100)}} 127 , 128 new Object [] {"typedef", 129 new Object [] {node1, new Integer (node1.getNumber()), null}, 130 new Object [] {"", "asjdlkf", node3, new Integer (node3.getNumber()), new Integer (-2), new Integer (-100)}} 131 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 err = new StringBuffer (); 160 for (int i = 0; i < cases.length; i++) { 161 Object [] kase = (Object []) cases[i]; 162 Field field = nodeManager.getField((String )kase[0]); 163 Object [] validValues = (Object []) kase[1]; 164 Object [] invalidValues = (Object []) kase[2]; 165 for (int j = 0; j < validValues.length; j++) { 166 field.getDataType().validate(validValues[j]); 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]); 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 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 getDefaultValue(Field field) { 254 Object defaultValue = field.getDataType().getDefaultValue(); 255 if (defaultValue == null && false) { defaultValue = Casting.toType(org.mmbase.core.util.Fields.typeToClass(field.getType()), ""); 257 } 258 return defaultValue; 259 } 260 261 protected boolean sufficientlyEqual(Object value1, Object value2) { 262 if (value1 == null) return value2 == null; 263 if (value1 instanceof Date && value2 instanceof Date) { 264 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 [] kase = (Object []) cases[i]; 276 Field field = nodeManager.getField((String )kase[0]); 277 Object defaultValue = getDefaultValue(field); 278 Object 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 [] kase = (Object []) cases[i]; 292 Field field = nodeManager.getField((String )kase[0]); 293 Object defaultValue = getDefaultValue(field); 294 Object 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 [] kase = (Object []) cases[i]; 306 Field field = nodeManager.getField((String )kase[0]); 307 Object [] validValues = (Object []) 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(); 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 (-1))) ) { 321 assertFalse("field " + field.getName() + " was null, after we set " + validValues[j] + " in it", newNode.isNull(field.getName())); 322 } 323 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 t) { 335 AssertionFailedError fail = new AssertionFailedError("During field " + field + " of " + newNode); 336 fail.initCause(t); 337 throw fail; 338 } 339 } 340 } 341 } 342 343 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 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 |