001 /*
002 * LAPIS lightweight structured text processing system
003 *
004 * Copyright (C) 1998-2002 Carnegie Mellon University,
005 * Copyright (C) 2003 Massachusetts Institute of Technology.
006 * All rights reserved.
007 *
008 * This library is free software; you can redistribute it
009 * and/or modify it under the terms of the GNU General
010 * Public License as published by the Free Software
011 * Foundation, version 2.
012 *
013 * LAPIS homepage: http://graphics.lcs.mit.edu/lapis/
014 */
015 package lapisx.util;
016
017 import junit.framework.*;
018
019 import java.util.Enumeration;
020 import java.util.NoSuchElementException;
021
022 /**
023 * A collection of JUnit testcases to test the History class.
024 */
025 public class HistoryTest extends TestCase {
026
027 protected History h0;
028 protected History h1;
029 protected History h2;
030
031 public HistoryTest (String name) {
032 super(name);
033 }
034
035 protected void setUp () {
036 h0 = new History (0);
037 h1 = new History (1);
038 h2 = new History (2);
039 }
040
041 public static Test suite () {
042 return new TestSuite (HistoryTest.class);
043 }
044
045 /*
046 Tests
047
048 creating history of size 0, 1, n
049 clearing an empty history, a full history
050
051 events
052 */
053 public void testAdd () {
054 h0.add ("1");
055 assertEnum (new String[] {}, h0.elements());
056
057 h1.clear ();
058 h1.add ("1");
059 assertEnum (new String[] {"1"}, h1.elements ());
060
061 h1.add ("2");
062 assertEnum (new String[] {"2"}, h1.elements ());
063
064 h2.clear ();
065 h2.add ("1");
066 h2.add ("2");
067 h2.add ("3");
068 h2.add ("4");
069 assertEnum (new String[] {"3","4"}, h2.elements ());
070 }
071
072 public void testClear () {
073 h0.clear ();
074 assertEnum (new String[] {}, h0.elements ());
075
076 h2.add ("1");
077 h2.add ("2");
078 h2.clear ();
079 assertEnum (new String[] {}, h2.elements ());
080
081 h2.clear ();
082 assertEnum (new String[] {}, h2.elements ());
083 }
084
085 public void testCopy () {
086 History h0Dup = new History (h0);
087 assertEnum (new String[] {}, h0Dup.elements ());
088
089 h2.clear ();
090 h2.add ("1");
091 h2.add ("2");
092 h2.add ("3");
093 h2.add ("4");
094 History h2Dup = new History (h2);
095 assertEnum (new String[] {"3","4"}, h2Dup.elements ());
096 }
097
098 public void testPut () {
099 h1.clear ();
100 h1.add ("1");
101 h1.put ("2");
102 assertEnum (new String[] {"2"}, h1.elements ());
103
104 h2.clear ();
105 h2.add ("1");
106 h2.put ("2");
107 assertEnum (new String[] {"1","2"}, h2.elements ());
108 h2.put ("3");
109 assertEnum (new String[] {"2","3"}, h2.elements ());
110 h2.put ("4");
111 assertEnum (new String[] {"3","4"}, h2.elements ());
112 }
113
114 public void testForwardAndBack () {
115 assertNull (h0.get ());
116 assertNull (h0.peekForward ());
117 assertFalse (h0.canForward ());
118 assertNull (h0.peekBack ());
119 assertFalse (h0.canBack ());
120 assertEnum (new Object[] {}, h0.elements ());
121 assertEnum (new Object[] {}, h0.forwardElements ());
122 assertEnum (new Object[] {}, h0.backElements ());
123
124 h2.clear ();
125 assertNull (h2.get ());
126 assertNull (h2.peekForward ());
127 assertFalse (h2.canForward ());
128 assertNull (h2.peekBack ());
129 assertFalse (h2.canBack ());
130 assertEnum (new Object[] {}, h2.elements ());
131 assertEnum (new Object[] {}, h2.forwardElements ());
132 assertEnum (new Object[] {}, h2.backElements ());
133
134 h2.add ("1");
135 assertEquals ("1", h2.get ());
136 assertNull (h2.peekForward ());
137 assertFalse (h2.canForward ());
138 assertNull (h2.peekBack ());
139 assertFalse (h2.canBack ());
140 assertEnum (new Object[] {"1"}, h2.elements ());
141 assertEnum (new Object[] {}, h2.forwardElements ());
142 assertEnum (new Object[] {}, h2.backElements ());
143
144 h2.add ("2");
145 assertEquals ("2", h2.get ());
146 assertEquals ("1", h2.peekBack ());
147 assertTrue (h2.canBack ());
148 assertNull (h2.peekForward ());
149 assertFalse (h2.canForward ());
150 assertEnum (new Object[] {"1", "2"}, h2.elements ());
151 assertEnum (new Object[] {}, h2.forwardElements ());
152 assertEnum (new Object[] {"1"}, h2.backElements ());
153
154 assertEquals ("1", h2.back ());
155 assertEquals ("1", h2.get ());
156 assertNull (h2.peekBack ());
157 assertFalse (h2.canBack ());
158 assertEquals ("2", h2.peekForward ());
159 assertTrue (h2.canForward ());
160 assertEnum (new Object[] {"1", "2"}, h2.elements ());
161 assertEnum (new Object[] {"2"}, h2.forwardElements ());
162 assertEnum (new Object[] {}, h2.backElements ());
163
164 h2.add ("3");
165 assertEquals ("3", h2.get ());
166 assertEquals ("2", h2.peekBack ());
167 assertNull (h2.peekForward ());
168 assertEnum (new Object[] {"2","3"}, h2.elements ());
169 assertEnum (new Object[] {}, h2.forwardElements ());
170 assertEnum (new Object[] {"2"}, h2.backElements ());
171
172 assertEquals ("2", h2.back ());
173 assertNull (h2.back ());
174 assertEquals ("2", h2.get ());
175 assertEnum (new Object[] {"2","3"}, h2.elements ());
176 assertEnum (new Object[] {"3"}, h2.forwardElements ());
177 assertEnum (new Object[] {}, h2.backElements ());
178
179 assertEquals ("3", h2.forward ());
180 assertNull (h2.forward ());
181 assertEquals ("3", h2.get ());
182 assertEnum (new Object[] {"2","3"}, h2.elements ());
183 assertEnum (new Object[] {}, h2.forwardElements ());
184 assertEnum (new Object[] {"2"}, h2.backElements ());
185 }
186
187 public void testReplace () {
188 h2.clear ();
189 h2.replace ("1");
190 assertEnum (new String[] {"1"}, h2.elements ());
191
192 h2.replace ("2");
193 assertEnum (new String[] {"2"}, h2.elements ());
194
195 h2.add ("3");
196 h2.replace ("4");
197 assertEnum (new String[] {"2","4"}, h2.elements ());
198
199 h2.back ();
200 h2.replace ("5");
201 assertEnum (new String[] {"5","4"}, h2.elements ());
202 }
203
204 public void testToStartAndToEnd () {
205 h2.clear ();
206 assertNull (h2.toStart ());
207 assertNull (h2.toEnd ());
208
209 h2.add ("1");
210 h2.add ("2");
211 h2.add ("3");
212
213 h2.toStart ();
214 assertEquals ("2", h2.get ());
215
216 h2.toEnd ();
217 assertEquals ("3", h2.get ());
218 }
219
220 public void testSize () {
221 assertTrue (h0.isEmpty ());
222 assertTrue (h0.isFull ());
223 assertEquals (0, h0.size ());
224
225 h1.clear ();
226 assertTrue (h1.isEmpty ());
227 assertFalse (h1.isFull ());
228 assertEquals (0, h1.size ());
229
230 h1.add ("1");
231 assertFalse (h1.isEmpty ());
232 assertTrue (h1.isFull ());
233 assertEquals (1, h1.size ());
234
235 h2.clear ();
236 h2.add ("1");
237 assertFalse (h2.isEmpty ());
238 assertFalse (h2.isFull ());
239 assertEquals (1, h2.size ());
240
241 h2.add ("2");
242 assertFalse (h2.isEmpty ());
243 assertTrue (h2.isFull ());
244 assertEquals (2, h2.size ());
245
246 h2.add ("3");
247 assertFalse (h2.isEmpty ());
248 assertTrue (h2.isFull ());
249 assertEquals (2, h2.size ());
250 }
251
252 public void testContains () {
253 assertFalse (h0.contains ("1"));
254
255 h1.add ("1");
256 assertTrue (h1.contains ("1"));
257
258 h2.clear ();
259 h2.add ("1");
260 h2.add ("2");
261 h2.add ("3");
262 assertFalse (h2.contains ("1"));
263 assertTrue (h2.contains ("2"));
264 assertTrue (h2.contains ("3"));
265
266 h2.clear ();
267 assertFalse (h2.contains ("2"));
268 assertFalse (h2.contains ("3"));
269 }
270
271 public void testExpand () {
272 History h0 = new History (0);
273 History h2 = new History (2);
274
275 // expand shouldn't affect h0
276 h0.expand ();
277 h0.add ("1");
278 assertEnum (new String[]{}, h0.elements ());
279
280 // but it should double h2
281 h2.add ("1");
282 h2.add ("2");
283 h2.add ("3");
284 assertEnum (new String[]{"2","3"}, h2.elements ());
285 h2.expand ();
286 assertEnum (new String[]{"2","3"}, h2.elements ());
287 h2.add ("4");
288 h2.add ("5");
289 h2.add ("6");
290 assertEnum (new String[]{"3","4","5","6"}, h2.elements ());
291
292 // double h2 again
293 h2.clear ();
294 h2.expand ();
295 h2.add ("1");
296 h2.add ("2");
297 h2.add ("3");
298 h2.add ("4");
299 h2.add ("5");
300 h2.add ("6");
301 h2.add ("7");
302 h2.add ("8");
303 h2.add ("9");
304 assertEnum (new String[]{"2","3","4","5","6","7","8","9"}, h2.elements ());
305 }
306
307 public void testJumpTo () {
308 try {
309 h0.jumpTo ("a");
310 fail ("didn't throw exception");
311 } catch (NoSuchElementException e) {}
312
313 h1.clear ();
314 try {
315 h1.jumpTo ("a");
316 fail ("didn't throw exception");
317 } catch (NoSuchElementException e) {}
318
319 h2.clear ();
320 h2.add ("a");
321 h2.add ("b");
322 h2.jumpTo ("a");
323 assertEquals ("a", h2.get ());
324
325 h2.add ("c");
326 try {
327 h2.jumpTo ("a");
328 fail ("didn't throw exception");
329 } catch (NoSuchElementException e) {}
330
331 h2.jumpTo ("c");
332 assertEquals ("c", h2.get ());
333 }
334
335 /**
336 * Compare an enumeration with an expected sequence of objects.
337 */
338 private void assertEnum (Object[] expected, Enumeration actual) {
339 int i = 0;
340 while (actual.hasMoreElements ()) {
341 assertTrue (i < expected.length);
342 assertEquals (expected[i], actual.nextElement ());
343 ++i;
344 }
345 assertTrue (i == expected.length);
346 }
347 }
348