package org.simpleflatmapper.tuple.test; import org.junit.Test; import org.simpleflatmapper.tuple.Tuple2; import org.simpleflatmapper.tuple.Tuple3; import org.simpleflatmapper.tuple.Tuple4; import org.simpleflatmapper.tuple.Tuple5; import org.simpleflatmapper.tuple.Tuples; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import static org.junit.Assert.*; public class TuplesTest { @Test public void typeDefRejectInvalidTuples() { try { Tuples.tupleImplementationTypeDef(Tuple2.class, String.class); fail("Expected Exception"); } catch(Exception e) { // expected } } @Test public void typeDef() { ParameterizedType parameterizedType = Tuples.typeDef(String.class, Integer.class); assertEquals(Tuple2.class, parameterizedType.getRawType()); assertNull(parameterizedType.getOwnerType()); assertEquals(2, parameterizedType.getActualTypeArguments().length); assertEquals(String.class, parameterizedType.getActualTypeArguments()[0]); assertEquals(Integer.class, parameterizedType.getActualTypeArguments()[1]); } Tuple2<String, String> tuple2 = new Tuple2<String, String>("aa", "bb"); Tuple3<String, String, String> tuple3 = tuple2.tuple3("cc"); Tuple4<String, String, String, String> tuple4 = tuple3.tuple4("dd"); Tuple5<String, String, String, String, String> tuple5 = tuple4.tuple5("ee"); @Test public void testTuple2() { assertEquals(new Tuple2<String, String>("aa", "bb"), tuple2); assertEquals(new Tuple2<String, String>("aa", "bb").hashCode(), tuple2.hashCode()); assertNotEquals(new Tuple2<String, String>("aa", "bbb"), tuple2); assertNotEquals(new Tuple2<String, String>("aa", "bbb").hashCode(), tuple2.hashCode()); assertNotEquals(new Tuple2<String, String>("aaa", "bb"), tuple2); assertEquals("Tuple2{element0=aa, element1=bb}", tuple2.toString()); } @Test public void testTuple3() { assertEquals(tuple2.tuple3("cc"), tuple3); assertNotEquals(tuple2.tuple3("ccc"), tuple3); assertEquals(tuple2.tuple3("cc").hashCode(), tuple3.hashCode()); assertNotEquals(tuple2.tuple3("ccc").hashCode(), tuple3.hashCode()); assertNotEquals(tuple2, tuple3); assertEquals("Tuple3{element0=aa, element1=bb, element2=cc}", tuple3.toString()); } @Test public void testTuple4() { assertEquals(tuple3.tuple4("dd"), tuple4); assertNotEquals(tuple3.tuple4("ddd"), tuple4); assertEquals(tuple3.tuple4("dd").hashCode(), tuple4.hashCode()); assertNotEquals(tuple3.tuple4("ddd").hashCode(), tuple4.hashCode()); assertNotEquals(tuple3, tuple4); assertEquals("Tuple4{element0=aa, element1=bb, element2=cc, element3=dd}", tuple4.toString()); } @Test public void testTuple5() { assertEquals(tuple4.tuple5("ee"), tuple5); assertNotEquals(tuple4.tuple5("eee"), tuple5); assertEquals(tuple4.tuple5("ee").hashCode(), tuple5.hashCode()); assertNotEquals(tuple4.tuple5("eee").hashCode(), tuple5.hashCode()); assertNotEquals(tuple4, tuple5); assertEquals("Tuple5{element0=aa, element1=bb, element2=cc, element3=dd, element4=ee}", tuple5.toString()); } @Test public void testTuples() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { Tuple2<?, ?> currentTuple = new Tuple2<Object, Object>("v1", "v2"); for(int i = 3; i <= 32; i++) { Method m = currentTuple.getClass().getDeclaredMethod("tuple" + i, Object.class); Tuple2<?, ?> nextTuple = (Tuple2<?, ?>) m.invoke(currentTuple, "v" + i); Tuple2<?, ?> sameTuple = (Tuple2<?, ?>) m.invoke(currentTuple, "v" + i); Tuple2<?, ?> diffTuple = (Tuple2<?, ?>) m.invoke(currentTuple, "d" + i); for(int j = 0; j < Math.min(i, 10); j++) { String m1 = "getElement" + (j); String m2 = getNumberMethod(j + 1); assertEquals(nextTuple.getClass().getMethod(m1).invoke(nextTuple), nextTuple.getClass().getMethod(m2).invoke(nextTuple)); } assertEquals(nextTuple, sameTuple); assertEquals(nextTuple.hashCode(), sameTuple.hashCode()); assertEquals(nextTuple.toString(), sameTuple.toString()); assertNotEquals(nextTuple, diffTuple); assertNotEquals(nextTuple.hashCode(), diffTuple.hashCode()); assertNotEquals(nextTuple.toString(), diffTuple.hashCode()); currentTuple = nextTuple; } } private String getNumberMethod(int i) { switch (i) { case 1: return "first"; case 2: return "second"; case 3: return "third"; case 4: return "fourth"; case 5: return "fifth"; case 6: return "sixth"; case 7: return "seventh"; case 8: return "eighth"; case 9: return "ninth"; case 10: return "tenth"; } throw new IllegalArgumentException(" " + i); } }