package org.simpleflatmapper.test.core.mapper;
import org.junit.Assert;
import org.simpleflatmapper.map.FieldKey;
import org.simpleflatmapper.map.mapper.MapperKey;
import org.simpleflatmapper.map.mapper.MapperKeyComparator;
import org.simpleflatmapper.util.ListCollector;
import org.simpleflatmapper.util.CheckedConsumer;
import java.lang.reflect.Array;
import java.util.Random;
public class MapperKeyComparatorTest {
private static final String[] COLUMNS = new String[] {
"id",
"firstname",
"lastname",
"age",
"postcode",
"address",
"city"
};
private static final Random random = new Random();
@SuppressWarnings("unchecked")
public static <K extends FieldKey<K>> MapperKey<K>[] generateKeys(KeyProducer<K> producer) throws Exception {
ListCollector<MapperKey<K>> collector = new ListCollector<MapperKey<K>>();
for(int i = 0; i < 1000; i++) {
producer.produces(collector, names(random));
}
return collector.getList().toArray(new MapperKey[0]);
}
private static String[] names(Random random) {
int size = random.nextInt(COLUMNS.length);
String[] names = new String[size];
for(int i = 0; i < names.length; i++) {
names[i] = COLUMNS[random.nextInt(COLUMNS.length)];
}
return names;
}
public static <K extends FieldKey<K>> void testComparator(KeyProducer<K> producer, MapperKeyComparator<K> comparator) throws Exception {
MapperKey<K>[] keys = generateKeys(producer);
for(int i = 0; i < keys.length; i++ ){
for (int j = 0; j < keys.length; j++) {
MapperKey<K> key1 = keys[i];
MapperKey<K> key2 = keys[j];
if (key1.equals(key2)) {
Assert.assertEquals(0, comparator.compare(key1, key2));
Assert.assertEquals(0, comparator.compare(key2, key1));
} else {
int d = comparator.compare(key1, key2);
Assert.assertFalse(d == 0);
if (d < 0) {
Assert.assertTrue(comparator.compare(key2, key1) > 0);
} else {
Assert.assertTrue(comparator.compare(key2, key1) < 0);
}
}
Assert.assertEquals(0, comparator.compare(key2, key2));
Assert.assertEquals(0, comparator.compare(key1, key1));
}
}
}
public interface KeyProducer<K extends FieldKey<K>> {
void produces(CheckedConsumer<MapperKey<K>> consumer, String[] names) throws Exception;
}
public static abstract class AbstractKeyProducer<K extends FieldKey<K>> implements KeyProducer<K> {
private final Class<K> keyClass;
protected AbstractKeyProducer(Class<K> keyClass) {
this.keyClass = keyClass;
}
@SuppressWarnings("unchecked")
@Override
public void produces(CheckedConsumer<MapperKey<K>> consumer, String[] names) throws Exception {
K[] columns1 = (K[]) Array.newInstance(keyClass, names.length);
K[] columns2 = (K[]) Array.newInstance(keyClass, names.length);
for(int i = 0; i < names.length; i++) {
columns1[i] = newKey(names[i], i);
columns2[i] = newKey(names[i], i+1);
}
consumer.accept(new MapperKey<K>(columns1));
consumer.accept(new MapperKey<K>(columns2));
}
protected abstract K newKey(String name, int i);
}
}