diff --git a/src/main/java/net/kemitix/mon/TypeAlias.java b/src/main/java/net/kemitix/mon/TypeAlias.java index f5e7636..f5dc0c5 100644 --- a/src/main/java/net/kemitix/mon/TypeAlias.java +++ b/src/main/java/net/kemitix/mon/TypeAlias.java @@ -38,13 +38,20 @@ public abstract class TypeAlias { */ private final T value; + private final Class type; + /** * Constructor. * * @param value the value + * @param type the type of the value */ - protected TypeAlias(final T value) { + protected TypeAlias( + final T value, + final Class type + ) { this.value = value; + this.type = type; } /** @@ -56,25 +63,30 @@ public abstract class TypeAlias { * @return a TypeAlias */ public final R map(final Function f) { - return f.apply(value); + return f.apply(getValue()); } @Override public final int hashCode() { - return value.hashCode(); + return getValue().hashCode(); } @Override + @SuppressWarnings("unchecked") public final boolean equals(final Object o) { if (o instanceof TypeAlias) { - return value.equals(((TypeAlias) o).value); + if (((TypeAlias) o).type.equals(type)) { + return ((TypeAlias) o).map(getValue()::equals); + } else { + return false; + } } - return value.equals(o); + return map(o::equals); } @Override public final String toString() { - return value.toString(); + return getValue().toString(); } /** @@ -82,7 +94,7 @@ public abstract class TypeAlias { * * @return the value */ - public T getValue() { + private T getValue() { return value; } } diff --git a/src/test/java/net/kemitix/mon/TypeAliasTest.java b/src/test/java/net/kemitix/mon/TypeAliasTest.java index b6fb753..41c4222 100644 --- a/src/test/java/net/kemitix/mon/TypeAliasTest.java +++ b/src/test/java/net/kemitix/mon/TypeAliasTest.java @@ -2,6 +2,7 @@ package net.kemitix.mon; import org.junit.Test; +import java.util.Collections; import java.util.function.Function; import static org.assertj.core.api.Assertions.assertThat; @@ -13,10 +14,26 @@ public class TypeAliasTest { //given final String value = "value"; //when - final TypeAlias typeAlias = new TypeAlias(value) { + final TypeAlias typeAlias = givenTypeAlias(value); + //then + assertThat(typeAlias.map(value::equals)).isTrue(); + } + + @Test + public void shouldCreateATypeAliasWithNestedGenericTypes() { + //given + final Iterable iterable = Collections.emptyList(); + //when + final TypeAlias> typeAlias = + new TypeAlias>(iterable, Iterable.class) { }; //then - assertThat(typeAlias.getValue()).isEqualTo(value); + assertThat(typeAlias.map(iterable::equals)).isTrue(); + } + + private TypeAlias givenTypeAlias(final String value) { + return new TypeAlias(value, String.class) { + }; } @Test @@ -26,7 +43,16 @@ public class TypeAliasTest { //when final AnAlias anAlias = AnAlias.of(value); //then - assertThat(anAlias.getValue()).isEqualTo(value); + assertThat(anAlias.map(value::equals)).isTrue(); + } + + @Test + public void shouldNotBeEqualWhenValueTypesAreDifferent() { + //given + final TypeAlias stringTypeAlias = givenTypeAlias("1"); + final TypeAlias integerTypeAlias = new TypeAlias(1, Integer.class){}; + //then + assertThat(stringTypeAlias).isNotEqualTo(integerTypeAlias); } @Test @@ -86,7 +112,7 @@ public class TypeAliasTest { * @param value the value */ protected AnAlias(final String value) { - super(value); + super(value, String.class); } protected static AnAlias of(final String value) {