From d02c6befcc126ed870f971f353d39ecd386b45b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Fri, 29 Jan 2010 08:22:38 +0000 Subject: [PATCH] added tests for EConstructor added static create method for EConstructor --- .../mysema/query/types/expr/EConstructor.java | 23 ++++++++ .../query/types/expr/EConstructorTest.java | 56 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 querydsl-core/src/test/java/com/mysema/query/types/expr/EConstructorTest.java diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/EConstructor.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/EConstructor.java index 96a35c8ee..0ae79fa41 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/EConstructor.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/EConstructor.java @@ -10,6 +10,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.apache.commons.lang.ClassUtils; + import com.mysema.query.types.Visitor; /** @@ -25,6 +27,27 @@ public class EConstructor extends Expr { private final List> args; private final Class[] parameterTypes; + + public static EConstructor create(Class type, Expr... args){ + for (Constructor c : type.getConstructors()){ + Class[] paramTypes = c.getParameterTypes(); + if (paramTypes.length == args.length){ + boolean found = true; + for (int i = 0; i < paramTypes.length; i++){ + Class paramType = paramTypes[i]; + if (paramType.isPrimitive()) paramType = ClassUtils.primitiveToWrapper(paramType); + if (!paramType.isAssignableFrom(args[i].getType())){ + found = false; + break; + } + } + if (found){ + return new EConstructor(type, paramTypes, args); + } + } + } + throw new IllegalArgumentException("Got no matching constructor"); + } public EConstructor(Class type, Class[] paramTypes, Expr... args) { super(type); diff --git a/querydsl-core/src/test/java/com/mysema/query/types/expr/EConstructorTest.java b/querydsl-core/src/test/java/com/mysema/query/types/expr/EConstructorTest.java new file mode 100644 index 000000000..425ee0603 --- /dev/null +++ b/querydsl-core/src/test/java/com/mysema/query/types/expr/EConstructorTest.java @@ -0,0 +1,56 @@ +package com.mysema.query.types.expr; + +import static org.junit.Assert.*; + +import java.lang.reflect.Constructor; + +import org.junit.Test; + +public class EConstructorTest { + + public static class Projection{ + + public Projection(){ + + } + + public Projection(Long id){ + + } + + public Projection(long id, String text){ + + } + } + + @Test + public void test_Constructor(){ + ENumber longVal = ENumberConst.create(1l); + EString stringVal = EStringConst.create(""); + new EConstructor(Projection.class, new Class[]{long.class, String.class}, longVal, stringVal) + .getJavaConstructor(); + } + + @Test + public void test_create(){ + ENumber longVal = ENumberConst.create(1l); + EString stringVal = EStringConst.create(""); + Constructor c = EConstructor.create(Projection.class, longVal, stringVal).getJavaConstructor(); + assertEquals(long.class, c.getParameterTypes()[0]); + assertEquals(String.class, c.getParameterTypes()[1]); + } + + @Test + public void test_create2(){ + ENumber longVal = ENumberConst.create(1l); + Constructor c = EConstructor.create(Projection.class, longVal).getJavaConstructor(); + assertEquals(Long.class, c.getParameterTypes()[0]); + } + + @Test + public void test_create3(){ + Constructor c = EConstructor.create(Projection.class).getJavaConstructor(); + assertEquals(0, c.getParameterTypes().length); + } + +}