Skip to content

Commit d5b33d2

Browse files
authored
Merge pull request #25 from Hi-Fi/general_varargs
Fixes #12
2 parents 08cd34b + 2ef3269 commit d5b33d2

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

src/main/java/org/robotframework/javalib/reflection/ArgumentCollector.java

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.robotframework.javalib.reflection;
22

3+
import java.lang.reflect.Array;
34
import java.util.*;
45
import java.util.stream.Collectors;
56

@@ -35,7 +36,7 @@ public List collectArguments(List args, Map<String, Object> kwargs) {
3536
boolean kwarg = parameterName.contains("**");
3637
parameterName = parameterName.replace("*", "").replace("*", "");
3738
Object value = this.getParameterValue(parameterName, i, args, cleanedKwargs);
38-
Class<?> argumentType = parameterTypes.length > i && !vararg ? parameterTypes[i] : String.class;
39+
Class<?> argumentType = parameterTypes.length > i && !vararg ? parameterTypes[i] : Object.class;
3940
if (!kwarg) {
4041
if (vararg) {
4142
if (value != null) {
@@ -83,8 +84,14 @@ private Object getParameterValue(String parameterName, int i, List args, Map<Str
8384
}
8485

8586
private Object ensureCorrectVarargsType(List varargs) {
86-
if (parameterTypes != null && parameterTypes.length > 0 && parameterTypes[parameterTypes.length-1].isArray() || (parameterTypes.length > 1 && parameterTypes[parameterTypes.length-2].isArray())) {
87-
return varargs.toArray(new String[0]);
87+
int varargIndex = this.getVarargsIndex();
88+
if (parameterTypes != null && varargIndex > -1 && parameterTypes[varargIndex].isArray()) {
89+
Class<?> arrayClass = parameterTypes[varargIndex].getComponentType();
90+
Object[] varargsArray = (Object[]) Array.newInstance(arrayClass, varargs.size());
91+
for (int i = 0; i < varargs.size(); i++) {
92+
varargsArray[i] = varargs.get(i);
93+
}
94+
return varargsArray;
8895
} else {
8996
return varargs;
9097
}

src/test/java/org/robotframework/javalib/reflection/ArgumentCollectorTest.java

+26
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,30 @@ void namedArguments() {
3535
assertTrue(collectedArgs.size() == 3);
3636
assertTrue(collectedArgs.get(2) instanceof Map);
3737
}
38+
39+
@Test
40+
void varargsTypeInt() {
41+
List providedArguments = Arrays.asList("arg", "*varargs");
42+
Class<?>[] argumentTypes = new Class[] { String.class, Integer[].class};
43+
IArgumentCollector collector = new ArgumentCollector(argumentTypes, providedArguments);
44+
List<Integer> args = Arrays.asList(2, 3, 4);
45+
List collectedArgs = collector.collectArguments(args, null);
46+
assertEquals(2, collectedArgs.size());
47+
assertTrue(collectedArgs.get(1).getClass().isArray());
48+
assertEquals(((Integer[])collectedArgs.get(1))[0].getClass(), Integer.class);
49+
assertEquals(((Integer[])collectedArgs.get(1))[1].getClass(), Integer.class);
50+
}
51+
52+
@Test
53+
void varargsTypeString() {
54+
List providedArguments = Arrays.asList("arg", "*varargs");
55+
Class<?>[] argumentTypes = new Class[] { String.class, String[].class};
56+
IArgumentCollector collector = new ArgumentCollector(argumentTypes, providedArguments);
57+
List<String> args = Arrays.asList("2", "3", "4");
58+
List collectedArgs = collector.collectArguments(args, null);
59+
assertEquals(2, collectedArgs.size());
60+
assertTrue(collectedArgs.get(1).getClass().isArray());
61+
assertEquals(String.class, ((Object[])collectedArgs.get(1))[0].getClass());
62+
assertEquals(String.class, ((Object[])collectedArgs.get(1))[1].getClass());
63+
}
3864
}

0 commit comments

Comments
 (0)