package net.sourceforge.pain.db; import junit.framework.*; import java.io.*; import java.util.*; import net.sourceforge.pain.db.data.*; /** * User: fmike Date: Aug 26, 2003 Time: 3:30:29 AM */ public final class CollectionsTest extends TestCase { private PainDB db; public CollectionsTest() { super("CollectionsTest"); } protected void setUp() throws Exception { db = new PainDB(getName() + ".db"); db.ALLOW_PLAIN_WRITE = true; // allow work without transactions db.MANUAL_FLUSH_MODE = true; // commit will not flush (objects stays dirty) } protected void tearDown() throws Exception { if (db != null) { File file = new File(db.getDbFileName()); if (!db.isClosed()) { db.forceClose(); } db = null; file.delete(); } } public void testArrayList1() throws Exception { db.beginTransaction(); AllFieldTypesObject obj1 = new AllFieldTypesObject(db); AllFieldTypesObject obj2 = new AllFieldTypesObject(db); final DbArrayList list = obj1.getARRAY_LIST(); _testList1(list, obj2); db.commitTransaction(); } public void testLinkedList1() throws Exception { db.beginTransaction(); AllFieldTypesObject obj1 = new AllFieldTypesObject(db); AllFieldTypesObject obj2 = new AllFieldTypesObject(db); final DbLinkedList list = obj1.getLINKED_LIST(); _testList1(list, obj2); db.commitTransaction(); } private void _testList1(final List list, AllFieldTypesObject obj2) throws IOException { list.add(obj2); assertTrue(list.contains(obj2)); assertEquals(1, list.size()); assertSame(obj2, list.get(0)); assertEquals(0, list.indexOf(obj2)); db.commitTransaction(); db.beginTransaction(); list.add(obj2); list.add(obj2); list.add(obj2); assertEquals(4, list.size()); int i = 0; for (Iterator it = list.iterator(); it.hasNext(); i++) { assertSame(it.next(), obj2); } assertEquals(4, i); i = 0; for (Iterator it = list.iterator(); it.hasNext(); i++) { assertSame(it.next(), obj2); } assertEquals(4, i); db.commitTransaction(); db.beginTransaction(); obj2.delete(); assertEquals(4, list.size()); assertTrue(list.contains(null)); i = 0; for (Iterator it = list.iterator(); it.hasNext(); i++) { assertNull(it.next()); } assertEquals(4, i); list.clear(); assertTrue(list.isEmpty()); db.rollbackTransaction(); db.beginTransaction(); assertEquals(4, list.size()); i = 0; for (Iterator it = list.iterator(); it.hasNext(); i++) { assertSame(it.next(), obj2); } assertEquals(4, i); } public void testReferenceSet1() throws Exception { db.beginTransaction(); AllFieldTypesObject obj1 = new AllFieldTypesObject(db); AllFieldTypesObject obj2 = new AllFieldTypesObject(db); final DbReferenceSet set = obj1.getREFERENCE_SET(); set.add(obj2); assertEquals(1, set.size()); assertTrue(set.contains(obj2)); assertTrue(set.remove(obj2)); assertTrue(set.isEmpty()); db.commitTransaction(); db.beginTransaction(); set.add(obj2); set.add(obj1); assertEquals(2, set.size()); set.add(obj2); set.add(obj1); assertEquals(2, set.size()); int i = 0; for (Iterator it = set.iterator(); it.hasNext(); i++) { assertNotNull(it.next()); } assertEquals(2, i); obj2.delete(); assertEquals(set.size(), 1); db.commitTransaction(); db.beginTransaction(); assertTrue(set.contains(obj1)); set.clear(); assertTrue(set.isEmpty()); db.commitTransaction(); } public void testIntKeyMap1() throws Exception { db.beginTransaction(); AllFieldTypesObject obj1 = new AllFieldTypesObject(db); AllFieldTypesObject obj2 = new AllFieldTypesObject(db); _testMap1(obj1, obj2, obj1.getINT_KEY_MAP(), new Integer(100), new Integer(200)); db.commitTransaction(); } public void testStringKeyMap1() throws Exception { db.beginTransaction(); AllFieldTypesObject obj1 = new AllFieldTypesObject(db); AllFieldTypesObject obj2 = new AllFieldTypesObject(db); _testMap1(obj1, obj2, obj1.getSTRING_KEY_MAP(), "100", "101"); db.commitTransaction(); } private void _testMap1(AllFieldTypesObject obj1, AllFieldTypesObject obj2, Map map, Object key1, Object key2) throws Exception { map.put(key1, obj2); assertEquals(1, map.size()); assertTrue(map.containsValue(obj2)); assertTrue(map.containsKey(key1)); assertEquals(obj2, map.remove(key1)); assertTrue(map.isEmpty()); db.commitTransaction(); db.beginTransaction(); map.put(key1, obj2); map.put(key2, obj1); assertEquals(2, map.size()); map.put(key1, obj2); map.put(key2, obj1); assertEquals(2, map.size()); int i = 0; for (Iterator it = map.values().iterator(); it.hasNext(); i++) { assertNotNull(it.next()); } assertEquals(2, i); obj2.delete(); assertEquals(map.size(), 1); db.commitTransaction(); db.beginTransaction(); assertTrue(map.containsValue(obj1)); map.clear(); assertTrue(map.isEmpty()); } public void testStringSet1() throws Exception { db.beginTransaction(); AllFieldTypesObject obj1 = new AllFieldTypesObject(db); final DbStringSet set = obj1.getSTRING_SET(); final String str1 = "some string 1"; final String str2 = "some string 2"; set.add(str1); assertEquals(1, set.size()); assertTrue(set.contains(str1)); assertTrue(set.remove(str1)); assertTrue(set.isEmpty()); db.commitTransaction(); db.beginTransaction(); set.add(str1); set.add(str2); assertEquals(2, set.size()); set.add(str1); set.add(str2); assertEquals(2, set.size()); int i = 0; for (Iterator it = set.iterator(); it.hasNext(); i++) { assertNotNull(it.next()); } assertEquals(2, i); db.commitTransaction(); db.beginTransaction(); assertTrue(set.contains(str1)); set.clear(); assertTrue(set.isEmpty()); db.commitTransaction(); } public void testStringSetIterator1() throws Exception { db.beginTransaction(); _testSetIterator1(new AllFieldTypesObject(db).getSTRING_SET(), "v1", "v2", "v3", "v4", "v5"); db.commitTransaction(); } public void testReferenceSetIterator1() throws Exception { db.beginTransaction(); _testSetIterator1(new AllFieldTypesObject(db).getREFERENCE_SET(), new AllFieldTypesObject(db), new AllFieldTypesObject(db), new AllFieldTypesObject(db), new AllFieldTypesObject(db), new AllFieldTypesObject(db)); db.commitTransaction(); } private void _testSetIterator1(Set set, Object v1, Object v2, Object v3, Object v4, Object v5) throws IOException { set.add(v1); set.add(v2); set.add(v3); set.add(v4); set.add(v5); assertEquals(set.size(), 5); db.commitTransaction(); db.beginTransaction(); int i = 0; for (Iterator it = set.iterator(); it.hasNext(); i++) { it.next(); if (i == 1 || i == 2) { it.remove(); } } assertEquals(i, 5); assertEquals(set.size(), 3); db.rollbackTransaction(); db.beginTransaction(); assertEquals(set.size(), 5); } public void testMapInterface1() throws IOException { db.beginTransaction(); AllFieldTypesObject obj = new AllFieldTypesObject(db); Object values[] = new Object[20]; Object[] keys = new Object[values.length]; for (int i = 0; i < values.length; i++) { values[i] = new AllFieldTypesObject(db); keys[i] = "" + i; } _testMapInterface(obj.getSTRING_KEY_MAP(), keys, values); for (int i = 0; i < values.length; i++) { keys[i] = "" + i; values[i] = "value" + i; } _testMapInterface(obj.getSTRING_MAP(), keys, values); for (int i = 0; i < values.length; i++) { values[i] = new AllFieldTypesObject(db); keys[i] = new Integer(i); } _testMapInterface(obj.getINT_KEY_MAP(), keys, values); db.commitTransaction(); } private void _testMapInterface(Map map, Object[] keys, Object[] values) { for (int i = 0; i < keys.length; i++) { map.put(keys[i], values[i]); } assertEquals(map.size(), keys.length); assertFalse(map.isEmpty()); for (int i = 0; i < keys.length; i++) { assertTrue(map.containsKey(keys[i])); assertTrue(map.containsValue(values[i])); assertEquals(map.get(keys[i]), values[i]); assertEquals(map.remove(keys[i]), values[i]); assertEquals(keys.length - 1, map.size()); assertNull(map.put(keys[i], values[i])); assertEquals(keys.length, map.size()); } map.clear(); assertTrue(map.isEmpty()); } public void testIterator1() throws IOException { db.beginTransaction(); // int key map Map intMap1 = new AllFieldTypesObject(db).getINT_KEY_MAP(); Map intMap2 = new AllFieldTypesObject(db).getINT_KEY_MAP(); Map stringKeyMap1 = new AllFieldTypesObject(db).getSTRING_KEY_MAP(); Map stringKeyMap2 = new AllFieldTypesObject(db).getSTRING_KEY_MAP(); List llist = new AllFieldTypesObject(db).getLINKED_LIST(); List alist = new AllFieldTypesObject(db).getARRAY_LIST(); Set refSet = new AllFieldTypesObject(db).getREFERENCE_SET(); Set stringSet = new AllFieldTypesObject(db).getSTRING_SET(); Map stringMap1 = new AllFieldTypesObject(db).getSTRING_MAP(); Map stringMap2 = new AllFieldTypesObject(db).getSTRING_MAP(); for (int i = 0; i < 20; i++) { intMap1.put(new Integer(i), new AllFieldTypesObject(db)); intMap2.put(new Integer(i), new AllFieldTypesObject(db)); stringKeyMap1.put("" + i, new AllFieldTypesObject(db)); stringKeyMap2.put("" + i, new AllFieldTypesObject(db)); stringMap1.put("" + i, "value-" + i); stringMap2.put("" + i, "value+" + i); llist.add(new AllFieldTypesObject(db)); alist.add(new AllFieldTypesObject(db)); refSet.add(new AllFieldTypesObject(db)); stringSet.add("" + i); } _testIterator1(stringKeyMap1.values().iterator()); _testIterator1(stringKeyMap2.keySet().iterator()); _testIterator1(stringMap1.values().iterator()); _testIterator1(stringMap2.keySet().iterator()); _testIterator1(intMap1.values().iterator()); _testIterator1(intMap2.keySet().iterator()); _testIterator1(llist.iterator()); _testIterator1(alist.iterator()); _testIterator1(refSet.iterator()); _testIterator1(stringSet.iterator()); db.commitTransaction(); } private void _testIterator1(Iterator it) { while (it.hasNext()) { assertNotNull(it.next()); it.remove(); } } public void testIterator2() throws IOException { db.beginTransaction(); // int key map Map intMap1 = new AllFieldTypesObject(db).getINT_KEY_MAP(); Map intMap2 = new AllFieldTypesObject(db).getINT_KEY_MAP(); Map stringKeyMap1 = new AllFieldTypesObject(db).getSTRING_KEY_MAP(); Map stringKeyMap2 = new AllFieldTypesObject(db).getSTRING_KEY_MAP(); Map stringMap1 = new AllFieldTypesObject(db).getSTRING_MAP(); Map stringMap2 = new AllFieldTypesObject(db).getSTRING_MAP(); List llist = new AllFieldTypesObject(db).getLINKED_LIST(); List alist = new AllFieldTypesObject(db).getARRAY_LIST(); Set refSet = new AllFieldTypesObject(db).getREFERENCE_SET(); Set stringSet = new AllFieldTypesObject(db).getSTRING_SET(); final int N = 20; for (int i = 0; i < N; i++) { intMap1.put(new Integer(i), new AllFieldTypesObject(db)); intMap2.put(new Integer(i), new AllFieldTypesObject(db)); stringKeyMap1.put("" + i, new AllFieldTypesObject(db)); stringKeyMap2.put("" + i, new AllFieldTypesObject(db)); stringMap1.put("" + i, "value-" + i); stringMap2.put("" + i, "value+" + i); llist.add(new AllFieldTypesObject(db)); alist.add(new AllFieldTypesObject(db)); refSet.add(new AllFieldTypesObject(db)); stringSet.add("" + i); } _testIterator2(stringMap1.values()); _testIterator2(stringMap2.keySet()); _testIterator2(stringKeyMap1.values()); _testIterator2(stringKeyMap2.keySet()); _testIterator2(intMap1.values()); _testIterator2(intMap2.keySet()); _testIterator2(llist); _testIterator2(alist); _testIterator2(refSet); _testIterator2(stringSet); db.commitTransaction(); } private void _testIterator2(Collection c) { int i = 0; while (!c.isEmpty()) { for (Iterator it = c.iterator(); it.hasNext(); i++) { assertNotNull(it.next()); if (i % 3 == 0) { it.remove(); } } } } public void testIteratorBUG1() throws IOException { db.beginTransaction(); Map map = new AllFieldTypesObject(db).getINT_KEY_MAP(); for (int i = 0; i < 7; i++) { map.put(new Integer(i), new AllFieldTypesObject(db)); } int i = 0; for (Iterator it = map.values().iterator(); it.hasNext(); i++) { it.next(); if (i == 0 || i == 3 || i == 4 || i == 6) { it.remove(); } } for (Iterator it = map.values().iterator(); it.hasNext(); i++) { DbObject obj = (DbObject) it.next(); assertFalse(obj.isDeleted()); it.remove(); } assertTrue(map.isEmpty()); db.commitTransaction(); } }