package org.javersion.object; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; import java.util.Map; import org.javersion.object.PolymorphismTest.Cat; import org.javersion.object.PolymorphismTest.Dog; import org.javersion.object.PolymorphismTest.Pet; import org.javersion.path.PropertyPath; import org.junit.Test; import com.google.common.collect.Lists; public class ListTest { @Versionable public static class Owner { private List<Pet> pets; } private TypeMappings typeMappings = TypeMappings.builder() .withClass(Pet.class) .havingSubClasses(Dog.class, Cat.class) .build(); private final ObjectSerializer<Owner> serializer = new ObjectSerializer<>(Owner.class, typeMappings); @Test public void Write_And_Read_Owner_With_Cats_And_Dogs() { Owner owner = new Owner(); owner.pets = Lists.newArrayList(new Cat("Mirri"), null, new Dog("Musti"), null); Map<PropertyPath, Object> map = serializer.toPropertyMap(owner); owner = serializer.fromPropertyMap(map); // Trailing nulls are truncated! assertThat(owner.pets, hasSize(3)); assertThat(owner.pets.get(0), instanceOf(Cat.class)); assertThat(owner.pets.get(0).name, equalTo("Mirri")); assertThat(((Cat) owner.pets.get(0)).meow, equalTo(true)); assertThat(owner.pets.get(1), nullValue()); assertThat(owner.pets.get(2), instanceOf(Dog.class)); assertThat(owner.pets.get(2).name, equalTo("Musti")); assertThat(((Dog) owner.pets.get(2)).bark, equalTo(true)); } @Test public void large_sparse_list() { Pet[] pets = new Pet[1100]; pets[0] = new Pet("0"); pets[5] = new Pet("5"); pets[10] = new Pet("10"); pets[40] = new Pet("40"); pets[100] = new Pet("100"); pets[300] = new Pet("300"); pets[1000] = new Pet("1000"); Owner owner = new Owner(); owner.pets = Arrays.asList(pets); assertThat(owner.pets, hasSize(1100)); owner = serializer.fromPropertyMap(serializer.toPropertyMap(owner)); assertThat(owner.pets, hasSize(1001)); assertThat(owner.pets.get(0).name, equalTo("0")); assertThat(owner.pets.get(1), nullValue()); assertThat(owner.pets.get(5).name, equalTo("5")); assertThat(owner.pets.get(9), nullValue()); assertThat(owner.pets.get(10).name, equalTo("10")); assertThat(owner.pets.get(40).name, equalTo("40")); assertThat(owner.pets.get(100).name, equalTo("100")); assertThat(owner.pets.get(300).name, equalTo("300")); assertThat(owner.pets.get(1000).name, equalTo("1000")); } }