1   /*
2    *   Licensed to the Apache Software Foundation (ASF) under one
3    *   or more contributor license agreements.  See the NOTICE file
4    *   distributed with this work for additional information
5    *   regarding copyright ownership.  The ASF licenses this file
6    *   to you under the Apache License, Version 2.0 (the
7    *   "License"); you may not use this file except in compliance
8    *   with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   *   Unless required by applicable law or agreed to in writing,
13   *   software distributed under the License is distributed on an
14   *   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *   KIND, either express or implied.  See the License for the
16   *   specific language governing permissions and limitations
17   *   under the License.
18   *
19   */
20  package org.apache.directory.server.core.avltree;
21  
22  
23  import static org.junit.Assert.*;
24  
25  import java.util.Comparator;
26  
27  import org.apache.directory.server.core.cursor.InvalidCursorPositionException;
28  import org.junit.Test;
29  
30  
31  /**
32   * Tests the AvlTreeCursor class.
33   *
34   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
35   * @version $Rev$, $Date$
36   */
37  public class AvlTreeCursorTest
38  {
39      @Test
40      public void testEmptyCursor() throws Exception
41      {
42          AvlTree<Integer> tree = new AvlTree<Integer>( new IntegerComparator() );
43          AvlTreeCursor<Integer> cursor = new AvlTreeCursor<Integer>( tree );
44          
45          assertFalse( cursor.isClosed() );
46          assertFalse( cursor.available() );
47          assertTrue( cursor.isElementReused() );
48          
49          try
50          {
51              cursor.get();
52              fail( "Should not get here" );
53          }
54          catch ( InvalidCursorPositionException e )
55          {
56              assertNotNull( e );
57          }
58          
59          cursor.beforeFirst();
60          assertFalse( cursor.available() );
61          
62          cursor.afterLast();
63          assertFalse( cursor.available() );
64          
65          assertFalse( cursor.first() );
66          assertFalse( cursor.available() );
67          
68          assertFalse( cursor.last() );
69          assertFalse( cursor.available() );
70          
71          assertFalse( cursor.next() );
72          assertFalse( cursor.available() );
73          
74          assertFalse( cursor.previous() );
75          assertFalse( cursor.available() );
76  
77          cursor.before( 3 );
78          assertFalse( cursor.available() );
79          
80          cursor.after( 3 );
81          assertFalse( cursor.available() );
82          
83          cursor.close();
84          assertTrue( cursor.isClosed() );
85      }
86      
87      
88      @Test
89      public void testOneEntryCursor() throws Exception
90      {
91          AvlTree<Integer> tree = new AvlTree<Integer>( new IntegerComparator() );
92          tree.insert( 7 );
93          AvlTreeCursor<Integer> cursor = new AvlTreeCursor<Integer>( tree );
94          
95          assertFalse( cursor.isClosed() );
96          assertFalse( cursor.available() );
97          assertTrue( cursor.isElementReused() );
98          
99          try
100         {
101             cursor.get();
102             fail( "Should not get here" );
103         }
104         catch ( InvalidCursorPositionException e )
105         {
106             assertNotNull( e );
107         }
108         
109         cursor.beforeFirst();
110         assertFalse( cursor.available() );
111         assertFalse( cursor.previous() );
112         assertTrue( cursor.next() );
113         assertTrue( cursor.available() );
114         assertEquals( 7, ( int ) cursor.get() );
115         
116         cursor.afterLast();
117         assertFalse( cursor.next() );
118         assertFalse( cursor.available() );
119         
120         assertTrue( cursor.first() );
121         assertTrue( cursor.available() );
122         
123         assertTrue( cursor.last() );
124         assertTrue( cursor.available() );
125         
126         assertFalse( cursor.next() );
127         assertFalse( cursor.available() );
128         
129         assertTrue( cursor.previous() );
130         assertTrue( cursor.available() );
131 
132         cursor.before( 3 );
133         assertFalse( cursor.available() );
134         assertTrue( cursor.next() );
135         assertTrue( cursor.available() );
136         assertEquals( 7, ( int ) cursor.get() );
137         
138         cursor.after( 3 );
139         assertFalse( cursor.available() );
140         assertTrue( cursor.next() );
141         assertTrue( cursor.available() );
142         assertEquals( 7, ( int ) cursor.get() );
143 
144         cursor.before( 7 );
145         assertFalse( cursor.available() );
146         assertTrue( cursor.next() );
147         assertTrue( cursor.available() );
148         assertEquals( 7, ( int ) cursor.get() );
149     }
150     
151     
152     @Test
153     public void testManyEntriesCursor() throws Exception
154     {
155         AvlTree<Integer> tree = new AvlTree<Integer>( new IntegerComparator() );
156         tree.insert( 3 );
157         tree.insert( 7 );
158         tree.insert( 10 );
159         tree.insert( 11 );
160         AvlTreeCursor<Integer> cursor = new AvlTreeCursor<Integer>( tree );
161         
162         assertFalse( cursor.isClosed() );
163         assertFalse( cursor.available() );
164         assertTrue( cursor.isElementReused() );
165         assertEquals( 4, tree.getSize() );
166         
167         try
168         {
169             cursor.get();
170             fail( "Should not get here" );
171         }
172         catch ( InvalidCursorPositionException e )
173         {
174             assertNotNull( e );
175         }
176         
177         cursor.beforeFirst();
178         assertFalse( cursor.available() );
179         assertTrue( cursor.next() );
180         assertTrue( cursor.available() );
181         assertEquals( 3, ( int ) cursor.get() );
182         assertTrue( cursor.next() );
183         assertTrue( cursor.available() );
184         assertEquals( 7, ( int ) cursor.get() );
185         assertTrue( cursor.next() );
186         assertTrue( cursor.available() );
187         assertEquals( 10, ( int ) cursor.get() );
188         assertTrue( cursor.next() );
189         assertTrue( cursor.available() );
190         assertEquals( 11, ( int ) cursor.get() );
191         assertFalse( cursor.next() );
192         assertFalse( cursor.available() );
193         
194         
195         cursor.afterLast();
196         assertFalse( cursor.available() );
197         assertTrue( cursor.previous() );
198         assertTrue( cursor.available() );
199         assertEquals( 11, ( int ) cursor.get() );
200         assertTrue( cursor.previous() );
201         assertTrue( cursor.available() );
202         assertEquals( 10, ( int ) cursor.get() );
203         assertTrue( cursor.previous() );
204         assertTrue( cursor.available() );
205         assertEquals( 7, ( int ) cursor.get() );
206         assertTrue( cursor.previous() );
207         assertTrue( cursor.available() );
208         assertEquals( 3, ( int ) cursor.get() );
209         assertFalse( cursor.previous() );
210         assertFalse( cursor.available() );
211         
212         assertTrue( cursor.first() );
213         assertTrue( cursor.available() );
214         
215         assertTrue( cursor.last() );
216         assertTrue( cursor.available() );
217         
218         assertFalse( cursor.next() );
219         assertFalse( cursor.available() );
220         
221         assertTrue( cursor.previous() );
222         assertTrue( cursor.available() );
223         
224         cursor.after( 5 );
225         assertTrue( cursor.next() );
226         assertTrue( cursor.available() );
227         assertEquals( 7, ( int ) cursor.get() );
228         
229         
230         cursor.before( 11 );
231         assertTrue( cursor.next() );
232         assertTrue( cursor.available() );
233         assertEquals( 11, ( int ) cursor.get() );
234         
235     }
236    
237     
238     class IntegerComparator implements Comparator<Integer>
239     {
240         public int compare( Integer o1, Integer o2 )
241         {
242             return o1.compareTo( o2 );
243         }
244     }
245 }