/*
* Copyright 2016-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.cassandra.repository.support;
import static org.assertj.core.api.Assertions.*;
import static org.springframework.data.cassandra.repository.support.IdInterfaceValidator.*;
import static org.springframework.data.cassandra.repository.support.MapIdFactory.*;
import java.io.Serializable;
import java.util.Random;
import org.junit.Test;
import org.springframework.data.cassandra.repository.MapId;
/**
* Unit tests for {@link MapIdFactory}.
*
* @author Matthew T. Adams
* @author Mark Paluch
*/
public class MapIdFactoryUnitTests {
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);
assertThat(id.string()).isNull();
assertThat(id.number()).isNull();
assertThat(id.getString()).isNull();
assertThat(id.getNumber()).isNull();
id.setNumber(i);
assertThat(id.getNumber()).isEqualTo(i);
assertThat(id.number()).isEqualTo(i);
assertThat(id.get("number")).isEqualTo(i);
HappyExtendingMapIdAndSerializable returned = null;
returned = id.number(i = r.nextInt());
assertThat(id).isSameAs(returned);
assertThat(id.getNumber()).isEqualTo(i);
assertThat(id.number()).isEqualTo(i);
assertThat(id.get("number")).isEqualTo(i);
id.put("number", i = r.nextInt());
assertThat(id.getNumber()).isEqualTo(i);
assertThat(id.number()).isEqualTo(i);
assertThat(id.get("number")).isEqualTo(i);
id.setString(s);
assertThat(id.getString()).isEqualTo(s);
assertThat(id.string()).isEqualTo(s);
assertThat(id.get("string")).isEqualTo(s);
returned = id.string(s = "" + r.nextInt());
assertThat(id).isSameAs(returned);
assertThat(id.getString()).isEqualTo(s);
assertThat(id.string()).isEqualTo(s);
assertThat(id.get("string")).isEqualTo(s);
returned = id.withString(s = "" + r.nextInt());
assertThat(id).isSameAs(returned);
assertThat(id.getString()).isEqualTo(s);
assertThat(id.string()).isEqualTo(s);
assertThat(id.get("string")).isEqualTo(s);
id.put("string", s = "" + r.nextInt());
assertThat(id.getString()).isEqualTo(s);
assertThat(id.string()).isEqualTo(s);
assertThat(id.get("string")).isEqualTo(s);
id.setString(null);
assertThat(id.getString()).isNull();
assertThat(id.string()).isNull();
assertThat(id.get("string")).isNull();
id.setNumber(null);
assertThat(id.getNumber()).isNull();
assertThat(id.number()).isNull();
assertThat(id.get("number")).isNull();
}
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);
assertThat(id instanceof Serializable).isTrue();
assertThat(id instanceof MapId).isTrue();
MapId mapid = (MapId) id;
assertThat(id.string()).isNull();
assertThat(id.number()).isNull();
assertThat(id.getString()).isNull();
assertThat(id.getNumber()).isNull();
id.setNumber(i);
assertThat(id.getNumber()).isEqualTo(i);
assertThat(id.number()).isEqualTo(i);
assertThat(mapid.get("number")).isEqualTo(i);
HappyExtendingNothing returned = null;
returned = id.number(i = r.nextInt());
assertThat(id).isSameAs(returned);
assertThat(id.getNumber()).isEqualTo(i);
assertThat(id.number()).isEqualTo(i);
assertThat(mapid.get("number")).isEqualTo(i);
mapid.put("number", i = r.nextInt());
assertThat(id.getNumber()).isEqualTo(i);
assertThat(id.number()).isEqualTo(i);
assertThat(mapid.get("number")).isEqualTo(i);
id.setString(s);
assertThat(id.getString()).isEqualTo(s);
assertThat(id.string()).isEqualTo(s);
assertThat(mapid.get("string")).isEqualTo(s);
returned = id.string(s = "" + r.nextInt());
assertThat(id).isSameAs(returned);
assertThat(id.getString()).isEqualTo(s);
assertThat(id.string()).isEqualTo(s);
assertThat(mapid.get("string")).isEqualTo(s);
returned = id.withString(s = "" + r.nextInt());
assertThat(id).isSameAs(returned);
assertThat(id.getString()).isEqualTo(s);
assertThat(id.string()).isEqualTo(s);
assertThat(mapid.get("string")).isEqualTo(s);
mapid.put("string", s = "" + r.nextInt());
assertThat(id.getString()).isEqualTo(s);
assertThat(id.string()).isEqualTo(s);
assertThat(mapid.get("string")).isEqualTo(s);
id.setString(null);
assertThat(id.getString()).isNull();
assertThat(id.string()).isNull();
assertThat(mapid.get("string")).isNull();
id.setNumber(null);
assertThat(id.getNumber()).isNull();
assertThat(id.number()).isNull();
assertThat(mapid.get("number")).isNull();
}
class IdClass {}
interface Foo {}
interface LiteralGet {
String get();
}
interface GetterReturningVoid {
void getString();
}
interface GetReturningVoid {
void string();
}
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);
}
@Test
public void testUnhappies() {
Class<?>[] interfaces = new Class<?>[] { IdClass.class, LiteralGet.class, GetterReturningVoid.class,
GetReturningVoid.class, MethodWithMoreThanOneArgument.class, LiteralSet.class, LiteralWith.class,
SetterMethodNotReturningVoidOrThis.class, SetMethodNotReturningVoidOrThis.class,
WithMethodNotReturningVoidOrThis.class };
for (Class<?> idInterface : interfaces) {
try {
validate(idInterface);
fail("should've caught IdInterfaceException validating interface " + idInterface);
} catch (IdInterfaceExceptions e) {
assertThat(e.getCount()).isEqualTo(1);
}
}
}
}