/*
* Copyright 2014 mango.jfaster.org
*
* The Mango Project licenses this file to you 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 org.jfaster.mango.binding;
import org.jfaster.mango.descriptor.ParameterDescriptor;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.nullValue;
/**
* @author ash
*/
public class DefaultParameterContextTest {
@Test
public void testGetParameterNameByPosition() throws Exception {
List<Annotation> empty = Collections.emptyList();
ParameterDescriptor p0 = ParameterDescriptor.create(0, String.class, empty, "param1");
ParameterDescriptor p1 = ParameterDescriptor.create(1, int.class, empty, "param2");
List<ParameterDescriptor> pds = Arrays.asList(p0, p1);
ParameterContext ctx = DefaultParameterContext.create(pds);
assertThat(ctx.getParameterNameByPosition(0), equalTo("param1"));
assertThat(ctx.getParameterNameByPosition(1), equalTo("param2"));
}
@Test
public void testGetBindingParameterInvoker() throws Exception {
List<Annotation> empty = Collections.emptyList();
ParameterDescriptor p0 = ParameterDescriptor.create(0, String.class, empty, "1");
ParameterDescriptor p1 = ParameterDescriptor.create(1, User.class, empty, "2");
List<ParameterDescriptor> pds = Arrays.asList(p0, p1);
ParameterContext ctx = DefaultParameterContext.create(pds);
checkBindingParameterInvoker(ctx, "1", "", String.class);
checkBindingParameterInvoker(ctx, "2", "userBag.item.itemId", int.class);
checkBindingParameterInvoker(ctx, "2", "userBag.item.objItemId", Integer.class);
checkBindingParameterInvoker(ctx, "2", "userId", String.class);
}
private void checkBindingParameterInvoker(ParameterContext ctx, String parameterName, String propertyPath, Type type) {
assertThat(ctx.getBindingParameterInvoker(BindingParameter.create(parameterName, propertyPath, null)).getTargetType(), equalTo(type));
}
@Test
public void testGetParameterDescriptors() throws Exception {
List<Annotation> empty = Collections.emptyList();
ParameterDescriptor p0 = ParameterDescriptor.create(0, String.class, empty, "1");
ParameterDescriptor p1 = ParameterDescriptor.create(1, User.class, empty, "2");
List<ParameterDescriptor> pds = Arrays.asList(p0, p1);
ParameterContext ctx = DefaultParameterContext.create(pds);
assertThat(ctx.getParameterDescriptors(), equalTo(pds));
}
@Test
public void testTryExpandBindingParameter() throws Exception {
List<Annotation> empty = Collections.emptyList();
ParameterDescriptor p0 = ParameterDescriptor.create(0, String.class, empty, "1");
ParameterDescriptor p1 = ParameterDescriptor.create(1, User.class, empty, "2");
List<ParameterDescriptor> pds = Arrays.asList(p0, p1);
ParameterContext ctx = DefaultParameterContext.create(pds);
BindingParameter bp = BindingParameter.create("userBag", "item.itemId", null);
BindingParameter nbp = ctx.tryExpandBindingParameter(bp);
assertThat(nbp, equalTo(BindingParameter.create("2", "userBag.item.itemId", null)));
bp = BindingParameter.create("userId", "", null);
nbp = ctx.tryExpandBindingParameter(bp);
assertThat(nbp, equalTo(BindingParameter.create("2", "userId", null)));
bp = BindingParameter.create("userIds", "", null);
nbp = ctx.tryExpandBindingParameter(bp);
assertThat(nbp, nullValue());
}
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void testIllegalStateException() throws Exception {
thrown.expect(IllegalStateException.class);
List<Annotation> empty = Collections.emptyList();
ParameterDescriptor p0 = ParameterDescriptor.create(0, String.class, empty, "param1");
List<ParameterDescriptor> pds = Arrays.asList(p0);
ParameterContext ctx = DefaultParameterContext.create(pds);
ctx.getParameterNameByPosition(1);
}
@Test
public void testBindingException() throws Exception {
thrown.expect(BindingException.class);
thrown.expectMessage("Parameter ':user' not found, available root parameters are [:param1, :param2]");
List<Annotation> empty = Collections.emptyList();
ParameterDescriptor p0 = ParameterDescriptor.create(0, String.class, empty, "param1");
ParameterDescriptor p1 = ParameterDescriptor.create(1, String.class, empty, "param2");
List<ParameterDescriptor> pds = Arrays.asList(p0, p1);
ParameterContext ctx = DefaultParameterContext.create(pds);
ctx.getBindingParameterInvoker(BindingParameter.create("user", "id", null));
}
@Test
public void testBindingException2() throws Exception {
thrown.expect(BindingException.class);
thrown.expectMessage("Root parameters [:1, :2] has the same property 'userId', so can't auto expand");
List<Annotation> empty = Collections.emptyList();
ParameterDescriptor p0 = ParameterDescriptor.create(0, User.class, empty, "1");
ParameterDescriptor p1 = ParameterDescriptor.create(1, User.class, empty, "2");
List<ParameterDescriptor> pds = Arrays.asList(p0, p1);
ParameterContext ctx = DefaultParameterContext.create(pds);
ctx.tryExpandBindingParameter(BindingParameter.create("userId", "", null));
}
public static class User {
private UserBag userBag;
private String userId;
public UserBag getUserBag() {
return userBag;
}
public void setUserBag(UserBag userBag) {
this.userBag = userBag;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}
public static class UserBag {
private Item item;
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
}
public static class Item {
private int itemId;
private Integer objItemId;
public int getItemId() {
return itemId;
}
public void setItemId(int itemId) {
this.itemId = itemId;
}
public Integer getObjItemId() {
return objItemId;
}
public void setObjItemId(Integer objItemId) {
this.objItemId = objItemId;
}
}
}