/*******************************************************************************
* Licensed 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 test.apache.kato.common;
import junit.framework.TestCase;
import org.apache.kato.common.ArrayBitMaskMappingStrategy;
public class TestArrayBitMaskMappingStrategy extends TestCase {
public void report(int arraySize,int elementNo1,int elementNo2) {
System.out.println("Array Size = "+arraySize);
System.out.println("Element Nos = "+elementNo1+","+elementNo2+" ("+Integer.toBinaryString(elementNo2));
int maxBitShift= (int) (31 - (Math.log10(arraySize)/Math.log10(2)))+1;
System.out.println("Maximum bit shift = "+maxBitShift);
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(arraySize,2);
int arrayIndex1 = c.getIndexArrayElement(elementNo1);
int seekCount1 = c.getSeekCount(elementNo1);
System.out.println("Array Index1 = "+arrayIndex1+" : "+seekCount1);
int arrayIndex2 = c.getIndexArrayElement(elementNo2);
int seekCount2 = c.getSeekCount(elementNo2);
System.out.println("Array Index2 = "+arrayIndex2+" : "+seekCount2);
int bitcount=(int) (Math.log10(elementNo2)/Math.log10(2))+1;
int max= ( 1 << bitcount ) -1;
System.out.println("Element2 bitcount = "+bitcount+" ( Max is "+max+")");
int newBucketSize=max/arraySize;
int bitcountBS=(int) (Math.log10(newBucketSize)/Math.log10(2))+1;
int maxBS= ( 1 << bitcountBS ) -1;
System.out.println("new bitcount = "+bitcountBS+" ( Max is "+maxBS+")");
System.out.println("new bucket size = "+maxBS+" ("+(maxBS*arraySize)+")("+Integer.toBinaryString(maxBS));
}
public void testArraySize1bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,2);
assertEquals(8,c.getArraySize());
}
public void testBucketSize1bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,2);
assertEquals(2,c.getBucketSize());
}
public void testArraySize5bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
assertEquals(8,c.getArraySize());
}
public void testBucketSize5bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
assertEquals(32,c.getBucketSize());
}
public void testGet0ElementFrom1Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,2);
assertEquals(0,c.getIndexArrayElement(0));
assertEquals(0,c.getSeekCount(0));
}
public void testGet0ElementSeekCountFrom1Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,2);
assertEquals(0,c.getSeekCount(0));
}
public void testGet1ElementFrom1Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,2);
assertEquals(0,c.getIndexArrayElement(1));
}
public void testGet1ElementSeekFrom1Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,2);
assertEquals(1,c.getSeekCount(1));
}
public void testGet3ElementFrom1Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,2);
assertEquals(1,c.getIndexArrayElement(3));
}
public void testGet3ElementSeekFrom1Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,2);
assertEquals(1,c.getSeekCount(3));
}
public void testGet15ElementFrom1Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,2);
assertEquals(7,c.getIndexArrayElement(15));
}
public void testGet15ElementSeekFrom1Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,2);
assertEquals(1,c.getSeekCount(15));
}
public void testGet0ElementFrom5Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
assertEquals(0,c.getIndexArrayElement(0));
assertEquals(0,c.getSeekCount(0));
}
public void testGet0ElementSeekCountFrom5Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
assertEquals(0,c.getSeekCount(0));
}
public void testGet1ElementFrom5Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
assertEquals(0,c.getIndexArrayElement(1));
}
public void testGet1ElementSeekFrom5Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
assertEquals(1,c.getSeekCount(1));
}
public void testGet3ElementFrom5Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
assertEquals(0,c.getIndexArrayElement(3));
}
public void testGet3ElementSeekFrom5Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
assertEquals(3,c.getSeekCount(3));
}
public void testGet64ElementFrom5Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
assertEquals(2,c.getIndexArrayElement(64));
}
public void testGet64ElementSeekFrom5Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
assertEquals(0,c.getSeekCount(64));
}
public void testGet500ElementFrom5Bit() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
assertEquals(-1,c.getIndexArrayElement(500));
}
public void testDoubleCapacityReturnsObject() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
ArrayBitMaskMappingStrategy newStrategy=c.doubleCapacity();
assertNotNull(newStrategy);
}
public void testDoubleCapacityReturnsNull() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,(Integer.MAX_VALUE/2)+50);
ArrayBitMaskMappingStrategy newStrategy=c.doubleCapacity();
assertNull(newStrategy);
}
public void testDoubleCapacityArraySize() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
ArrayBitMaskMappingStrategy newStrategy=c.doubleCapacity();
assertEquals(8,newStrategy.getArraySize());
}
public void testDoubleCapacityBucketSize() {
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,30);
ArrayBitMaskMappingStrategy newStrategy=c.doubleCapacity();
assertEquals(64,newStrategy.getBucketSize());
}
public void testSmallArrayMapping1Bit() {
int[] data=new int[8];
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,2);
for(int i=0;i<16;i++) {
int location=c.getIndexArrayElement(i);
int seek=c.getSeekCount(i);
if(seek==0) data[location]=i;
}
assertEquals(0,data[0]);
assertEquals(2,data[1]);
assertEquals(4,data[2]);
assertEquals(6,data[3]);
assertEquals(8,data[4]);
assertEquals(10,data[5]);
assertEquals(12,data[6]);
assertEquals(14,data[7]);
}
public void testSmallArrayDoubling1Bit() {
int[] data=new int[8];
ArrayBitMaskMappingStrategy c=new ArrayBitMaskMappingStrategy(8,2);
for(int i=0;i<16;i++) {
int location=c.getIndexArrayElement(i);
int seek=c.getSeekCount(i);
if(seek==0) data[location]=i;
}
c=c.doubleCapacity();
for(int i=0;i<16;i++) {
int location=c.getIndexArrayElement(i);
int seek=c.getSeekCount(i);
if(seek==0) {
assertEquals(data[location]*2,i);
}
}
}
public void printWible() {
for(int i=2;i<32;i++) {
int bitshift=(int) (Math.log10(i-1)/Math.log10(2));
int shifted= 1 << bitshift;
int mask = (1 << (bitshift+1))-1;
int max = mask+1;
System.out.println(""+i+"("+max+")="+bitshift+" "+Integer.toBinaryString(i)+" "+Integer.toBinaryString(shifted)+ " "+Integer.toBinaryString(mask));
}
}
}