/*
* Copyright 2015, The Querydsl Team (http://www.querydsl.com/team)
*
* 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 com.querydsl.core.types;
import static org.junit.Assert.*;
import org.junit.Test;
import com.querydsl.core.types.QBeanPropertyTest.Entity;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.PathBuilder;
import com.querydsl.core.types.dsl.StringPath;
public class ProjectionsTest {
public static class VarArgs {
String[] args;
public VarArgs(String... strs) {
args = strs;
}
}
public static class VarArgs2 {
String arg;
String[] args;
public VarArgs2(String s, String... strs) {
arg = s;
args = strs;
}
}
public static class Entity1 {
String arg1, arg2;
public Entity1(String arg1, String arg2) {
this.arg1 = arg1;
this.arg2 = arg2;
}
}
public static class Entity2 {
String arg1;
Entity1 entity;
public Entity2(String arg1, Entity1 entity) {
this.arg1 = arg1;
this.entity = entity;
}
}
@SuppressWarnings("unchecked")
@Test
public void array() {
FactoryExpression<String[]> expr = Projections.array(String[].class,
ExpressionUtils.path(String.class, "p1"), ExpressionUtils.path(String.class, "p2"));
assertEquals(String[].class, expr.newInstance("1", "2").getClass());
}
@Test
public void beanClassOfTExpressionOfQArray() {
PathBuilder<Entity> entity = new PathBuilder<Entity>(Entity.class, "entity");
QBean<Entity> beanProjection = Projections.bean(Entity.class,
entity.getNumber("cId", Integer.class),
entity.getNumber("eId", Integer.class));
assertEquals(Entity.class, beanProjection.newInstance(1, 2).getClass());
}
@Test
public void constructor() {
Expression<Long> longVal = ConstantImpl.create(1L);
Expression<String> stringVal = ConstantImpl.create("");
assertEquals(ProjectionExample.class, Projections.constructor(ProjectionExample.class, longVal, stringVal)
.newInstance(0L, "").getClass());
}
@Test
public void constructor_varArgs() {
Expression<String> stringVal = ConstantImpl.create("");
VarArgs instance = Projections.constructor(VarArgs.class, stringVal, stringVal).newInstance("X", "Y");
assertArrayEquals(new String[]{"X", "Y"}, instance.args);
}
@Test
public void constructor_varArgs2() {
Expression<String> stringVal = ConstantImpl.create("");
VarArgs2 instance = Projections.constructor(VarArgs2.class, stringVal, stringVal, stringVal).newInstance("X", "Y", "Z");
assertEquals("X", instance.arg);
assertArrayEquals(new String[]{"Y", "Z"}, instance.args);
}
@Test
public void constructor_varArgs3() {
Constant<Long> longVal = ConstantImpl.create(1L);
Constant<Character> charVal = ConstantImpl.create('\0');
ProjectionExample instance = Projections
.constructor(ProjectionExample.class,
longVal, charVal,
charVal, charVal,
charVal, charVal,
charVal, charVal,
charVal, charVal,
charVal)
.newInstance(null, 'm',
'y', 's',
'e', 'm',
'a', null,
'l', 't',
'd');
assertEquals(0L, (long) instance.id);
// null character cannot be inserted, so a literal String can't be used.
String expectedText = String.valueOf(new char[]{'m', 'y', 's', 'e', 'm', 'a',
'\0', 'l', 't', 'd'});
assertEquals(expectedText, instance.text);
}
@Test
public void fieldsClassOfTExpressionOfQArray() {
PathBuilder<Entity> entity = new PathBuilder<Entity>(Entity.class, "entity");
QBean<Entity> beanProjection = Projections.fields(Entity.class,
entity.getNumber("cId", Integer.class),
entity.getNumber("eId", Integer.class));
assertEquals(Entity.class, beanProjection.newInstance(1, 2).getClass());
}
@Test
public void nested() {
StringPath str1 = Expressions.stringPath("str1");
StringPath str2 = Expressions.stringPath("str2");
StringPath str3 = Expressions.stringPath("str3");
FactoryExpression<Entity1> entity = Projections.constructor(Entity1.class, str1, str2);
FactoryExpression<Entity2> wrapper = Projections.constructor(Entity2.class, str3, entity);
FactoryExpression<Entity2> wrapped = FactoryExpressionUtils.wrap(wrapper);
Entity2 w = wrapped.newInstance("a", "b", "c");
assertEquals("a", w.arg1);
assertEquals("b", w.entity.arg1);
assertEquals("c", w.entity.arg2);
w = wrapped.newInstance("a", null, null);
assertEquals("a", w.arg1);
assertNotNull(w.entity);
w = wrapped.newInstance(null, null, null);
assertNotNull(w.entity);
}
@Test
public void nestedSkipNulls() {
StringPath str1 = Expressions.stringPath("str1");
StringPath str2 = Expressions.stringPath("str2");
StringPath str3 = Expressions.stringPath("str3");
FactoryExpression<Entity1> entity = Projections.constructor(Entity1.class, str1, str2).skipNulls();
FactoryExpression<Entity2> wrapper = Projections.constructor(Entity2.class, str3, entity);
FactoryExpression<Entity2> wrapped = FactoryExpressionUtils.wrap(wrapper);
Entity2 w = wrapped.newInstance("a", "b", "c");
assertEquals("a", w.arg1);
assertEquals("b", w.entity.arg1);
assertEquals("c", w.entity.arg2);
w = wrapped.newInstance("a", null, null);
assertEquals("a", w.arg1);
assertNull(w.entity);
w = wrapped.newInstance(null, null, null);
assertNull(w.entity);
}
@Test
public void nestedSkipNulls2() {
StringPath str1 = Expressions.stringPath("str1");
StringPath str2 = Expressions.stringPath("str2");
StringPath str3 = Expressions.stringPath("str3");
FactoryExpression<Entity1> entity = Projections.constructor(Entity1.class, str1, str2).skipNulls();
FactoryExpression<Entity2> wrapper = Projections.constructor(Entity2.class, str3, entity).skipNulls();
FactoryExpression<Entity2> wrapped = FactoryExpressionUtils.wrap(wrapper);
Entity2 w = wrapped.newInstance("a", "b", "c");
assertEquals("a", w.arg1);
assertEquals("b", w.entity.arg1);
assertEquals("c", w.entity.arg2);
w = wrapped.newInstance("a", null, null);
assertEquals("a", w.arg1);
assertNull(w.entity);
w = wrapped.newInstance(null, null, null);
assertNull(w);
}
}