package org.springframework.data.cassandra.test.unit.mapidfactory;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.springframework.data.cassandra.repository.support.IdInterfaceValidator.validate;
import static org.springframework.data.cassandra.repository.support.MapIdFactory.id;
import java.io.Serializable;
import java.util.Random;
import org.junit.Test;
import org.springframework.data.cassandra.repository.MapId;
import org.springframework.data.cassandra.repository.support.IdInterfaceExceptions;
public class MapIdFactoryTest {
interface HappyExtendingMapIdAndSerializable extends MapId, Serializable {
HappyExtendingMapIdAndSerializable string(String s);
void setString(String s);
HappyExtendingMapIdAndSerializable withString(String s);
String string();
String getString();
HappyExtendingMapIdAndSerializable number(Integer i);
void setNumber(Integer i);
Integer number();
Integer getNumber();
}
@Test
public void testHappyExtendingMapId() {
Random r = new Random();
String s = "" + r.nextInt();
Integer i = new Integer(r.nextInt());
HappyExtendingMapIdAndSerializable id = id(HappyExtendingMapIdAndSerializable.class);
assertNull(id.string());
assertNull(id.number());
assertNull(id.getString());
assertNull(id.getNumber());
id.setNumber(i);
assertEquals(i, id.getNumber());
assertEquals(i, id.number());
assertEquals(i, id.get("number"));
HappyExtendingMapIdAndSerializable returned = null;
returned = id.number(i = r.nextInt());
assertSame(returned, id);
assertEquals(i, id.getNumber());
assertEquals(i, id.number());
assertEquals(i, id.get("number"));
id.put("number", i = r.nextInt());
assertEquals(i, id.getNumber());
assertEquals(i, id.number());
assertEquals(i, id.get("number"));
id.setString(s);
assertEquals(s, id.getString());
assertEquals(s, id.string());
assertEquals(s, id.get("string"));
returned = id.string(s = "" + r.nextInt());
assertSame(returned, id);
assertEquals(s, id.getString());
assertEquals(s, id.string());
assertEquals(s, id.get("string"));
returned = id.withString(s = "" + r.nextInt());
assertSame(returned, id);
assertEquals(s, id.getString());
assertEquals(s, id.string());
assertEquals(s, id.get("string"));
id.put("string", s = "" + r.nextInt());
assertEquals(s, id.getString());
assertEquals(s, id.string());
assertEquals(s, id.get("string"));
id.setString(null);
assertNull(id.getString());
assertNull(id.string());
assertNull(id.get("string"));
id.setNumber(null);
assertNull(id.getNumber());
assertNull(id.number());
assertNull(id.get("number"));
}
interface HappyExtendingNothing {
HappyExtendingNothing string(String s);
void setString(String s);
HappyExtendingNothing withString(String s);
String string();
String getString();
HappyExtendingNothing number(Integer i);
void setNumber(Integer i);
Integer number();
Integer getNumber();
}
@Test
public void testHappyExtendingNothing() {
Random r = new Random();
String s = "" + r.nextInt();
Integer i = new Integer(r.nextInt());
HappyExtendingNothing id = id(HappyExtendingNothing.class);
assertTrue(id instanceof Serializable);
assertTrue(id instanceof MapId);
MapId mapid = (MapId) id;
assertNull(id.string());
assertNull(id.number());
assertNull(id.getString());
assertNull(id.getNumber());
id.setNumber(i);
assertEquals(i, id.getNumber());
assertEquals(i, id.number());
assertEquals(i, mapid.get("number"));
HappyExtendingNothing returned = null;
returned = id.number(i = r.nextInt());
assertSame(returned, id);
assertEquals(i, id.getNumber());
assertEquals(i, id.number());
assertEquals(i, mapid.get("number"));
mapid.put("number", i = r.nextInt());
assertEquals(i, id.getNumber());
assertEquals(i, id.number());
assertEquals(i, mapid.get("number"));
id.setString(s);
assertEquals(s, id.getString());
assertEquals(s, id.string());
assertEquals(s, mapid.get("string"));
returned = id.string(s = "" + r.nextInt());
assertSame(returned, id);
assertEquals(s, id.getString());
assertEquals(s, id.string());
assertEquals(s, mapid.get("string"));
returned = id.withString(s = "" + r.nextInt());
assertSame(returned, id);
assertEquals(s, id.getString());
assertEquals(s, id.string());
assertEquals(s, mapid.get("string"));
mapid.put("string", s = "" + r.nextInt());
assertEquals(s, id.getString());
assertEquals(s, id.string());
assertEquals(s, mapid.get("string"));
id.setString(null);
assertNull(id.getString());
assertNull(id.string());
assertNull(mapid.get("string"));
id.setNumber(null);
assertNull(id.getNumber());
assertNull(id.number());
assertNull(mapid.get("number"));
}
class IdClass {}
interface Foo {}
interface IdExtendingNotMapId extends Foo {}
interface LiteralGet {
String get();
}
interface GetterReturningVoid {
void getString();
}
interface GetReturningVoid {
void string();
}
interface GetReturningNonSerializable {
Object getFoo();
}
interface MethodWithMoreThanOneArgument {
void foo(Object a, Object b);
}
interface LiteralSet {
void set(String s);
}
interface LiteralWith {
void with(String s);
}
interface SetterMethodNotReturningVoidOrThis {
String string(String s);
}
interface SetMethodNotReturningVoidOrThis {
String setString(String s);
}
interface WithMethodNotReturningVoidOrThis {
String withString(String s);
}
interface SetterMethodTakingNonSerializable {
void string(Object o);
}
interface SetMethodTakingNonSerializable {
void string(Object o);
}
interface WithMethodTakingNonSerializable {
void string(Object o);
}
@Test
public void testUnhappies() {
Class<?>[] interfaces = new Class<?>[] { IdClass.class, IdExtendingNotMapId.class, LiteralGet.class,
GetterReturningVoid.class, GetReturningVoid.class, GetReturningNonSerializable.class,
MethodWithMoreThanOneArgument.class, LiteralSet.class, LiteralWith.class,
SetterMethodNotReturningVoidOrThis.class, SetMethodNotReturningVoidOrThis.class,
WithMethodNotReturningVoidOrThis.class, SetterMethodTakingNonSerializable.class,
SetMethodTakingNonSerializable.class, WithMethodTakingNonSerializable.class };
for (Class<?> i : interfaces) {
try {
validate(i);
fail("should've caught IdInterfaceException validating interface " + i);
} catch (IdInterfaceExceptions e) {
assertEquals(1, e.getCount());
}
}
}
}