/*
* Copyright (c) 2017 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.magma.type;
import java.util.ArrayList;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import org.obiba.magma.Value;
import org.obiba.magma.ValueSequence;
import org.obiba.magma.ValueType;
import org.obiba.magma.test.AbstractMagmaTest;
import static org.fest.assertions.api.Assertions.assertThat;
public abstract class BaseValueTypeTest extends AbstractMagmaTest {
abstract ValueType getValueType();
abstract Object getObjectForType();
abstract boolean isNumeric();
abstract boolean isDateTime();
abstract Iterable<Class<?>> validClasses();
ValueSequence getSequence(int size) {
Collection<Value> values = new ArrayList<>(size);
for(int i = 0; i < size; i++) {
values.add(getValueType().valueOf(getObjectForType()));
}
return getValueType().sequenceOf(values);
}
@Before
@Override
public void before() {
super.before();
assertThat(getValueType()).isNotNull();
assertThat(getObjectForType()).isNotNull();
}
@Test
public void testNameIsNotEmpty() {
assertThat(getValueType().getName()).isNotNull();
assertThat(getValueType().getName().length() > 0).isTrue();
}
@Test
public void testJavaTypeNotEmpty() {
Class<?> javaClass = getValueType().getJavaClass();
assertThat(javaClass).isNotNull();
assertThat(getValueType().acceptsJavaClass(javaClass)).isTrue();
}
@Test
public void testNullValueNotNull() {
Value nullValue = getValueType().nullValue();
assertThat(nullValue).isNotNull();
assertThat(nullValue.isNull()).isTrue();
}
@Test
public void testToStringOfNullValue() {
Value nullValue = getValueType().nullValue();
String nullString = nullValue.toString();
assertThat(nullString).isNull();
}
@Test
public void testValueOfNullString() {
Value nullValue = getValueType().valueOf((String) null);
assertThat(nullValue).isNotNull();
assertThat(nullValue.isNull()).isTrue();
}
@Test
public void testValueOfNullObject() {
Value nullValue = getValueType().valueOf((Object) null);
assertThat(nullValue).isNotNull();
assertThat(nullValue.isNull()).isTrue();
}
@Test
public void testValueFromObjectIsNotNull() {
Object valueObject = getObjectForType();
Value value = getValueType().valueOf(valueObject);
assertThat(value).isNotNull();
assertThat(value.isNull()).isFalse();
assertThat(value.isSequence()).isFalse();
}
@Test
public void testValueObjectIsEqual() {
Object valueObject = getObjectForType();
Value value = getValueType().valueOf(valueObject);
assertThat(valueObject).isEqualTo(value.getValue());
}
@Test
public void testToStringOfValueObjectIsNotNull() {
Object valueObject = getObjectForType();
Value value = getValueType().valueOf(valueObject);
assertThat(value.toString()).isNotNull();
}
@Test
public void testValueOfToStringIsEqual() {
Object valueObject = getObjectForType();
Value value = getValueType().valueOf(valueObject);
String strValue = value.toString();
Value valueOf = getValueType().valueOf(strValue);
assertThat(valueOf).isNotNull();
assertThat(value).isEqualTo(valueOf);
}
@Test
public void testValueOfToStringSequence() {
ValueSequence sequence = getSequence(5);
String strValue = sequence.toString();
Value valueOf = getValueType().sequenceOf(strValue);
assertThat(valueOf).isNotNull();
assertThat(sequence).isEqualTo((ValueSequence) valueOf);
}
@Test(expected = NullPointerException.class)
public void testCompareWithNullArguments() throws Exception {
getValueType().compare(null, null);
}
@Test(expected = NullPointerException.class)
public void testCompareWithLeftNullArgument() throws Exception {
Value value = getValueType().valueOf(getObjectForType());
getValueType().compare(null, value);
}
@Test(expected = NullPointerException.class)
public void testCompareWithRightNullArgument() throws Exception {
Value value = getValueType().valueOf(getObjectForType());
getValueType().compare(value, null);
}
@Test
public void test_isNumeric() {
assertThat(isNumeric()).isEqualTo(getValueType().isNumeric());
}
@Test
public void test_isDateTime() {
assertThat(isDateTime()).isEqualTo(getValueType().isDateTime());
}
@Test
public void test_acceptsJavaClass() {
for(Class<?> validClass : validClasses()) {
assertThat(getValueType().acceptsJavaClass(validClass)).isTrue();
}
}
@Test
public void test_acceptsJavaClass_doesNotAcceptInvalidClass() {
assertThat(getValueType().acceptsJavaClass(NullPointerException.class)).isFalse();
}
}