{
File tempFile = tempFolder.newFile( "mavibot.db" );
String tempFileName = tempFile.getAbsolutePath();
// Create page size of 32 only
RecordManager recordManager = new RecordManager( tempFileName, 32 );
Method storeMethod = RecordManager.class.getDeclaredMethod( "store", long.class, long.class, PageIO[].class );
Method readLongMethod = RecordManager.class.getDeclaredMethod( "readLong", PageIO[].class, long.class );
storeMethod.setAccessible( true );
readLongMethod.setAccessible( true );
// Allocate some Pages
PageIO[] pageIos = new PageIO[2];
pageIos[0] = new PageIO();
pageIos[0].setData( ByteBuffer.allocate( recordManager.getPageSize() ) );
pageIos[1] = new PageIO();
pageIos[1].setData( ByteBuffer.allocate( recordManager.getPageSize() ) );
// Set the int at the beginning
storeMethod.invoke( recordManager, 0, 0x0123456789ABCDEFL, pageIos );
// Read it back
long readValue = ( Long ) readLongMethod.invoke( recordManager, pageIos, 0 );
assertEquals( 0x0123456789ABCDEFL, readValue );
// Set the int at the end of the first page
storeMethod.invoke( recordManager, 12, 0x0123456789ABCDEFL, pageIos );
// Read it back
readValue = ( Long ) readLongMethod.invoke( recordManager, pageIos, 12 );
assertEquals( 0x0123456789ABCDEFL, readValue );
// Set the int at the end of the first page and overlapping on the second page
// 1 byte overlapping
storeMethod.invoke( recordManager, 13, 0x0123456789ABCDEFL, pageIos );
// Read it back
readValue = ( Long ) readLongMethod.invoke( recordManager, pageIos, 13 );
assertEquals( 0x0123456789ABCDEFL, readValue );
// Set the int at the end of the first page and overlapping on the second page
// 2 bytes overlapping
storeMethod.invoke( recordManager, 14, 0x0123456789ABCDEFL, pageIos );
// Read it back
readValue = ( Long ) readLongMethod.invoke( recordManager, pageIos, 14 );
assertEquals( 0x0123456789ABCDEFL, readValue );
// Set the int at the end of the first page and overlapping on the second page
// 3 bytes overlapping
storeMethod.invoke( recordManager, 15, 0x0123456789ABCDEFL, pageIos );
// Read it back
readValue = ( Long ) readLongMethod.invoke( recordManager, pageIos, 15 );
assertEquals( 0x0123456789ABCDEFL, readValue );
// Set the int at the end of the first page and overlapping on the second page
// 4 bytes overlapping
storeMethod.invoke( recordManager, 16, 0x0123456789ABCDEFL, pageIos );
// Read it back
readValue = ( Long ) readLongMethod.invoke( recordManager, pageIos, 16 );
assertEquals( 0x0123456789ABCDEFL, readValue );
// Set the int at the end of the first page and overlapping on the second page
// 5 bytes overlapping
storeMethod.invoke( recordManager, 17, 0x0123456789ABCDEFL, pageIos );
// Read it back
readValue = ( Long ) readLongMethod.invoke( recordManager, pageIos, 17 );
assertEquals( 0x0123456789ABCDEFL, readValue );
// Set the int at the end of the first page and overlapping on the second page
// 6 bytes overlapping
storeMethod.invoke( recordManager, 18, 0x0123456789ABCDEFL, pageIos );
// Read it back
readValue = ( Long ) readLongMethod.invoke( recordManager, pageIos, 18 );
assertEquals( 0x0123456789ABCDEFL, readValue );
// Set the int at the end of the first page and overlapping on the second page
// 7 bytes overlapping
storeMethod.invoke( recordManager, 19, 0x0123456789ABCDEFL, pageIos );
// Read it back
readValue = ( Long ) readLongMethod.invoke( recordManager, pageIos, 19 );
assertEquals( 0x0123456789ABCDEFL, readValue );
// Set the int at the beginning of the second page
storeMethod.invoke( recordManager, 20, 0x0123456789ABCDEFL, pageIos );
// Read it back
readValue = ( Long ) readLongMethod.invoke( recordManager, pageIos, 20 );
recordManager.close();
}