package fr.openwide.core.test.wicket.more.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import java.util.Arrays;
import java.util.Collection;
import org.apache.wicket.model.IModel;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.base.Equivalence;
import com.google.common.base.Supplier;
import com.google.common.collect.Ordering;
import fr.openwide.core.commons.util.functional.Suppliers2;
import fr.openwide.core.test.wicket.more.model.TestSerializableCollectionCopyModel.ValueEnum;
import fr.openwide.core.wicket.more.markup.repeater.collection.ICollectionModel;
import fr.openwide.core.wicket.more.model.CollectionCopyModel;
import fr.openwide.core.wicket.more.util.model.Models;
@RunWith(Parameterized.class)
public class TestSerializableCollectionCopyModel<C extends Collection<ValueEnum>>
extends AbstractTestCollectionModel<C> {
public static enum ValueEnum {
VALUE1,
VALUE2,
VALUE3;
}
@Parameters(name = "{index}: {0}, {1}")
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] {
{ Suppliers2.arrayList(), Equivalence.equals() },
{ Suppliers2.linkedList(), Equivalence.equals() },
{ Suppliers2.hashSet(), UNORDERED_SET_EQUIVALENCE },
{ Suppliers2.linkedHashSet(), Equivalence.equals() },
{ Suppliers2.treeSet(), Equivalence.equals() },
{ Suppliers2.treeSet(Ordering.natural().reverse().nullsLast()), Equivalence.equals() }
});
}
private final Supplier<? extends C> collectionSupplier;
public TestSerializableCollectionCopyModel(Supplier<? extends C> collectionSupplier, Equivalence<? super C> equivalence) {
super(equivalence);
this.collectionSupplier = collectionSupplier;
}
protected ICollectionModel<ValueEnum, C> createModel() {
return CollectionCopyModel.custom(collectionSupplier, Models.<ValueEnum>serializableModelFactory());
}
protected C createCollection(ValueEnum... items) {
C collection = collectionSupplier.get();
collection.addAll(Arrays.asList(items));
return collection;
}
protected C clone(C collection) {
C clone = collectionSupplier.get();
clone.addAll(collection);
return clone;
}
@Test
public void testNull() {
IModel<C> model = createModel();
model.setObject(null);
assertThat(model.getObject(), isEmpty());
model = serializeAndDeserialize(model);
assertThat(model.getObject(), isEmpty());
}
@Test
public void testNonNull() {
C collection = createCollection(ValueEnum.VALUE1, ValueEnum.VALUE2);
IModel<C> model = createModel();
model.setObject(clone(collection));
assertThat(model.getObject(), isEquivalent(collection));
model = serializeAndDeserialize(model);
C modelObject = model.getObject();
assertNotNull(modelObject);
assertEquals(collection.size(), modelObject.size());
assertThat(modelObject, isEquivalent(collection));
}
@Test
public void testCollectionCopy() throws Exception {
C collection = createCollection(ValueEnum.VALUE1, ValueEnum.VALUE2);
IModel<C> model = createModel();
C collectionSetOnModel = clone(collection);
model.setObject(collectionSetOnModel);
assertThat(model.getObject(), isEquivalent(collection));
collectionSetOnModel.add(ValueEnum.VALUE3);
assertThat(model.getObject(), isEquivalent(collection));
}
@Test
public void testGetObjectAdd() throws Exception {
IModel<C> model = createModel();
model.setObject(createCollection(ValueEnum.VALUE1, ValueEnum.VALUE2));
C modelObject = model.getObject();
modelObject.add(ValueEnum.VALUE3);
assertThat(model.getObject(), isEquivalent(createCollection(ValueEnum.VALUE1, ValueEnum.VALUE2, ValueEnum.VALUE3)));
model = serializeAndDeserialize(model);
modelObject = model.getObject();
assertNotNull(modelObject);
assertEquals(3, modelObject.size());
assertThat(modelObject, isEquivalent(createCollection(ValueEnum.VALUE1, ValueEnum.VALUE2, ValueEnum.VALUE3)));
}
@Test
public void testGetObjectRemove() throws Exception {
IModel<C> model = createModel();
model.setObject(createCollection(ValueEnum.VALUE1, ValueEnum.VALUE2));
C modelObject = model.getObject();
modelObject.remove(ValueEnum.VALUE2);
assertThat(model.getObject(), isEquivalent(createCollection(ValueEnum.VALUE1)));
model = serializeAndDeserialize(model);
modelObject = model.getObject();
assertNotNull(modelObject);
assertEquals(1, modelObject.size());
assertThat(modelObject, isEquivalent(createCollection(ValueEnum.VALUE1)));
}
}