001: /**
002: * JDBM LICENSE v1.00
003: *
004: * Redistribution and use of this software and associated documentation
005: * ("Software"), with or without modification, are permitted provided
006: * that the following conditions are met:
007: *
008: * 1. Redistributions of source code must retain copyright
009: * statements and notices. Redistributions must also contain a
010: * copy of this document.
011: *
012: * 2. Redistributions in binary form must reproduce the
013: * above copyright notice, this list of conditions and the
014: * following disclaimer in the documentation and/or other
015: * materials provided with the distribution.
016: *
017: * 3. The name "JDBM" must not be used to endorse or promote
018: * products derived from this Software without prior written
019: * permission of Cees de Groot. For written permission,
020: * please contact cg@cdegroot.com.
021: *
022: * 4. Products derived from this Software may not be called "JDBM"
023: * nor may "JDBM" appear in their names without prior written
024: * permission of Cees de Groot.
025: *
026: * 5. Due credit should be given to the JDBM Project
027: * (http://jdbm.sourceforge.net/).
028: *
029: * THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS
030: * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
031: * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
032: * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
033: * CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
034: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
035: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
036: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
037: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
038: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
039: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
040: * OF THE POSSIBILITY OF SUCH DAMAGE.
041: *
042: * Copyright 2000 (C) Cees de Groot. All Rights Reserved.
043: * Contributions are Copyright (C) 2000 by their associated contributors.
044: *
045: */package jdbm.htree;
046:
047: import jdbm.RecordManager;
048: import jdbm.RecordManagerFactory;
049: import jdbm.recman.TestRecordFile;
050: import jdbm.helper.FastIterator;
051: import junit.framework.*;
052: import java.io.IOException;
053: import java.util.Hashtable;
054: import java.util.Properties;
055:
056: /**
057: * This class contains all Unit tests for {@link HashDirectory}.
058: *
059: * @author <a href="mailto:boisvert@intalio.com">Alex Boisvert</a>
060: * @version $Id: TestHashDirectory.java,v 1.2 2003/09/21 15:49:02 boisvert Exp $
061: */
062: public class TestHashDirectory extends TestCase {
063:
064: public TestHashDirectory(String name) {
065: super (name);
066: }
067:
068: public void setUp() {
069: TestRecordFile.deleteTestFile();
070: }
071:
072: public void tearDown() {
073: TestRecordFile.deleteTestFile();
074: }
075:
076: /**
077: * Basic tests
078: */
079: public void testBasics() throws IOException {
080: System.out.println("testBasics");
081:
082: Properties props = new Properties();
083: RecordManager recman = RecordManagerFactory
084: .createRecordManager(TestRecordFile.testFileName, props);
085:
086: HashDirectory dir = new HashDirectory((byte) 0);
087: long recid = recman.insert(dir);
088: dir.setPersistenceContext(recman, recid);
089:
090: dir.put("key", "value");
091: String s = (String) dir.get("key");
092: assertEquals("value", s);
093:
094: recman.close();
095: }
096:
097: /**
098: * Mixed tests
099: */
100: public void testMixed() throws IOException {
101: System.out.println("testMixed");
102:
103: Properties props = new Properties();
104: RecordManager recman = RecordManagerFactory
105: .createRecordManager(TestRecordFile.testFileName, props);
106: HashDirectory dir = new HashDirectory((byte) 0);
107: long recid = recman.insert(dir);
108: dir.setPersistenceContext(recman, recid);
109:
110: Hashtable hash = new Hashtable(); // use to compare results
111:
112: int max = 30; // must be even
113:
114: // insert & check values
115: for (int i = 0; i < max; i++) {
116: dir.put("key" + i, "value" + i);
117: hash.put("key" + i, "value" + i);
118: }
119: recman.commit();
120:
121: for (int i = 0; i < max; i++) {
122: String s = (String) dir.get("key" + i);
123: assertEquals("value" + i, s);
124: }
125: recman.commit();
126:
127: // replace only even values
128: for (int i = 0; i < max; i += 2) {
129: dir.put("key" + i, "value" + (i * 2 + 1));
130: hash.put("key" + i, "value" + (i * 2 + 1));
131: }
132: recman.commit();
133:
134: for (int i = 0; i < max; i++) {
135: if ((i % 2) == 1) {
136: // odd
137: String s = (String) dir.get("key" + i);
138: assertEquals("value" + i, s);
139: } else {
140: // even
141: String s = (String) dir.get("key" + i);
142: assertEquals("value" + (i * 2 + 1), s);
143: }
144: }
145: recman.commit();
146:
147: // remove odd numbers
148: for (int i = 1; i < max; i += 2) {
149: dir.remove("key" + i);
150: hash.remove("key" + i);
151: }
152: recman.commit();
153:
154: for (int i = 0; i < max; i++) {
155: if ((i % 2) == 1) {
156: // odd
157: String s = (String) dir.get("key" + i);
158: assertEquals(null, s);
159: } else {
160: // even
161: String s = (String) dir.get("key" + i);
162: assertEquals("value" + (i * 2 + 1), s);
163: }
164: }
165: recman.commit();
166:
167: recman.close();
168: recman = null;
169: }
170:
171: void checkEnumerations(Hashtable hash, HashDirectory dir)
172: throws IOException {
173: // enumeration test
174:
175: FastIterator iter;
176: Hashtable clone;
177: int count;
178:
179: // test keys
180: clone = (Hashtable) hash.clone();
181: count = 0;
182: iter = dir.keys();
183: String s = (String) iter.next();
184: while (s != null) {
185: count++;
186: clone.remove(s);
187: s = (String) iter.next();
188: }
189: assertEquals(hash.size(), count);
190:
191: // test values
192: clone = (Hashtable) hash.clone();
193: count = 0;
194: iter = dir.values();
195: s = (String) iter.next();
196: while (s != null) {
197: count++;
198: clone.remove(s);
199: s = (String) iter.next();
200: }
201: assertEquals(hash.size(), count);
202: }
203:
204: /**
205: * Runs all tests in this class
206: */
207: public static void main(String[] args) {
208: junit.textui.TestRunner.run(new TestSuite(
209: TestHashDirectory.class));
210: }
211:
212: }
|