package com.codiform.moo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
import com.codiform.moo.annotation.CollectionProperty;
import com.codiform.moo.curry.Translate;
public class EnumCollectionPropertyTranslationTest {
@Test
public void testTranslateContainerWithStaticCustomTranslationForContents() {
NatoLetterContainer source = new NatoLetterContainer( NatoLetter.JULIA,
NatoLetter.SIERRA );
ShallowCopyDto dest = Translate.to( ShallowCopyDto.class ).from(
source );
assertEquals( 2, dest.getLetters().size() );
assertTrue( dest.getLetters().contains( NatoLetter.JULIA ) );
assertTrue( dest.getLetters().contains( NatoLetter.SIERRA ) );
}
@Test
public void testTranslateContainerToStringContainerUsingVariable() {
NatoLetterContainer source = new NatoLetterContainer(
NatoLetter.NOVEMBER,
NatoLetter.ALFA, NatoLetter.TANGO, NatoLetter.OSCAR );
StringTranslationDto dest = Translate.to( StringTranslationDto.class ).withVariable( "enumUtil", new EnumUtil() ).from(
source );
assertEquals( 4, dest.getLetters().size() );
assertTrue( dest.getLetters().contains( "NOVEMBER" ) );
assertTrue( dest.getLetters().contains( "ALFA" ) );
assertTrue( dest.getLetters().contains( "TANGO" ) );
assertTrue( dest.getLetters().contains( "OSCAR" ) );
}
public static class NatoLetterContainer {
private Set<NatoLetter> letters;
public NatoLetterContainer() {
letters = EnumSet.noneOf( NatoLetter.class );
}
public NatoLetterContainer(NatoLetter one) {
letters = EnumSet.of( one );
}
public NatoLetterContainer(NatoLetter one, NatoLetter two) {
letters = EnumSet.of( one, two );
}
public NatoLetterContainer(NatoLetter one, NatoLetter two,
NatoLetter three) {
letters = EnumSet.of( one, two, three );
}
public NatoLetterContainer(NatoLetter one, NatoLetter two,
NatoLetter three, NatoLetter four) {
letters = EnumSet.of( one, two, three, four );
}
public Set<NatoLetter> getLetters() {
return letters;
}
}
@SuppressWarnings("unused")
private static class ShallowCopyDto {
@CollectionProperty(source = "java.util.EnumSet.copyOf(this.letters)")
private Set<NatoLetter> letters;
public ShallowCopyDto() {
letters = EnumSet.noneOf( NatoLetter.class );
}
public Set<NatoLetter> getLetters() {
return letters;
}
}
@SuppressWarnings("unused")
private static class StringTranslationDto {
@CollectionProperty(source = "enumUtil.toString(this.letters)")
private Set<String> letters;
public StringTranslationDto() {
letters = new HashSet<String>();
}
public Set<String> getLetters() {
return letters;
}
}
private static enum NatoLetter {
ALFA, BRAVO, CHARLIE, DELTA, ECHO, FOXTROT, GOLF, HOTEL, INDIA, JULIA, KILO, LIMA, MIKE, NOVEMBER, OSCAR, PAPA, QUEBEC, ROMEO, SIERRA, TANGO, UNIFORM, VICTOR, WHISKEY, XRAY, YANKEE, ZULU;
}
public static class EnumUtil {
public <E extends Enum<E>> Set<String> toString(Set<E> input) {
HashSet<String> output = new HashSet<String>();
for( E item : input ) {
output.add( item.name() );
}
return output;
}
}
}