@Test public void shouldGetNextIdBatchFromOnlyDefragIds() { // given IdRangeIterator iterator = new IdRange( new long[] {1, 2, 3, 4, 5, 6}, 7, 0 ).iterator(); // when IdRangeIterator subRange = iterator.nextIdBatch( 5 ).iterator(); // then assertEquals( 6, iterator.nextId() ); for ( long i = 0; i < 5; i++ ) { assertEquals( 1 + i, subRange.nextId() ); } assertEquals( VALUE_REPRESENTING_NULL, subRange.nextId() ); }
@Test public void shouldGetNextIdBatchFromOnlyDefragIdsWhenSomeDefragIdsHaveAlreadyBeenReturned() { // given IdRangeIterator iterator = new IdRange( new long[] {1, 2, 3, 4, 5, 6}, 7, 0 ).iterator(); iterator.nextId(); iterator.nextId(); // when IdRangeIterator subRange = iterator.nextIdBatch( 3 ).iterator(); // then assertEquals( 6, iterator.nextId() ); for ( long i = 0; i < 3; i++ ) { assertEquals( 3 + i, subRange.nextId() ); } assertEquals( VALUE_REPRESENTING_NULL, subRange.nextId() ); }
@Test public void shouldGetNextIdBatchFromSomeRangeIds() { // given IdRangeIterator iterator = new IdRange( EMPTY_LONG_ARRAY, 0, 20 ).iterator(); iterator.nextId(); // when IdRangeIterator subRange = iterator.nextIdBatch( 5 ).iterator(); // then assertEquals( 6, iterator.nextId() ); assertEquals( 1, subRange.nextId() ); assertEquals( 2, subRange.nextId() ); assertEquals( 3, subRange.nextId() ); assertEquals( 4, subRange.nextId() ); assertEquals( 5, subRange.nextId() ); assertEquals( VALUE_REPRESENTING_NULL, subRange.nextId() ); // when subRange = iterator.nextIdBatch( 2 ).iterator(); // then assertEquals( 9, iterator.nextId() ); assertEquals( 7, subRange.nextId() ); assertEquals( 8, subRange.nextId() ); assertEquals( VALUE_REPRESENTING_NULL, subRange.nextId() ); }
@Test public void shouldGetNextIdBatchFromSomeRangeIdsWhenThereAreUsedDefragIds() { // given IdRangeIterator iterator = new IdRange( new long[] {0, 1, 2}, 3, 10 ).iterator(); iterator.nextId(); iterator.nextId(); iterator.nextId(); // when IdRangeIterator subRange = iterator.nextIdBatch( 3 ).iterator(); // then assertEquals( 6, iterator.nextId() ); assertEquals( 3, subRange.nextId() ); assertEquals( 4, subRange.nextId() ); assertEquals( 5, subRange.nextId() ); assertEquals( VALUE_REPRESENTING_NULL, subRange.nextId() ); // when subRange = iterator.nextIdBatch( 3 ).iterator(); // then assertEquals( 10, iterator.nextId() ); assertEquals( 7, subRange.nextId() ); assertEquals( 8, subRange.nextId() ); assertEquals( 9, subRange.nextId() ); assertEquals( VALUE_REPRESENTING_NULL, subRange.nextId() ); } }
@Test public void shouldGetNextIdBatchFromSomeDefragAndSomeRangeIds() { // given IdRangeIterator iterator = new IdRange( new long[] {1, 2, 3}, 10, 5 ).iterator(); iterator.nextId(); // when IdRangeIterator subRange = iterator.nextIdBatch( 5 ).iterator(); // then assertEquals( 13, iterator.nextId() ); assertEquals( 2, subRange.nextId() ); assertEquals( 3, subRange.nextId() ); assertEquals( 10, subRange.nextId() ); assertEquals( 11, subRange.nextId() ); assertEquals( 12, subRange.nextId() ); assertEquals( VALUE_REPRESENTING_NULL, subRange.nextId() ); }
@Override public synchronized IdRange nextIdBatch( int size ) { IdRange idBatch = getReusableIdBatch( size ); if ( idBatch.totalSize() > 0 ) { return idBatch; } IdRange range = idQueue.nextIdBatch( size ); if ( range.totalSize() == 0 ) { acquireNextIdBatch(); range = idQueue.nextIdBatch( size ); setHighId( range.getHighId() ); } return range; }