package com.codiform.moo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import org.junit.Assert; import org.junit.Test; import com.codiform.moo.annotation.CollectionProperty; /** * Testing how properties that contain collection classes are translated. */ public class CollectionPropertyTranslationTest { /** * Defensively copy collections. */ @Test public void testTranslateCopiesCollections() { List<String> before = Arrays.asList( "a", "b", "c" ); TestDto dto = new Moo().translate( new StringsDomain( before ), TestDto.class ); Assert.assertEquals( before, dto.getStrings() ); assertNotSame( before, dto.getStrings() ); assertEquals( before, dto.getStrings() ); } /** * Use the collection's source when translating collection properties. */ @Test public void testUseCollectionSourceWhenTranslatingCollection() { OrdinalList ordinals = new OrdinalList( new Ordinal( 1, "first" ), new Ordinal( 2, "second" ), new Ordinal( 3, "third" ) ); NumberedListDto ordinalsDto = new Moo().translate( ordinals, NumberedListDto.class ); Assert.assertNotNull( ordinalsDto.getNumbers() ); Assert.assertEquals( ordinals.getOrdinals().size(), ordinalsDto.getNumbers().size() ); for ( int index = 0; index < ordinals.getOrdinals().size(); index++ ) { Ordinal ordinal = ordinals.getOrdinals().get( index ); OrdinalDto ordinalDto = ordinalsDto.getNumbers().get( index ); Assert.assertEquals( ordinal.getRank(), ordinalDto.getRank() ); Assert.assertEquals( ordinal.getName(), ordinalDto.getName() ); } } /** * Safely copy nulls inside collections. */ @Test public void testCopiesNullsInsideCollections() { List<String> before = Arrays.asList( "a", "b", null, "c" ); TestDto dto = new Moo().translate( new StringsDomain( before ), TestDto.class ); Assert.assertEquals( before, dto.getStrings() ); } @Test public void testTranslatesCollectionsOfTranslations() { OrdinalList ordinals = new OrdinalList( new Ordinal( 1, "first" ), new Ordinal( 2, "second" ), new Ordinal( 3, "third" ) ); OrdinalListDto ordinalsDto = new Moo().translate( ordinals, OrdinalListDto.class ); Assert.assertNotNull( ordinalsDto.getOrdinals() ); Assert.assertEquals( ordinals.getOrdinals().size(), ordinalsDto.getOrdinals().size() ); for ( int index = 0; index < ordinals.getOrdinals().size(); index++ ) { Ordinal ordinal = ordinals.getOrdinals().get( index ); OrdinalDto ordinalDto = ordinalsDto.getOrdinals().get( index ); Assert.assertEquals( ordinal.getRank(), ordinalDto.getRank() ); Assert.assertEquals( ordinal.getName(), ordinalDto.getName() ); } } public static class OrdinalList { private List<Ordinal> ordinals; public OrdinalList( Ordinal... ordinals ) { this.ordinals = Arrays.asList( ordinals ); } public List<Ordinal> getOrdinals() { return ordinals; } } public static class OrdinalSortedSet { private SortedSet<Ordinal> ordinals; public OrdinalSortedSet( Ordinal... ordinals ) { this.ordinals = new TreeSet<Ordinal>(); for ( Ordinal item : ordinals ) this.ordinals.add( item ); } public SortedSet<Ordinal> getOrdinals() { return ordinals; } } public static class OrdinalSet { private Set<Ordinal> ordinals; public OrdinalSet( Ordinal... ordinals ) { this.ordinals = new LinkedHashSet<Ordinal>(); for ( Ordinal item : ordinals ) this.ordinals.add( item ); } public Set<Ordinal> getOrdinals() { return ordinals; } } public static class Ordinal implements Comparable<Ordinal> { private int rank; private String name; public Ordinal( int rank, String name ) { this.rank = rank; this.name = name; } public int getRank() { return rank; } public String getName() { return name; } public int compareTo( Ordinal o ) { return rank - o.rank; } } public static class OrdinalListDto { @CollectionProperty( itemClass = OrdinalDto.class ) private List<OrdinalDto> ordinals; public List<OrdinalDto> getOrdinals() { return ordinals; } } public static class NumberedListDto { @CollectionProperty( source = "ordinals", itemClass = OrdinalDto.class ) private List<OrdinalDto> numbers; public List<OrdinalDto> getNumbers() { return numbers; } } public static class OrdinalSetDto { @CollectionProperty( itemClass = OrdinalDto.class ) private SortedSet<OrdinalDto> ordinals; public SortedSet<OrdinalDto> getOrdinals() { return ordinals; } } public static class OrdinalDto implements Comparable<OrdinalDto> { private int rank; private String name; public int getRank() { return rank; } public String getName() { return name; } public int compareTo( OrdinalDto other ) { return rank - other.rank; } } public static class StringsDomain { private List<String> strings; public StringsDomain( List<String> strings ) { this.strings = strings; } public List<String> getStrings() { return strings; } } public static class TestDto { private List<String> strings; public List<String> getStrings() { return strings; } } }