// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.core.sort.common;
import java.util.Comparator;
import java.util.Random;
import org.junit.Assert;
import org.junit.Test;
import org.openstreetmap.osmosis.core.lifecycle.ReleasableIterator;
import org.openstreetmap.osmosis.core.store.SingleClassObjectSerializationFactory;
/**
* Tests the {@link FileBasedSort} class.
*/
public class FileBasedSortTest {
/**
* Stores a large number of items into the file-based sorter and verifies
* that they are returned in the correct sequence. It exceeds the in-memory
* sorting limit, but doesn't trigger additional persistence at sub-levels
* in the merge sort to minimise file handles as this would take too much
* time for a unit test. The item count must be greater than
* (MAX_MEMORY_SORT_COUNT * (MAX_MERGE_SOURCE_COUNT ^
* MAX_MEMORY_SORT_DEPTH)) to trigger intermediate persistence.
*/
@Test
public void test() {
final long itemCount = 10000;
// Create a new file-based sorter for the TestStoreable type.
SingleClassObjectSerializationFactory objectFactory = new SingleClassObjectSerializationFactory(
SampleStoreable.class);
Comparator<SampleStoreable> comparator = new Comparator<SampleStoreable>() {
@Override
public int compare(SampleStoreable o1, SampleStoreable o2) {
long value1 = o1.getValue();
long value2 = o2.getValue();
if (value1 > value2) {
return 1;
} else if (value1 < value2) {
return -1;
} else {
return 0;
}
}
};
try (FileBasedSort<SampleStoreable> fileBasedSort =
new FileBasedSort<SampleStoreable>(objectFactory, comparator, true)) {
// Add randomly generated test values into the sorter.
Random random = new Random();
for (long i = 0; i < itemCount; i++) {
fileBasedSort.add(new SampleStoreable(random.nextInt()));
}
// Read back all values in the sorter and verify that they are
// sorted correctly.
try (ReleasableIterator<SampleStoreable> resultIterator = fileBasedSort.iterate()) {
int lastValue = Integer.MIN_VALUE;
while (resultIterator.hasNext()) {
int currentValue = resultIterator.next().getValue();
Assert.assertTrue(currentValue >= lastValue);
lastValue = currentValue;
}
}
}
}
}