/* * eXist Open Source Native XML Database * Copyright (C) 2001-06 The eXist Project * http://exist-db.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * $Id$ */ package org.exist.numbering; import junit.framework.TestCase; import java.util.Arrays; import java.util.Random; public class DLNTest extends TestCase { public static void main(String[] args) { junit.textui.TestRunner.run(DLNTest.class); } private class TestItem implements Comparable { int id; NodeId dln; public TestItem(int id, DLN dln) { this.id = id; this.dln = dln; } public String toString() { StringBuffer buf = new StringBuffer(); buf.append(id); buf.append(" = "); buf.append(dln.toString()); return buf.toString(); } public int compareTo(Object other) { return dln.compareTo(((TestItem) other).dln); } } private final static int ITEMS_TO_TEST = 10000; public void testSingleId() { long start = System.currentTimeMillis(); System.out.println("------- testSingleId: generating " + ITEMS_TO_TEST + " random ids --------"); Random rand = new Random(); TestItem items[] = new TestItem[ITEMS_TO_TEST]; for (int i = 0; i < ITEMS_TO_TEST; i++) { int next = rand.nextInt(5000000); DLN dln = new DLN(); dln.setLevelId(0, next); items[i] = new TestItem(next, dln); } System.out.println("------ generation took " + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); System.out.println("------ sorting id set ------"); Arrays.sort(items); System.out.println("------ sort took " + (System.currentTimeMillis() - start)); System.out.println("------ testing id set ------"); for (int i = 0; i < ITEMS_TO_TEST; i++) { assertEquals("Item: " + i, items[i].id, ((DLN)items[i].dln).getLevelId(0)); if (i + 1 < ITEMS_TO_TEST) assertTrue(items[i].id <= items[i + 1].id); if (i > 0) assertTrue(items[i].id >= items[i - 1].id); // System.out.println(items[i].toBitString()); } System.out.println("------- testSingleId: PASSED --------"); Runtime rt = Runtime.getRuntime(); System.out.println("Memory: total: " + (rt.totalMemory() / 1024) + "; free: " + (rt.freeMemory() / 1024)); } public void testSort() { long start = System.currentTimeMillis(); System.out.println("------- testSort: generating " + ITEMS_TO_TEST + " random ids --------"); Random rand = new Random(); DLN items[] = new DLN[ITEMS_TO_TEST]; for (int i = 0; i < ITEMS_TO_TEST; i++) { int next = rand.nextInt(5000000); DLN dln = new DLN(); dln.setLevelId(0, next); items[i] = dln; } System.out.println("------ generation took " + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); System.out.println("------ sorting id set ------"); Arrays.sort(items); System.out.println("------ sort took " + (System.currentTimeMillis() - start)); System.out.println("------- testSortId: PASSED --------"); Runtime rt = Runtime.getRuntime(); System.out.println("Memory: total: " + (rt.totalMemory() / 1024) + "; free: " + (rt.freeMemory() / 1024)); } public void testCreate() { System.out.println("------ testCreate ------"); DLN dln = new DLN(); for (int i = 1; i < 500000; i++) { dln.incrementLevelId(); } assertEquals(500000, dln.getLevelId(0)); System.out.println("ID: " + dln.toBitString() + " = " + dln.getLevelId(0)); System.out.println("------- testCreate: PASSED --------"); } public void testLevelIds() { System.out.println("------ testLevelIds ------"); DLN dln = new DLN("1.33.56.2.98.1.27"); System.out.println("ID: " + dln.debug()); assertEquals("1.33.56.2.98.1.27", dln.toString()); dln = new DLN("1.56.4.33.30.11.9.40.3.2"); System.out.println("ID: " + dln.debug()); assertEquals("1.56.4.33.30.11.9.40.3.2", dln.toString()); assertEquals(10, dln.getLevelCount(0)); dln = new DLN("1.8000656.40.3.2"); System.out.println("ID: " + dln.debug()); assertEquals("1.8000656.40.3.2", dln.toString()); assertEquals(5, dln.getLevelCount(0)); dln = new DLN("1.1"); System.out.println("ID: " + dln.debug()); assertEquals("1.1", dln.toString()); assertEquals(2, dln.getLevelCount(0)); dln.incrementLevelId(); System.out.println("ID after increment: " + dln.debug()); assertEquals("1.2", dln.toString()); assertEquals(2, dln.getLevelCount(0)); System.out.println(((DLN)dln.getParentId()).toBitString()); assertEquals("1", dln.getParentId().toString()); dln = new DLN("1"); System.out.println("ID: " + dln.debug()); assertEquals("1", dln.toString()); assertEquals(1, dln.getLevelCount(0)); assertSame(NodeId.DOCUMENT_NODE, dln.getParentId()); dln = new DLN("1.72"); System.out.println("ID: " + dln.debug()); assertEquals("1.72", dln.toString()); dln = new DLN("1.7.3/1.34"); System.out.println("ID: " + dln.debug()); assertEquals("1.7.3/1.34", dln.toString()); assertEquals(4, dln.getLevelCount(0)); dln = new DLN("1.7.3.1/34"); System.out.println("ID: " + dln.debug()); assertEquals("1.7.3.1/34", dln.toString()); assertEquals(4, dln.getLevelCount(0)); dln.incrementLevelId(); System.out.println("ID after increment: " + dln.debug()); assertEquals("1.7.3.1/35", dln.toString()); assertEquals(4, dln.getLevelCount(0)); dln = new DLN("1.2.1/2/3"); assertEquals(3, dln.getSubLevelCount(dln.lastLevelOffset())); dln = new DLN("1/2/3"); assertEquals(3, dln.getSubLevelCount(dln.lastLevelOffset())); System.out.println("------- testing DLN.incrementLevelId --------"); int[] id0 = new int[] { 1, 33, 56, 2, 98, 1, 27 }; dln = new DLN(); for (int i = 0; i < id0.length; i++) { if (i > 0) dln.addLevelId(1, false); for (int j = 1; j < id0[i]; j++) dln.incrementLevelId(); System.out.println("ID: " + dln.debug()); } System.out.println("ID: " + dln.debug()); assertEquals("1.33.56.2.98.1.27", dln.toString()); assertEquals(7, dln.getLevelCount(0)); System.out.println("------- testLevelIds: PASSED --------"); } public void testRelations() { System.out.println("------ testLevelRelations ------"); DLN root = new DLN("1.3"); DLN descendant = new DLN("1.3.1"); System.out.println("Testing isDescendant: " + descendant + " -> " + root); assertTrue(descendant.isDescendantOf(root)); System.out.println("Testing isChildOf: " + descendant + " -> " + root); assertTrue(descendant.isChildOf(root)); System.out.println("Testing getParentId: " + descendant + " -> " + root); assertTrue(root.equals(descendant.getParentId())); descendant = new DLN("1.3.2.5.6"); System.out.println("Testing isDescendantOf: " + descendant + " -> " + root); assertTrue(descendant.isDescendantOf(root)); System.out.println("Testing isChildOf: " + descendant + " -> " + root); assertFalse(descendant.isChildOf(root)); System.out.println("Testing isDescendantOrSelf: " + descendant + " -> " + root); assertTrue(descendant.isDescendantOrSelfOf(root)); descendant = new DLN("1.4"); System.out.println("Testing isDescendant: " + descendant + " -> " + root); assertFalse(descendant.isDescendantOf(root)); descendant = new DLN("1.3"); System.out.println("Testing isDescendant: " + descendant + " -> " + root); assertFalse(descendant.isDescendantOf(root)); System.out.println("Testing isDescendantOrSelf: " + descendant + " -> " + root); assertTrue(descendant.isDescendantOrSelfOf(root)); root = new DLN("1.3.2.5.6"); descendant = new DLN("1.3.2.5.6.7777"); System.out.println("Testing isDescendantOf: " + descendant + " -> " + root); assertTrue(descendant.isDescendantOf(root)); System.out.println("Testing isChildOf: " + descendant + " -> " + root); assertTrue(descendant.isChildOf(root)); System.out.println("Testing getParentId: " + descendant + " -> " + root); assertTrue(root.equals(descendant.getParentId())); descendant = new DLN("1.3.2.5.6.7777.1"); System.out.println("Testing isDescendantOf: " + descendant + " -> " + root); assertTrue(descendant.isDescendantOf(root)); System.out.println("Testing isChildOf: " + descendant + " -> " + root); assertFalse(descendant.isChildOf(root)); root = new DLN("1.3.1"); descendant = new DLN("1.3.2"); System.out.println("Testing isDescendantOf: " + descendant + " -> " + root); assertFalse(descendant.isDescendantOf(root)); root = new DLN("1.6.6.66"); descendant = new DLN("1.6.6.65.1"); System.out.println("Testing isChildOf: " + descendant + " -> " + root); assertFalse(descendant.isChildOf(root)); descendant = new DLN("1.6.6.66"); System.out.println("Testing isChildOf: " + descendant + " -> " + root); assertFalse(descendant.isChildOf(root)); root = new DLN("1.3.1/1"); descendant = new DLN("1.3.1/1.1"); System.out.println("Testing isChildOf: " + descendant + " -> " + root); assertTrue(descendant.isChildOf(root)); descendant = (DLN) root.newChild(); assertEquals("1.3.1/1.1", descendant.toString()); descendant.incrementLevelId(); assertEquals("1.3.1/1.2", descendant.toString()); System.out.println("Parent of " + descendant + " -> " + descendant.getParentId()); assertTrue(root.equals(descendant.getParentId())); descendant = new DLN("1.3.1/1.2.2"); System.out.println("Testing isChildOf: " + descendant + " -> " + root); assertFalse(descendant.isChildOf(root)); System.out.println("Testing isDescendantOf: " + descendant + " -> " + root); assertTrue(descendant.isDescendantOf(root)); NodeId left = new DLN("1.3.1"); NodeId dln = new DLN("1.3.1/1"); NodeId right = new DLN("1.3.2"); assertTrue(dln.compareTo(right) < 0); assertTrue(dln.compareTo(left) > 0); assertTrue(left.compareTo(dln) < 0); assertTrue(right.compareTo(dln) > 0); assertTrue(left.compareTo(right) < 0); System.out.println("Testing isSiblingOf ..."); DLN id0 = new DLN("1.1.7"); DLN id1 = new DLN("1.1.6"); DLN id2 = new DLN("1.1.7.1"); DLN id3 = new DLN("1.1.7/1"); assertTrue(id0.isSiblingOf(id1)); assertTrue(id1.isSiblingOf(id0)); assertFalse(id0.isSiblingOf(id2)); assertFalse(id2.isSiblingOf(id0)); assertTrue(id3.isSiblingOf(id0)); assertTrue(id0.isSiblingOf(id3)); System.out.println("------ testLevelRelations: PASSED ------"); } public void testInsertion() { System.out.println("------ testInsertion ------"); DLN left = new DLN("1.1"); DLN right = (DLN) left.insertNode(null); assertEquals("1.2", right.toString()); DLN dln = (DLN) left.insertNode(right); System.out.println(dln); assertEquals("1.1/1", dln.toString()); left = dln; dln = (DLN) left.insertNode(right); System.out.println(dln); assertEquals("1.1/2", dln.toString()); right = dln; dln = (DLN) left.insertNode(right); System.out.println(dln); assertEquals("1.1/1/1", dln.toString()); right = new DLN("1.1/1"); left = new DLN("1.1"); dln = (DLN) left.insertNode(right); System.out.println(dln); assertEquals("1.1/0/35", dln.toString()); right = dln; dln = (DLN) left.insertNode(right); System.out.println(dln); assertEquals("1.1/0/34", dln.toString()); System.out.println("------ testInsertion: PASSED ------"); } }