carbidecpp22devenv/plugins/org.eclipse.test.source_3.5.0.r20080925/src/org.junit4_4.5.0.v20090423/junitsrc/org/junit/experimental/theories/internal/Assignments.java
author cawthron
Fri, 04 Dec 2009 11:49:54 -0600
changeset 636 3ef299ba838f
permissions -rw-r--r--
add files for RCL_2_2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
636
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
     1
/**
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
     2
 * 
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
     3
 */
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
     4
package org.junit.experimental.theories.internal;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
     5
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
     6
import java.lang.reflect.Method;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
     7
import java.util.ArrayList;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
     8
import java.util.List;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
     9
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    10
import org.junit.experimental.theories.ParameterSignature;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    11
import org.junit.experimental.theories.ParameterSupplier;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    12
import org.junit.experimental.theories.ParametersSuppliedBy;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    13
import org.junit.experimental.theories.PotentialAssignment;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    14
import org.junit.experimental.theories.PotentialAssignment.CouldNotGenerateValueException;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    15
import org.junit.runners.model.TestClass;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    16
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    17
public class Assignments {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    18
	private List<PotentialAssignment> fAssigned;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    19
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    20
	private final List<ParameterSignature> fUnassigned;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    21
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    22
	private final TestClass fClass;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    23
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    24
	public Assignments(List<PotentialAssignment> assigned,
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    25
			List<ParameterSignature> unassigned, TestClass testClass) {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    26
		fUnassigned= unassigned;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    27
		fAssigned= assigned;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    28
		fClass= testClass;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    29
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    30
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    31
	public static Assignments allUnassigned(Method testMethod,
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    32
			TestClass testClass) throws Exception {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    33
		List<ParameterSignature> signatures;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    34
		signatures= ParameterSignature.signatures(testClass.getOnlyConstructor());
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    35
		signatures.addAll(ParameterSignature.signatures(testMethod));
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    36
		return new Assignments(new ArrayList<PotentialAssignment>(),
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    37
				signatures, testClass);
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    38
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    39
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    40
	public boolean isComplete() {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    41
		return fUnassigned.size() == 0;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    42
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    43
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    44
	public ParameterSignature nextUnassigned() {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    45
		return fUnassigned.get(0);
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    46
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    47
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    48
	public Assignments assignNext(PotentialAssignment source) {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    49
		List<PotentialAssignment> assigned= new ArrayList<PotentialAssignment>(
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    50
				fAssigned);
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    51
		assigned.add(source);
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    52
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    53
		return new Assignments(assigned, fUnassigned.subList(1, fUnassigned
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    54
				.size()), fClass);
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    55
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    56
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    57
	public Object[] getActualValues(int start, int stop, boolean nullsOk)
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    58
			throws CouldNotGenerateValueException {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    59
		Object[] values= new Object[stop - start];
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    60
		for (int i= start; i < stop; i++) {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    61
			Object value= fAssigned.get(i).getValue();
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    62
			if (value == null && !nullsOk)
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    63
				throw new CouldNotGenerateValueException();
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    64
			values[i - start]= value;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    65
		}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    66
		return values;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    67
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    68
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    69
	public List<PotentialAssignment> potentialsForNextUnassigned()
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    70
			throws InstantiationException, IllegalAccessException {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    71
		ParameterSignature unassigned= nextUnassigned();
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    72
		return getSupplier(unassigned).getValueSources(unassigned);
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    73
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    74
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    75
	public ParameterSupplier getSupplier(ParameterSignature unassigned)
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    76
			throws InstantiationException, IllegalAccessException {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    77
		ParameterSupplier supplier= getAnnotatedSupplier(unassigned);
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    78
		if (supplier != null)
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    79
			return supplier;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    80
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    81
		return new AllMembersSupplier(fClass);
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    82
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    83
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    84
	public ParameterSupplier getAnnotatedSupplier(ParameterSignature unassigned)
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    85
			throws InstantiationException, IllegalAccessException {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    86
		ParametersSuppliedBy annotation= unassigned
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    87
				.findDeepAnnotation(ParametersSuppliedBy.class);
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    88
		if (annotation == null)
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    89
			return null;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    90
		return annotation.value().newInstance();
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    91
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    92
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    93
	public Object[] getConstructorArguments(boolean nullsOk)
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    94
			throws CouldNotGenerateValueException {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    95
		return getActualValues(0, getConstructorParameterCount(), nullsOk);
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    96
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    97
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    98
	public Object[] getMethodArguments(boolean nullsOk)
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
    99
			throws CouldNotGenerateValueException {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   100
		return getActualValues(getConstructorParameterCount(),
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   101
				fAssigned.size(), nullsOk);
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   102
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   103
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   104
	public Object[] getAllArguments(boolean nullsOk)
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   105
			throws CouldNotGenerateValueException {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   106
		return getActualValues(0, fAssigned.size(), nullsOk);
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   107
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   108
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   109
	private int getConstructorParameterCount() {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   110
		List<ParameterSignature> signatures= ParameterSignature
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   111
				.signatures(fClass.getOnlyConstructor());
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   112
		int constructorParameterCount= signatures.size();
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   113
		return constructorParameterCount;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   114
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   115
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   116
	public Object[] getArgumentStrings(boolean nullsOk) throws CouldNotGenerateValueException {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   117
		Object[] values= new Object[fAssigned.size()];
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   118
		for (int i= 0; i < values.length; i++) {
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   119
			values[i]= fAssigned.get(i).getDescription();
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   120
		}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   121
		return values;
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   122
	}
3ef299ba838f add files for RCL_2_2
cawthron
parents:
diff changeset
   123
}