blob: 5ea7f50b6a51ec13c6062e72db2e0b36e808024b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.server.core.avltree;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Comparator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mycila.junit.concurrent.Concurrency;
import com.mycila.junit.concurrent.ConcurrentJunitRunner;
/**
* An AVL tree testcase.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
@RunWith(ConcurrentJunitRunner.class)
@Concurrency()
public class ArrayTreeTest
{
private static final Integer MINUS_ONE = Integer.valueOf( -1 );
private static final Integer ZERO = Integer.valueOf( 0 );
private static final Integer ONE = Integer.valueOf( 1 );
private static final Integer TWO = Integer.valueOf( 2 );
private static final Integer THREE = Integer.valueOf( 3 );
private static final Integer FOUR = Integer.valueOf( 4 );
private static final Integer FIVE = Integer.valueOf( 5 );
private static final Integer SIX = Integer.valueOf( 6 );
private static final Integer SEVEN = Integer.valueOf( 7 );
private static final Integer EIGHT = Integer.valueOf( 8 );
private static final Integer NINE = Integer.valueOf( 9 );
private static final Integer TEN = Integer.valueOf( 10 );
private static final Integer ELEVEN = Integer.valueOf( 11 );
private static final Integer TWELVE = Integer.valueOf( 12 );
private static final Integer THIRTY_ONE = Integer.valueOf( 31 );
private static final Integer THIRTY_TWO = Integer.valueOf( 32 );
private static final Integer THIRTY_SEVEN = Integer.valueOf( 37 );
private static final Integer SEVENTY = Integer.valueOf( 70 );
private static final Integer SEVENTY_NINE = Integer.valueOf( 79 );
private static final Logger LOG = LoggerFactory.getLogger( ArrayTreeTest.class );
private ArrayTree<Integer> createTree()
{
ArrayTree<Integer> tree;
tree = new ArrayTree<Integer>( new Comparator<Integer>()
{
public int compare( Integer i1, Integer i2 )
{
if ( i1 == null )
{
return ( i2 == null ? 0 : -1 );
}
return i1.compareTo( i2 );
}
} );
return tree;
}
@Test
public void testEmpty()
{
ArrayTree<Integer> tree = createTree();
assertTrue( tree.isEmpty() );
assertNull( tree.getFirst() );
assertNull( tree.getLast() );
tree.remove( 97 ); // remove a non-existing key
assertTrue( tree.isEmpty() );
if ( LOG.isDebugEnabled() )
{
tree.printTree();
}
}
@Test
public void testFirstAndLast()
{
ArrayTree<Integer> tree = createTree();
tree.insert( 7 );
assertFalse( tree.isEmpty() );
assertNotNull( tree.getFirst() );
assertNotNull( tree.getLast() );
tree.insert( 10 );
assertEquals( 2, tree.size() );
assertNotNull( tree.getFirst() );
assertNotNull( tree.getLast() );
assertFalse( tree.getFirst().equals( tree.getLast() ) );
assertEquals( SEVEN, tree.getFirst() );
assertEquals( TEN, tree.getLast() );
tree.insert( 3 );
assertEquals( THREE, tree.getFirst() );
assertEquals( TEN, tree.getLast() );
tree.insert( 11 );
assertEquals( THREE, tree.getFirst() );
assertEquals( ELEVEN, tree.getLast() );
}
@Test
public void testSingleRightRotation()
{
ArrayTree<Integer> tree = createTree();
// right rotation
tree.insert( 3 );
tree.insert( 2 );
tree.insert( 1 );
assertEquals( "1, 2, 3", tree.toString() );
}
@Test
public void testSingleLeftRotation()
{
ArrayTree<Integer> tree = createTree();
// left rotation
tree.insert( 1 );
tree.insert( 2 );
tree.insert( 3 );
assertEquals( "1, 2, 3", tree.toString() );
}
@Test
public void testDoubleLeftRotation() // left-right totation
{
ArrayTree<Integer> tree = createTree();
// double left rotation
tree.insert( 1 );
tree.insert( 3 );
tree.insert( 2 );
assertEquals( "1, 2, 3", tree.toString() );
}
@Test
public void testDoubleRightRotation() // right-left totation
{
ArrayTree<Integer> tree = createTree();
// double left rotation
tree.insert( 3 );
tree.insert( 1 );
tree.insert( 2 );
assertEquals( "1, 2, 3", tree.toString() );
}
@Test
public void testLinks()
{
ArrayTree<Integer> tree = createTree();
tree.insert( 37 );
tree.insert( 1 );
tree.insert( 2 );
tree.insert( 10 );
tree.insert( 11 );
tree.insert( 25 );
tree.insert( 5 );
assertEquals( ONE, tree.getFirst() );
assertEquals( THIRTY_SEVEN, tree.getLast() );
}
@Test
public void testRemove()
{
ArrayTree<Integer> tree = createTree();
tree.insert( 3 );
tree.insert( 2 );
tree.insert( 1 );
LOG.debug( getLinkedText( tree ) );
tree.remove( 2 );
LOG.debug( getLinkedText( tree ) );
assertEquals( "1, 3", tree.toString() );
tree.remove( 1 );
assertEquals( "3", tree.toString() );
assertEquals( THREE, tree.getFirst() );
assertNull( tree.remove( 777 ) );// key not present
assertEquals( THREE, tree.remove( 3 ) );
assertTrue( tree.isEmpty() );
tree.insert( 37 );
tree.insert( 39 );
tree.insert( 27 );
tree.insert( 38 );
tree.insert( 21 );
tree.insert( 26 );
tree.insert( 43 );
assertEquals( "21, 26, 27, 37, 38, 39, 43", tree.toString() );
tree.remove( 26 ); // remove a non-root non-leaf node in the left sub tree of root
assertEquals( "21, 27, 37, 38, 39, 43", tree.toString() );
tree.remove( 43 );
assertEquals( "21, 27, 37, 38, 39", tree.toString() );
tree.remove( 39 );
assertEquals( "21, 27, 37, 38", tree.toString() );
tree.remove( 38 ); // a double right rotation has to happen after this
assertEquals( "21, 27, 37", tree.toString() );
if ( LOG.isDebugEnabled() )
{
tree.printTree();
}
}
@Test
public void testLinkedNodes()
{
ArrayTree<Integer> tree = createTree();
for ( int i = 0; i < 3; i++ )
{
tree.insert( i );
}
assertEquals( "[0]-->[1]-->[2]-->NULL", getLinkedText( tree ) );
tree.remove( 1 );
assertEquals( "[0]-->[2]-->NULL", getLinkedText( tree ) );
tree.insert( 4 );
tree.insert( 3 );
assertEquals( "[0]-->[2]-->[3]-->[4]-->NULL", getLinkedText( tree ) );
tree.remove( 0 );
assertEquals( "[2]-->[3]-->[4]-->NULL", getLinkedText( tree ) );
tree.remove( 3 );
assertEquals( "[2]-->[4]-->NULL", getLinkedText( tree ) );
}
@Test
public void testFind()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.find( 3 ) );
tree.insert( 1 );
tree.insert( 70 );
tree.insert( 21 );
tree.insert( 12 );
tree.insert( 27 );
tree.insert( 11 );
assertNotNull( tree.find( 11 ) );
assertNull( tree.find( 0 ) );
}
@Test
public void testFindMaxMin()
{
ArrayTree<Integer> tree = createTree();
tree.insert( 72 );
tree.insert( 79 );
tree.remove( 72 );// should call findMax internally
assertEquals( SEVENTY_NINE, tree.getFirst() );
tree.insert( 11 );
tree.remove( 79 ); // should call findMin internally
assertEquals( ELEVEN, tree.getFirst() );
}
@Test
public void testGetKeys()
{
ArrayTree<Integer> tree = createTree();
tree.insert( 72 );
tree.insert( 79 );
tree.insert( 1 );
tree.insert( 2 );
tree.insert( 3 );
tree.insert( 7 );
tree.insert( 34 );
assertEquals( 7, tree.getKeys().size() );
}
@Test
public void testTreeRoationAtLeftChildAfterDeletingRoot()
{
ArrayTree<Integer> tree = createTree();
int[] keys =
{ 86, 110, 122, 2, 134, 26, 14, 182 }; // order is important to produce the expected tree
int[] expectedKeys =
{ 2, 14, 26, 86, 122, 134, 182 };
for ( int key : keys )
{
tree.insert( key );
}
tree.remove( 110 );
for ( int key : expectedKeys )
{
assertNotNull( "Should find " + key, tree.find( key ) );
}
}
private String getLinkedText( ArrayTree<Integer> tree )
{
Integer first = tree.getFirst();
StringBuilder sb = new StringBuilder();
while ( first != null )
{
sb.append( "[" ).append( first ).append( "]-->" );
first = tree.findGreater( first );
}
sb.append( "NULL" );
return sb.toString();
}
@Test
public void testRemoveOneNode()
{
ArrayTree<Integer> tree = createTree();
tree.insert( 1 );
assertEquals( 1, tree.size() );
tree.remove( 1 );
assertEquals( 0, tree.size() );
}
@Test
public void testRemoveOneNodeWithRight()
{
ArrayTree<Integer> tree = createTree();
tree.insert( 1 );
tree.insert( 2 );
assertEquals( 2, tree.size() );
assertEquals( "1, 2", tree.toString() );
tree.remove( 1 );
assertEquals( 1, tree.size() );
assertEquals( TWO, tree.getFirst() );
}
//-----------------------------------------------------------------------
// Test insert( K value )
//-----------------------------------------------------------------------
@Test
public void testInsertNullValue()
{
ArrayTree<Integer> tree = createTree();
assertEquals( 0, tree.size() );
assertNull( tree.insert( null ) );
assertEquals( 0, tree.size() );
}
@Test
public void testInsertInEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertEquals( 0, tree.size() );
assertNull( tree.insert( 0 ) );
assertEquals( 1, tree.size() );
assertEquals( ZERO, tree.get( 0 ) );
assertEquals( ZERO, tree.getFirst() );
assertEquals( ZERO, tree.getLast() );
}
@Test
public void testInsertInOnElementTreeAtTheBeginning()
{
ArrayTree<Integer> tree = createTree();
// Initialize the array
assertNull( tree.insert( 5 ) );
assertEquals( 1, tree.size() );
Integer existing = tree.insert( ZERO );
assertNull( existing );
assertEquals( 2, tree.size() );
assertEquals( ZERO, tree.getFirst() );
assertEquals( FIVE, tree.getLast() );
assertEquals( "0, 5", tree.toString() );
}
@Test
public void testInsertInOnElementTreeAtTheEnd()
{
ArrayTree<Integer> tree = createTree();
// Initialize the array
assertNull( tree.insert( 5 ) );
assertEquals( 1, tree.size() );
Integer existing = tree.insert( TEN );
assertNull( existing );
assertEquals( 2, tree.size() );
assertEquals( FIVE, tree.getFirst() );
assertEquals( TEN, tree.getLast() );
assertEquals( "5, 10", tree.toString() );
}
@Test
public void testInsertInOnElementTreeExistingElement()
{
ArrayTree<Integer> tree = createTree();
// Initialize the array
assertNull( tree.insert( 5 ) );
assertEquals( 1, tree.size() );
Integer existing = tree.insert( FIVE );
assertEquals( 1, tree.size() );
assertEquals( FIVE, existing );
assertEquals( FIVE, tree.getFirst() );
assertEquals( FIVE, tree.getLast() );
assertEquals( "5", tree.toString() );
}
@Test
public void testInsertInEvenTreeAtTheBeginning()
{
ArrayTree<Integer> tree = createTree();
// Initialize the array
assertNull( tree.insert( ZERO ) );
assertNull( tree.insert( TWO ) );
assertNull( tree.insert( FOUR ) );
assertNull( tree.insert( SIX ) );
assertNull( tree.insert( EIGHT ) );
assertNull( tree.insert( TEN ) );
assertEquals( 6, tree.size() );
Integer existing = tree.insert( MINUS_ONE );
assertNull( existing );
assertEquals( 7, tree.size() );
assertEquals( MINUS_ONE, tree.getFirst() );
assertEquals( TEN, tree.getLast() );
assertEquals( "-1, 0, 2, 4, 6, 8, 10", tree.toString() );
}
@Test
public void testInsertInEvenTreeAtTheEnd()
{
ArrayTree<Integer> tree = createTree();
// Initialize the array
assertNull( tree.insert( ZERO ) );
assertNull( tree.insert( TWO ) );
assertNull( tree.insert( FOUR ) );
assertNull( tree.insert( SIX ) );
assertNull( tree.insert( EIGHT ) );
assertNull( tree.insert( TEN ) );
assertEquals( 6, tree.size() );
Integer existing = tree.insert( TWELVE );
assertNull( existing );
assertEquals( 7, tree.size() );
assertEquals( ZERO, tree.getFirst() );
assertEquals( TWELVE, tree.getLast() );
assertEquals( "0, 2, 4, 6, 8, 10, 12", tree.toString() );
}
@Test
public void testInsertInEvenTreeInTheMiddle()
{
ArrayTree<Integer> tree = createTree();
// Initialize the array
assertNull( tree.insert( ZERO ) );
assertNull( tree.insert( TWO ) );
assertNull( tree.insert( FOUR ) );
assertNull( tree.insert( SIX ) );
assertNull( tree.insert( EIGHT ) );
assertNull( tree.insert( TEN ) );
assertEquals( 6, tree.size() );
// Insert 1
Integer existing = tree.insert( ONE );
assertNull( existing );
assertEquals( 7, tree.size() );
assertEquals( ZERO, tree.getFirst() );
assertEquals( TEN, tree.getLast() );
assertEquals( "0, 1, 2, 4, 6, 8, 10", tree.toString() );
// Insert 5
existing = tree.insert( FIVE );
assertNull( existing );
assertEquals( 8, tree.size() );
assertEquals( ZERO, tree.getFirst() );
assertEquals( TEN, tree.getLast() );
assertEquals( "0, 1, 2, 4, 5, 6, 8, 10", tree.toString() );
// Insert 9
existing = tree.insert( NINE );
assertNull( existing );
assertEquals( 9, tree.size() );
assertEquals( ZERO, tree.getFirst() );
assertEquals( TEN, tree.getLast() );
assertEquals( "0, 1, 2, 4, 5, 6, 8, 9, 10", tree.toString() );
}
@Test
public void testInsertInEvenTreeExistingEelemnt()
{
ArrayTree<Integer> tree = createTree();
// Initialize the array
assertNull( tree.insert( ZERO ) );
assertNull( tree.insert( TWO ) );
assertNull( tree.insert( FOUR ) );
assertNull( tree.insert( SIX ) );
assertNull( tree.insert( EIGHT ) );
assertNull( tree.insert( TEN ) );
assertEquals( 6, tree.size() );
// Insert 0
Integer existing = tree.insert( ZERO );
assertEquals( ZERO, existing );
assertEquals( 6, tree.size() );
assertEquals( ZERO, tree.getFirst() );
assertEquals( TEN, tree.getLast() );
assertEquals( "0, 2, 4, 6, 8, 10", tree.toString() );
// Insert 6
existing = tree.insert( SIX );
assertEquals( SIX, existing );
assertEquals( 6, tree.size() );
assertEquals( ZERO, tree.getFirst() );
assertEquals( TEN, tree.getLast() );
assertEquals( "0, 2, 4, 6, 8, 10", tree.toString() );
// Insert 10
existing = tree.insert( TEN );
assertEquals( TEN, existing );
assertEquals( 6, tree.size() );
assertEquals( ZERO, tree.getFirst() );
assertEquals( TEN, tree.getLast() );
assertEquals( "0, 2, 4, 6, 8, 10", tree.toString() );
}
@Test
public void testInsertInFullTree()
{
ArrayTree<Integer> tree = createTree();
StringBuilder sb = new StringBuilder();
boolean isFirst = true;
// Initialize the array
for ( int i = 0; i < 32; i++ )
{
tree.insert( i );
if ( isFirst )
{
isFirst = false;
}
else
{
sb.append( ", " );
}
sb.append( i );
}
assertEquals( 32, tree.size() );
assertEquals( sb.toString(), tree.toString() );
assertEquals( ZERO, tree.getFirst() );
assertEquals( THIRTY_ONE, tree.getLast() );
// Now insert at the beginning
tree.insert( MINUS_ONE );
assertEquals( 33, tree.size() );
assertEquals( MINUS_ONE, tree.getFirst() );
assertEquals( THIRTY_ONE, tree.getLast() );
// Insert at the end
tree.insert( THIRTY_TWO );
assertEquals( 34, tree.size() );
assertEquals( MINUS_ONE, tree.getFirst() );
assertEquals( THIRTY_TWO, tree.getLast() );
}
//-----------------------------------------------------------------------
// Test remove( K value )
//-----------------------------------------------------------------------
@Test
public void testRemoveEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.remove( null ) );
assertEquals( 0, tree.size() );
assertNull( tree.remove( ONE ) );
assertEquals( 0, tree.size() );
}
@Test
public void testRemoveFromOnElementTree()
{
ArrayTree<Integer> tree = createTree();
// Initialize the array
assertNull( tree.insert( 5 ) );
assertEquals( 1, tree.size() );
Integer existing = tree.remove( FIVE );
assertEquals( FIVE, existing );
assertEquals( 0, tree.size() );
assertNull( tree.getFirst() );
assertNull( tree.getLast() );
assertEquals( "[]", tree.toString() );
}
@Test
public void testRemovefromOnElementTreeNotExistingElement()
{
ArrayTree<Integer> tree = createTree();
// Initialize the array
assertNull( tree.insert( 5 ) );
assertEquals( 1, tree.size() );
assertNull( tree.remove( TEN ) );
assertEquals( 1, tree.size() );
assertEquals( FIVE, tree.getFirst() );
assertEquals( FIVE, tree.getLast() );
assertEquals( "5", tree.toString() );
}
@Test
public void testRemoveFromFullTreeFromTheBeginning()
{
ArrayTree<Integer> tree = createTree();
StringBuilder sb = new StringBuilder();
boolean isFirst = true;
// Initialize the array
for ( int i = 0; i < 32; i++ )
{
tree.insert( i );
if ( isFirst )
{
isFirst = false;
}
else
{
sb.append( ", " );
}
sb.append( i );
}
assertEquals( 32, tree.size() );
assertEquals( sb.toString(), tree.toString() );
int size = 32;
for ( int i = 0; i < 32; i++ )
{
assertEquals( Integer.valueOf( i ), tree.remove( i ) );
assertEquals( size - i - 1, tree.size() );
if ( i < 31 )
{
assertEquals( Integer.valueOf( i + 1 ), tree.getFirst() );
assertEquals( THIRTY_ONE, tree.getLast() );
}
}
assertEquals( 0, tree.size() );
assertNull( tree.getFirst() );
assertNull( tree.getLast() );
}
@Test
public void testRemoveFromFullTreeFromTheEnd()
{
ArrayTree<Integer> tree = createTree();
StringBuilder sb = new StringBuilder();
boolean isFirst = true;
// Initialize the array
for ( int i = 0; i < 32; i++ )
{
tree.insert( i );
if ( isFirst )
{
isFirst = false;
}
else
{
sb.append( ", " );
}
sb.append( i );
}
assertEquals( 32, tree.size() );
assertEquals( sb.toString(), tree.toString() );
int size = 32;
for ( int i = 0; i < 32; i++ )
{
assertEquals( Integer.valueOf( i ), tree.remove( i ) );
assertEquals( size - i - 1, tree.size() );
if ( i < 31 )
{
assertEquals( Integer.valueOf( i + 1 ), tree.getFirst() );
assertEquals( THIRTY_ONE, tree.getLast() );
}
}
assertEquals( 0, tree.size() );
assertNull( tree.getFirst() );
assertNull( tree.getLast() );
}
//-----------------------------------------------------------------------
// Test isEmpty()
//-----------------------------------------------------------------------
@Test
public void testIsEmptyEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertTrue( tree.isEmpty() );
tree.insert( ONE );
assertFalse( tree.isEmpty() );
tree.remove( ONE );
assertTrue( tree.isEmpty() );
}
//-----------------------------------------------------------------------
// Test size()
//-----------------------------------------------------------------------
@Test
public void testSizeEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertEquals( 0, tree.size() );
tree.insert( ONE );
assertEquals( 1, tree.size() );
tree.remove( ONE );
assertEquals( 0, tree.size() );
}
//-----------------------------------------------------------------------
// Test find()
//-----------------------------------------------------------------------
@Test
public void testFindEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.find( ONE ) );
}
@Test
public void testFindNullFromEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.find( null ) );
}
@Test
public void testFindExistingElement()
{
ArrayTree<Integer> tree = createTree();
tree.insert( ZERO );
tree.insert( TWO );
tree.insert( FOUR );
tree.insert( SIX );
tree.insert( EIGHT );
assertEquals( ZERO, tree.find( 0 ) );
assertEquals( TWO, tree.find( 2 ) );
assertEquals( FOUR, tree.find( 4 ) );
assertEquals( SIX, tree.find( 6 ) );
assertEquals( EIGHT, tree.find( 8 ) );
}
@Test
public void testFindNonExistingElement()
{
ArrayTree<Integer> tree = createTree();
tree.insert( ZERO );
tree.insert( TWO );
tree.insert( FOUR );
tree.insert( SIX );
tree.insert( EIGHT );
assertNull( tree.find( -1 ) );
assertNull( tree.find( 1 ) );
assertNull( tree.find( 3 ) );
assertNull( tree.find( 5 ) );
assertNull( tree.find( 7 ) );
assertNull( tree.find( 9 ) );
}
//-----------------------------------------------------------------------
// Test getFirst()
//-----------------------------------------------------------------------
@Test
public void testGetFirstEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.getFirst() );
}
@Test
public void testGetFirst()
{
ArrayTree<Integer> tree = createTree();
tree.insert( FIVE );
assertEquals( FIVE, tree.getFirst() );
tree.insert( TEN );
assertEquals( FIVE, tree.getFirst() );
tree.insert( ONE );
assertEquals( ONE, tree.getFirst() );
tree.insert( TWO );
assertEquals( ONE, tree.getFirst() );
tree.remove( ONE );
assertEquals( TWO, tree.getFirst() );
}
//-----------------------------------------------------------------------
// Test getLast()
//-----------------------------------------------------------------------
@Test
public void testGetLastEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.getLast() );
}
@Test
public void testGetLast()
{
ArrayTree<Integer> tree = createTree();
tree.insert( FIVE );
assertEquals( FIVE, tree.getLast() );
tree.insert( TEN );
assertEquals( TEN, tree.getLast() );
tree.insert( EIGHT );
assertEquals( TEN, tree.getLast() );
tree.insert( ELEVEN );
assertEquals( ELEVEN, tree.getLast() );
tree.remove( ELEVEN );
assertEquals( TEN, tree.getLast() );
}
//-----------------------------------------------------------------------
// Test findGreater()
//-----------------------------------------------------------------------
@Test
public void testFindGreaterEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.findGreater( ONE ) );
}
@Test
public void testFindGreaterNullFromEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.findGreater( null ) );
}
@Test
public void testFindGreaterFromOneElementTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
assertNull( tree.findGreater( null ) );
assertEquals( TWO, tree.findGreater( ONE ) );
assertNull( tree.findGreater( TWO ) );
assertNull( tree.findGreater( THREE ) );
}
@Test
public void testFindGreaterFromTwoElementsTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
tree.insert( FOUR );
assertNull( tree.findGreater( null ) );
assertEquals( TWO, tree.findGreater( ONE ) );
assertEquals( FOUR, tree.findGreater( TWO ) );
assertEquals( FOUR, tree.findGreater( THREE ) );
assertNull( tree.findGreater( FOUR ) );
assertNull( tree.findGreater( FIVE ) );
}
@Test
public void testFindGreater()
{
ArrayTree<Integer> tree = createTree();
tree.insert( ZERO );
tree.insert( TWO );
tree.insert( FOUR );
tree.insert( SIX );
tree.insert( EIGHT );
tree.insert( TEN );
assertEquals( ZERO, tree.findGreater( MINUS_ONE ) );
assertNotSame( ONE, tree.findGreater( ONE ) );
assertEquals( TWO, tree.findGreater( ONE ) );
assertEquals( SIX, tree.findGreater( FIVE ) );
tree.remove( SIX );
assertEquals( EIGHT, tree.findGreater( FIVE ) );
assertNull( tree.findGreater( TEN ) );
}
//-----------------------------------------------------------------------
// Test findGreaterOrEqual()
//-----------------------------------------------------------------------
@Test
public void testFindGreaterOrEqualEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.findGreaterOrEqual( ONE ) );
}
@Test
public void testFindGreaterOrEqualNullFromEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.findGreaterOrEqual( null ) );
}
@Test
public void testFindGreaterOrEqualFromOneElementTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
assertNull( tree.findGreaterOrEqual( null ) );
assertEquals( TWO, tree.findGreaterOrEqual( ONE ) );
assertEquals( TWO, tree.findGreaterOrEqual( TWO ) );
assertNull( tree.findGreaterOrEqual( THREE ) );
}
@Test
public void testFindGreaterOrEqualFromTwoElementsTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
tree.insert( FOUR );
assertNull( tree.findGreaterOrEqual( null ) );
assertEquals( TWO, tree.findGreaterOrEqual( ONE ) );
assertEquals( TWO, tree.findGreaterOrEqual( TWO ) );
assertEquals( FOUR, tree.findGreaterOrEqual( THREE ) );
assertEquals( FOUR, tree.findGreaterOrEqual( FOUR ) );
assertNull( tree.findGreaterOrEqual( FIVE ) );
}
@Test
public void testFindGreaterOrEqual()
{
ArrayTree<Integer> tree = createTree();
tree.insert( ZERO );
tree.insert( TWO );
tree.insert( FOUR );
tree.insert( SIX );
tree.insert( EIGHT );
tree.insert( TEN );
assertEquals( ZERO, tree.findGreater( MINUS_ONE ) );
assertNotSame( ONE, tree.findGreaterOrEqual( ONE ) );
assertEquals( TWO, tree.findGreaterOrEqual( ONE ) );
assertEquals( TWO, tree.findGreaterOrEqual( TWO ) );
assertEquals( SIX, tree.findGreaterOrEqual( FIVE ) );
tree.remove( SIX );
assertEquals( EIGHT, tree.findGreaterOrEqual( FIVE ) );
assertEquals( TEN, tree.findGreaterOrEqual( TEN ) );
assertNull( tree.findGreaterOrEqual( ELEVEN ) );
}
//-----------------------------------------------------------------------
// Test findLess()
//-----------------------------------------------------------------------
@Test
public void testFindLessEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.findLess( ONE ) );
}
@Test
public void testFindLessNullFromEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.findLess( null ) );
}
@Test
public void testFindLessFromOneElementTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
assertNull( tree.findLess( null ) );
assertNull( tree.findLess( ONE ) );
assertNull( tree.findLess( TWO ) );
assertEquals( TWO, tree.findLess( THREE ) );
}
@Test
public void testFindLessFromTwoElementsTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
tree.insert( FOUR );
assertNull( tree.findLess( null ) );
assertNull( tree.findLess( ONE ) );
assertNull( tree.findLess( TWO ) );
assertEquals( TWO, tree.findLess( THREE ) );
assertEquals( TWO, tree.findLess( FOUR ) );
assertEquals( FOUR, tree.findLess( FIVE ) );
}
@Test
public void testFindLess()
{
ArrayTree<Integer> tree = createTree();
tree.insert( ZERO );
tree.insert( TWO );
tree.insert( FOUR );
tree.insert( SIX );
tree.insert( EIGHT );
tree.insert( TEN );
assertNull( tree.findLess( ZERO ) );
assertNotSame( ONE, tree.findLess( ONE ) );
assertEquals( ZERO, tree.findLess( ONE ) );
assertEquals( FOUR, tree.findLess( FIVE ) );
tree.remove( FOUR );
assertEquals( TWO, tree.findLess( FIVE ) );
assertEquals( EIGHT, tree.findLess( TEN ) );
assertEquals( TEN, tree.findLess( SEVENTY ) );
}
//-----------------------------------------------------------------------
// Test findLessOrEqual()
//-----------------------------------------------------------------------
@Test
public void testFindLessOrEqualEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.findLessOrEqual( ONE ) );
}
@Test
public void testFindLessOrEqualNullFromEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertNull( tree.findLessOrEqual( null ) );
}
@Test
public void testFindLessOrEqualFromOneElementTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
assertNull( tree.findLessOrEqual( null ) );
assertNull( tree.findLessOrEqual( ONE ) );
assertEquals( TWO, tree.findLessOrEqual( TWO ) );
assertEquals( TWO, tree.findLessOrEqual( THREE ) );
}
@Test
public void testFindLessOrEqualFromTwoElementsTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
tree.insert( FOUR );
assertNull( tree.findLessOrEqual( null ) );
assertNull( tree.findLessOrEqual( ONE ) );
assertEquals( TWO, tree.findLessOrEqual( TWO ) );
assertEquals( TWO, tree.findLessOrEqual( THREE ) );
assertEquals( FOUR, tree.findLessOrEqual( FOUR ) );
assertEquals( FOUR, tree.findLessOrEqual( FIVE ) );
}
@Test
public void testFindLessOrEqual()
{
ArrayTree<Integer> tree = createTree();
tree.insert( ZERO );
tree.insert( TWO );
tree.insert( FOUR );
tree.insert( SIX );
tree.insert( EIGHT );
tree.insert( TEN );
assertNull( tree.findLessOrEqual( MINUS_ONE ) );
assertEquals( ZERO, tree.findLessOrEqual( ZERO ) );
assertEquals( ZERO, tree.findLessOrEqual( ONE ) );
assertEquals( TWO, tree.findLessOrEqual( THREE ) );
assertEquals( FOUR, tree.findLessOrEqual( FIVE ) );
tree.remove( FOUR );
assertEquals( TWO, tree.findLessOrEqual( FIVE ) );
assertEquals( EIGHT, tree.findLessOrEqual( NINE ) );
assertEquals( TEN, tree.findLessOrEqual( TEN ) );
assertEquals( TEN, tree.findLessOrEqual( ELEVEN ) );
}
//-----------------------------------------------------------------------
// Test get( int position )
//-----------------------------------------------------------------------
@Test
public void testGetEmptyTree()
{
ArrayTree<Integer> tree = createTree();
try
{
assertNull( tree.get( 0 ) );
fail();
}
catch ( ArrayIndexOutOfBoundsException aioobe )
{
assertTrue( true );
}
}
@Test
public void testGetEmptyTreeAIOOBException()
{
ArrayTree<Integer> tree = createTree();
try
{
tree.get( -1 );
fail();
}
catch ( ArrayIndexOutOfBoundsException aioobe )
{
assertTrue( true );
}
try
{
tree.get( 1 );
fail();
}
catch ( ArrayIndexOutOfBoundsException aioobe )
{
assertTrue( true );
}
}
//-----------------------------------------------------------------------
// Test getAfterPosition( K key )
//-----------------------------------------------------------------------
@Test
public void testGetAfterPositionEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertEquals( -1, tree.getAfterPosition( ZERO ) );
}
@Test
public void testGetAfterPositionOneElementTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
assertEquals( -1, tree.getAfterPosition( null ) );
assertEquals( 0, tree.getAfterPosition( ZERO ) );
assertEquals( -1, tree.getAfterPosition( TWO ) );
assertEquals( -1, tree.getAfterPosition( FOUR ) );
}
@Test
public void testGetAfterPositionTwoElementsTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
tree.insert( FOUR );
assertEquals( -1, tree.getAfterPosition( null ) );
assertEquals( 0, tree.getAfterPosition( ZERO ) );
assertEquals( 1, tree.getAfterPosition( TWO ) );
assertEquals( 1, tree.getAfterPosition( THREE ) );
assertEquals( -1, tree.getAfterPosition( FOUR ) );
}
@Test
public void testGetAfterPositionNElementsTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
tree.insert( FOUR );
tree.insert( SIX );
tree.insert( EIGHT );
assertEquals( -1, tree.getAfterPosition( null ) );
assertEquals( 0, tree.getAfterPosition( ZERO ) );
assertEquals( 1, tree.getAfterPosition( TWO ) );
assertEquals( 1, tree.getAfterPosition( THREE ) );
assertEquals( 2, tree.getAfterPosition( FOUR ) );
assertEquals( 2, tree.getAfterPosition( FIVE ) );
assertEquals( 3, tree.getAfterPosition( SIX ) );
assertEquals( 3, tree.getAfterPosition( SEVEN ) );
assertEquals( -1, tree.getAfterPosition( EIGHT ) );
}
//-----------------------------------------------------------------------
// Test getBeforePosition( K key )
//-----------------------------------------------------------------------
@Test
public void testGetBeforePositionEmptyTree()
{
ArrayTree<Integer> tree = createTree();
assertEquals( -1, tree.getBeforePosition( ZERO ) );
}
@Test
public void testGetBeforePositionOneElementTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
assertEquals( -1, tree.getBeforePosition( null ) );
assertEquals( -1, tree.getBeforePosition( ZERO ) );
assertEquals( -1, tree.getBeforePosition( TWO ) );
assertEquals( 0, tree.getBeforePosition( FOUR ) );
}
@Test
public void testGetBeforePositionTwoElementsTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
tree.insert( FOUR );
assertEquals( -1, tree.getBeforePosition( null ) );
assertEquals( -1, tree.getBeforePosition( ZERO ) );
assertEquals( -1, tree.getBeforePosition( TWO ) );
assertEquals( 0, tree.getBeforePosition( THREE ) );
assertEquals( 0, tree.getBeforePosition( FOUR ) );
assertEquals( 1, tree.getBeforePosition( FIVE ) );
}
@Test
public void testGetBeforePositionNElementsTree()
{
ArrayTree<Integer> tree = createTree();
tree.insert( TWO );
tree.insert( FOUR );
tree.insert( SIX );
tree.insert( EIGHT );
assertEquals( -1, tree.getBeforePosition( null ) );
assertEquals( -1, tree.getBeforePosition( ZERO ) );
assertEquals( -1, tree.getBeforePosition( TWO ) );
assertEquals( 0, tree.getBeforePosition( THREE ) );
assertEquals( 0, tree.getBeforePosition( FOUR ) );
assertEquals( 1, tree.getBeforePosition( FIVE ) );
assertEquals( 1, tree.getBeforePosition( SIX ) );
assertEquals( 2, tree.getBeforePosition( SEVEN ) );
assertEquals( 2, tree.getBeforePosition( EIGHT ) );
assertEquals( 3, tree.getBeforePosition( NINE ) );
}
}