/**
* Copyright (C) 2011
* Michael Mosmann <michael@mosmann.de>
* Jan Bernitt <unknown@email.de>
*
* with contributions from
* nobody yet
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.flapdoodle.wicket.model;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.junit.Assert;
import org.junit.Test;
import de.flapdoodle.functions.Function1;
import de.flapdoodle.functions.Function2;
import de.flapdoodle.functions.Function3;
import de.flapdoodle.wicket.model.transformation.Lazy;
public class TestModelTransformations {
@Test
public void sourceModelAndFunction() {
Model<Integer> source = Model.of(1);
IModel<String> model = Models.on(source).apply(new IntegerToString());
checkModelModifications(source, model);
checkExceptionOnSetObject(model,"Some String");
}
@Test
public void functionAndSourceModel() {
Model<Integer> source = Model.of(1);
IModel<String> model = Models.apply(new IntegerToString()).to(source);
checkModelModifications(source, model);
checkExceptionOnSetObject(model,"Some String");
}
private void checkModelModifications(Model<Integer> source, IModel<String> model) {
Assert.assertEquals("1", model.getObject());
source.setObject(2);
Assert.assertEquals("1", model.getObject());
model.detach();
Assert.assertEquals("2", model.getObject());
}
@Test
public void twoModelsAndAFunction() {
Model<Integer> a = Model.of(1);
Model<Integer> b = Model.of(2);
IModel<Integer> model = Models.on(a,b).apply(new AddTwoNumbers());
checkModelModifications(a, b, model);
checkExceptionOnSetObject(model,100);
}
@Test
public void functionAndTwoModels() {
Model<Integer> a = Model.of(1);
Model<Integer> b = Model.of(2);
IModel<Integer> model = Models.apply(new AddTwoNumbers()).to(a,b);
checkModelModifications(a, b, model);
checkExceptionOnSetObject(model,100);
}
private void checkModelModifications(Model<Integer> a, Model<Integer> b, IModel<Integer> model) {
Assert.assertEquals(Integer.valueOf(3), model.getObject());
a.setObject(2);
Assert.assertEquals(Integer.valueOf(3), model.getObject());
model.detach();
Assert.assertEquals(Integer.valueOf(4), model.getObject());
b.setObject(3);
Assert.assertEquals(Integer.valueOf(4), model.getObject());
model.detach();
Assert.assertEquals(Integer.valueOf(5), model.getObject());
}
@Test
public void threeModelsAndAFunction() {
Model<Integer> a = Model.of(1);
Model<Integer> b = Model.of(2);
Model<String> postfix = Model.of("Kinder");
IModel<String> model = Models.on(a,b,postfix).apply(new AddToNumbersAndAString());
checkModelModifications(a, b, postfix, model);
checkExceptionOnSetObject(model,"nix");
}
@Test
public void functionAndThreeModels() {
Model<Integer> a = Model.of(1);
Model<Integer> b = Model.of(2);
Model<String> postfix = Model.of("Kinder");
IModel<String> model = Models.apply(new AddToNumbersAndAString()).to(a,b,postfix);
checkModelModifications(a, b, postfix, model);
checkExceptionOnSetObject(model,"nix");
}
@Test
public void genericMethodSignatureForFunction1ShouldBeFlexible() {
IModel<? extends List<? extends String>> listModel=new Model<ArrayList<? extends String>>(new ArrayList<String>());
assertNotNull(Models.on(listModel).apply(new StringList2String()).getObject());
assertNotNull(Models.on(listModel).applyLazy(new LazyStringList2String()).getObject());
assertNotNull(Models.apply(new StringList2String()).to(listModel).getObject());
assertNotNull(Models.applyLazy(new LazyStringList2String()).to(listModel).getObject());
}
@Test
public void genericMethodSignatureForFunction2ShouldBeFlexible() {
IModel<? extends List<? extends String>> listModel=new Model<ArrayList<? extends String>>(new ArrayList<String>());
IModel<? extends List<? extends Integer>> numberModel=new Model<ArrayList<? extends Integer>>(new ArrayList<Integer>());
assertNotNull(Models.on(listModel,numberModel).apply(new StringAndIntList2String()).getObject());
assertNotNull(Models.on(listModel,numberModel).applyLazy(new LazyStringAndIntList2String()).getObject());
assertNotNull(Models.apply(new StringAndIntList2String()).to(listModel,numberModel).getObject());
assertNotNull(Models.applyLazy(new LazyStringAndIntList2String()).to(listModel,numberModel).getObject());
}
@Test
public void genericMethodSignatureForFunction3ShouldBeFlexible() {
IModel<? extends List<? extends String>> listModel=new Model<ArrayList<? extends String>>(new ArrayList<String>());
IModel<? extends List<? extends Integer>> numberModel=new Model<ArrayList<? extends Integer>>(new ArrayList<Integer>());
IModel<? extends List<? extends Boolean>> boolModel=new Model<ArrayList<? extends Boolean>>(new ArrayList<Boolean>());
assertNotNull(Models.on(listModel,numberModel,boolModel).apply(new StringIntAndBoolList2String()).getObject());
assertNotNull(Models.on(listModel,numberModel,boolModel).applyLazy(new LazyStringIntAndBoolList2String()).getObject());
assertNotNull(Models.apply(new StringIntAndBoolList2String()).to(listModel,numberModel,boolModel).getObject());
assertNotNull(Models.applyLazy(new LazyStringIntAndBoolList2String()).to(listModel,numberModel,boolModel).getObject());
}
private void checkModelModifications(Model<Integer> a, Model<Integer> b, Model<String> postfix, IModel<String> model) {
Assert.assertEquals("3 Kinder", model.getObject());
a.setObject(2);
Assert.assertEquals("3 Kinder", model.getObject());
model.detach();
Assert.assertEquals("4 Kinder", model.getObject());
b.setObject(3);
Assert.assertEquals("4 Kinder", model.getObject());
model.detach();
Assert.assertEquals("5 Kinder", model.getObject());
postfix.setObject("Äpfel");
Assert.assertEquals("5 Kinder", model.getObject());
model.detach();
Assert.assertEquals("5 Äpfel", model.getObject());
}
private <T> void checkExceptionOnSetObject(IModel<T> model,T value) {
Exception e=null;
try {
model.setObject(value);
} catch (Exception ex) {
e=ex;
}
Assert.assertNotNull("Exception on setObject",e);
}
private final class LazyStringAndIntList2String implements Function2<String, Lazy<? extends List<? extends String>>, Lazy<? extends List<? extends Integer>>> {
@Override
public String apply(Lazy<? extends List<? extends String>> value, Lazy<? extends List<? extends Integer>> value2) {
return value.get().toString()+value2.get().toString();
}
}
private final class LazyStringIntAndBoolList2String implements Function3<String, Lazy<? extends List<? extends String>>, Lazy<? extends List<? extends Integer>>, Lazy<? extends List<? extends Boolean>>> {
@Override
public String apply(Lazy<? extends List<? extends String>> value, Lazy<? extends List<? extends Integer>> value2, Lazy<? extends List<? extends Boolean>> value3) {
return value.get().toString()+value2.get().toString()+value3.get().toString();
}
}
private final class StringAndIntList2String implements Function2<String, List<? extends String>, List<? extends Integer>> {
@Override
public String apply(List<? extends String> value, List<? extends Integer> value2) {
return value.toString()+value2.toString();
}
}
private final class StringIntAndBoolList2String implements Function3<String, List<? extends String>, List<? extends Integer>, List<? extends Boolean>> {
@Override
public String apply(List<? extends String> value, List<? extends Integer> value2, List<? extends Boolean> value3) {
return value.toString()+value2.toString()+value3.toString();
}
}
private final class LazyStringList2String implements Function1<String, Lazy<? extends List<? extends String>>> {
@Override
public String apply(Lazy<? extends List<? extends String>> value) {
return value.get().toString();
}
}
private final class StringList2String implements Function1<String, List<? extends String>> {
@Override
public String apply(List<? extends String> value) {
return value.toString();
}
}
private final class AddToNumbersAndAString implements Function3<String, Integer, Integer, String> {
@Override
public String apply(Integer value, Integer value2,String value3) {
return ""+(value+value2)+" "+value3;
}
}
private final class AddTwoNumbers implements Function2<Integer, Integer, Integer> {
@Override
public Integer apply(Integer value, Integer value2) {
return value+value2;
}
}
private final class IntegerToString implements Function1<String, Integer> {
@Override
public String apply(Integer value) {
return ""+value;
}
}
}