All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.japgolly.android.test.param.TestRunnerMixin Maven / Gradle / Ivy

package com.github.japgolly.android.test.param;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

import org.junit.param.ParamTest;
import org.junit.param.Params;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
import org.junit.runners.model.TestClass;

/**
 * Well... I wish this were a mixin.
 * 
 * @since 05/12/2012
 */
final class TestRunnerMixin {

	static public List computeTestMethods(TestClass testClass, List testMethods) {
		try {

			final List results = new ArrayList(testMethods.size() << 1);
			results.addAll(testMethods);

			final List paramTestMethods = testClass.getAnnotatedMethods(ParamTest.class);
			for (FrameworkMethod method : paramTestMethods) {

				final ParamTest paramTest = method.getAnnotation(ParamTest.class);
				final int sizeBefore = results.size();

				// Get @Params from static method specified in paramsProvidedBy
				String paramsMethodName = paramTest.paramsProvidedBy();
				if (!paramsMethodName.isEmpty()) {
					Method paramsMethod = testClass.getJavaClass().getMethod(paramsMethodName);
					if ((paramsMethod.getModifiers() & Modifier.STATIC) == 0) {
						throw new IllegalArgumentException("Method should be static: " + paramsMethod);
					}
					String[][] params = (String[][]) paramsMethod.invoke(null);
					createTestsForParams(results, method, params);
				}

				// Parse given @Params
				createTestsForParams(results, method, paramTest.value());

				// Confirm tests added
				if (sizeBefore == results.size()) {
					throw new IllegalStateException("No params found to test: " + method.getName() + "()");
				}
			}

			return results;

		} catch (Exception e) {
			if (e instanceof RuntimeException) {
				throw (RuntimeException) e;
			}
			throw new RuntimeException(e);
		}
	}

	private static void createTestsForParams(final List results, FrameworkMethod method,
			String[][] params) {

		for (String[] param : params) {
			ParameterizedFrameworkMethod paramMethod = new ParameterizedFrameworkMethod(method.getMethod(), param);
			results.add(paramMethod);
		}
	}

	private static void createTestsForParams(final List results, FrameworkMethod method,
			Params[] params) {

		for (Params param : params) {
			ParameterizedFrameworkMethod paramMethod =
					new ParameterizedFrameworkMethod(method.getMethod(), param.value());
			results.add(paramMethod);
		}
	}

	static public Statement methodInvoker(FrameworkMethod method, Object test) {
		if (method instanceof ParameterizedFrameworkMethod) {
			return new ParameterizedInvokeMethod((ParameterizedFrameworkMethod) method, test);
		}
		return null;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy