package fr.openwide.core.test.commons.util; import static org.junit.Assert.assertEquals; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.text.Collator; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Locale; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import fr.openwide.core.commons.util.ordering.SerializableCollator; @RunWith(Parameterized.class) public class TestSerializableCollator { private static final Iterable<Collection<String>> COMPARISON_TEST_DATA = ImmutableList.<Collection<String>>of( ImmutableList.of("this", "is", "test", "data", "Test"), ImmutableList.of("Et un", "autre", "aûtre", "avéc", "avec", "dès", "des", "dés", "àcçents", "accents") ); private static Iterable<Locale> locales() { return ImmutableList.of(Locale.ROOT, Locale.FRENCH, Locale.ENGLISH, Locale.US, Locale.UK); } private static Iterable<Integer> strengths() { return ImmutableList.of(Collator.IDENTICAL, Collator.TERTIARY, Collator.SECONDARY, Collator.PRIMARY); } private static Iterable<Integer> decompositions() { return ImmutableList.of(Collator.FULL_DECOMPOSITION, Collator.CANONICAL_DECOMPOSITION, Collator.NO_DECOMPOSITION); } @Parameters public static Iterable<Object[]> data() { ImmutableList.Builder<Object[]> builder = ImmutableList.builder(); for (Locale locale : locales()) { for (int strength : strengths()) { for (int decomposition : decompositions()) { builder.add(new Object[] {locale, strength, decomposition }); } } } return builder.build(); } private final Collator collator; private final SerializableCollator serializableCollator; public TestSerializableCollator(Locale locale, int strength, int decomposition) { collator = Collator.getInstance(locale); serializableCollator = new SerializableCollator(locale); collator.setStrength(strength); serializableCollator.setStrength(strength); collator.setDecomposition(decomposition); serializableCollator.setDecomposition(decomposition); } @SuppressWarnings("unchecked") private static <T> T serializeAndDeserialize(T object) { byte[] array; try { ByteArrayOutputStream arrayOut = new ByteArrayOutputStream(); ObjectOutputStream objectOut = new ObjectOutputStream(arrayOut); objectOut.writeObject(object); array = arrayOut.toByteArray(); } catch (IOException e) { throw new RuntimeException("Error while serializing " + object, e); } try { ByteArrayInputStream arrayIn = new ByteArrayInputStream(array); ObjectInputStream objectIn = new ObjectInputStream(arrayIn); return (T) objectIn.readObject(); } catch (IOException | ClassNotFoundException e) { throw new RuntimeException("Error while deserializing " + object, e); } } @Test public void testSameComparisonAsCollator() { doTestSameComparison(collator, serializableCollator); } @Test public void testSerialization() { SerializableCollator deserialized = serializeAndDeserialize(serializableCollator); assertEquals(serializableCollator, deserialized); doTestSameComparison(collator, deserialized); } public static void doTestSameComparison(Comparator<? super String> expected, Comparator<? super String> actual) { for (Collection<String> collection : COMPARISON_TEST_DATA) { List<String> expectedList = Lists.newArrayList(collection); List<String> actualList = Lists.newArrayList(collection); Collections.sort(expectedList, expected); Collections.sort(actualList, actual); assertEquals(expectedList, actualList); } } }