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