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.Iterator;
import java.util.Map;
import org.apache.commons.lang3.EnumUtils;
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.TestSerializableMapCopyModel.KeyEnum;
import fr.openwide.core.test.wicket.more.model.TestSerializableMapCopyModel.ValueEnum;
import fr.openwide.core.wicket.more.markup.repeater.map.IMapModel;
import fr.openwide.core.wicket.more.model.MapCopyModel;
import fr.openwide.core.wicket.more.util.model.Models;
@RunWith(Parameterized.class)
public class TestSerializableMapCopyModel<M extends Map<KeyEnum, ValueEnum>>
extends AbstractTestMapModel<M> {
@Parameters(name = "{index}: {0}, {1}")
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] {
{ Suppliers2.hashMap(), UNORDERED_MAP_EQUIVALENCE },
{ Suppliers2.linkedHashMap(), Equivalence.equals() },
{ Suppliers2.treeMap(), Equivalence.equals() },
{ Suppliers2.treeMap(Ordering.natural().reverse().nullsLast()), Equivalence.equals() }
});
}
public static enum KeyEnum {
KEY1,
KEY2,
KEY3;
}
public static enum ValueEnum {
VALUE1,
VALUE2,
VALUE3;
}
public TestSerializableMapCopyModel(Supplier<? extends M> supplier, Equivalence<? super M> equivalence) {
super(supplier, equivalence);
}
protected IMapModel<KeyEnum, ValueEnum, M> createModel() {
return MapCopyModel.custom(mapSupplier, Models.<KeyEnum>serializableModelFactory(), Models.<ValueEnum>serializableModelFactory());
}
protected M createMap(KeyEnum... items) {
M map = mapSupplier.get();
Iterator<ValueEnum> valueIt = EnumUtils.getEnumList(ValueEnum.class).iterator();
for (KeyEnum item : items) {
map.put(item, valueIt.next());
}
return map;
}
@Test
public void testNull() {
IModel<M> model = createModel();
model.setObject(null);
assertThat(model.getObject(), isEmpty());
model = serializeAndDeserialize(model);
assertThat(model.getObject(), isEmpty());
}
@Test
public void testNonNull() {
M collection = createMap(KeyEnum.KEY1, KeyEnum.KEY2);
IModel<M> model = createModel();
model.setObject(clone(collection));
assertThat(model.getObject(), isEquivalent(collection));
model = serializeAndDeserialize(model);
M modelObject = model.getObject();
assertNotNull(modelObject);
assertEquals(collection.size(), modelObject.size());
assertThat(modelObject, isEquivalent(collection));
}
@Test
public void testCollectionCopy() throws Exception {
M collection = createMap(KeyEnum.KEY1, KeyEnum.KEY2);
IModel<M> model = createModel();
M collectionSetOnModel = clone(collection);
model.setObject(collectionSetOnModel);
assertThat(model.getObject(), isEquivalent(collection));
collectionSetOnModel.put(KeyEnum.KEY3, ValueEnum.VALUE3);
assertThat(model.getObject(), isEquivalent(collection));
}
@Test
public void testGetObjectAdd() throws Exception {
IModel<M> model = createModel();
model.setObject(createMap(KeyEnum.KEY1, KeyEnum.KEY2));
M modelObject = model.getObject();
modelObject.put(KeyEnum.KEY3, ValueEnum.VALUE3);
assertThat(model.getObject(), isEquivalent(createMap(KeyEnum.KEY1, KeyEnum.KEY2, KeyEnum.KEY3)));
model = serializeAndDeserialize(model);
modelObject = model.getObject();
assertNotNull(modelObject);
assertEquals(3, modelObject.size());
assertThat(modelObject, isEquivalent(createMap(KeyEnum.KEY1, KeyEnum.KEY2, KeyEnum.KEY3)));
}
@Test
public void testCollectionGetObjectRemove() throws Exception {
IModel<M> model = createModel();
model.setObject(createMap(KeyEnum.KEY1, KeyEnum.KEY2));
M modelObject = model.getObject();
modelObject.remove(KeyEnum.KEY2);
assertThat(model.getObject(), isEquivalent(createMap(KeyEnum.KEY1)));
model = serializeAndDeserialize(model);
modelObject = model.getObject();
assertNotNull(modelObject);
assertEquals(1, modelObject.size());
assertThat(modelObject, isEquivalent(createMap(KeyEnum.KEY1)));
}
}