Index: base/test/android/javatests/src/org/chromium/base/test/params/ParameterSet.java |
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterSet.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterSet.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b38fb400adb2d35751492089e684a280ac5de530 |
--- /dev/null |
+++ b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterSet.java |
@@ -0,0 +1,128 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.base.test.params; |
+ |
+import org.junit.Assert; |
+ |
+import java.io.File; |
+import java.net.URI; |
+import java.net.URL; |
+import java.util.ArrayList; |
+import java.util.Arrays; |
+import java.util.Collections; |
+import java.util.HashSet; |
+import java.util.List; |
+import java.util.Set; |
+import java.util.concurrent.Callable; |
+ |
+/** |
+ * A set of parameters for one *SINGLE* test method or test class constructor. |
+ * |
+ * For example, <code>new ParameterSet().value("a", "b")</code> is intended for |
+ * a test method/constructor that takes in two string as arguments. |
+ * <code>public void testSimple(String a, String b) {...}</code> |
+ * or |
+ * <code>public MyTestClass(String a, String b) {...}</code> |
+ * |
+ * To parameterize testSimple or MyTestClass's tests, create multiple ParameterSets |
+ * <code> |
+ * static List<ParameterSet> sAllParameterSets = new ArrayList<>(); |
+ * static { |
+ * sAllParameterSets.add(new ParameterSet().value("a", "b"); |
+ * sAllParameterSets.add(new ParameterSet().value("c", "d"); |
+ * } |
+ */ |
+public class ParameterSet { |
+ private List<Object> mValues; |
+ private String mName; |
+ |
+ public ParameterSet() {} |
+ |
+ public ParameterSet value(Object firstArg, Object... objects) { |
+ List<Object> parameterList = new ArrayList<Object>(); |
+ parameterList.add(firstArg); |
+ parameterList.addAll(Arrays.asList(objects)); |
+ Assert.assertTrue( |
+ "Can not create ParameterSet with no parameters", parameterList.size() != 0); |
+ mValues = validateAndCopy(parameterList); |
+ return this; |
+ } |
+ |
+ public ParameterSet name(String name) { |
+ mName = name; |
+ return this; |
+ } |
+ |
+ @Override |
+ public String toString() { |
+ if (mValues == null) { |
+ return "null"; |
+ } |
+ return Arrays.toString(mValues.toArray()); |
+ } |
+ |
+ private List<Object> validateAndCopy(List<Object> values) { |
+ List<Object> tempValues = new ArrayList<>(); |
+ for (Object o : values) { |
+ if (o == null) { |
+ tempValues.add(null); |
+ } else { |
+ if (o.getClass().isPrimitive() || ACCEPTABLE_TYPES.contains(o.getClass()) |
+ || o instanceof Callable) { |
+ tempValues.add(o); |
+ } else { |
+ // TODO(yolandyan): maybe come up with way to support |
+ // complex object while handling immutability at the |
+ // same time |
+ throw new IllegalArgumentException("Type \"%s\" is not supported in" |
+ + " parameterized testing at this time. Accepted types include" |
+ + " all primitive types along with " |
+ + Arrays.toString(ACCEPTABLE_TYPES.toArray( |
+ new String[ACCEPTABLE_TYPES.size()]))); |
+ } |
+ } |
+ } |
+ return Collections.unmodifiableList(tempValues); |
+ } |
+ |
+ String getName() { |
+ if (mName == null) { |
+ return ""; |
+ } |
+ return mName; |
+ } |
+ |
+ List<Object> getValues() { |
+ return mValues; |
+ } |
+ |
+ int size() { |
+ return mValues.size(); |
+ } |
+ |
+ private static final Set<Class<?>> ACCEPTABLE_TYPES = getAcceptableTypes(); |
+ |
+ /** |
+ * Any immutable class is acceptable. |
+ */ |
+ private static Set<Class<?>> getAcceptableTypes() { |
+ Set<Class<?>> ret = new HashSet<Class<?>>(); |
+ ret.add(Boolean.class); |
+ ret.add(Byte.class); |
+ ret.add(Character.class); |
+ ret.add(Class.class); |
+ ret.add(Double.class); |
+ ret.add(File.class); |
+ ret.add(Float.class); |
+ ret.add(Integer.class); |
+ ret.add(Long.class); |
+ ret.add(Short.class); |
+ ret.add(String.class); |
+ ret.add(URI.class); |
+ ret.add(URL.class); |
+ ret.add(Void.class); |
+ return ret; |
+ } |
+} |