Skip to content

Commit

Permalink
more extractors; using ServiceLoader to find others.
Browse files Browse the repository at this point in the history
  • Loading branch information
pholser authored and marcphilipp committed Oct 28, 2010
1 parent d021dd2 commit 13d8db7
Show file tree
Hide file tree
Showing 23 changed files with 218 additions and 111 deletions.
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@
</developers>

<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
com.pholser.junit.parameters.internal.extractors.BooleanExtractor
com.pholser.junit.parameters.internal.extractors.ByteExtractor
com.pholser.junit.parameters.internal.extractors.CharacterExtractor
com.pholser.junit.parameters.internal.extractors.DateExtractor
com.pholser.junit.parameters.internal.extractors.DoubleExtractor
com.pholser.junit.parameters.internal.extractors.FloatExtractor
com.pholser.junit.parameters.internal.extractors.IntegerExtractor
com.pholser.junit.parameters.internal.extractors.LongExtractor
com.pholser.junit.parameters.internal.extractors.ShortExtractor
com.pholser.junit.parameters.internal.extractors.StringExtractor
13 changes: 0 additions & 13 deletions src/main/java/com/pholser/junit/parameters/ExtractedBy.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,73 +1,38 @@
package com.pholser.junit.parameters;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.pholser.junit.parameters.extractors.RandomValueExtractorSource;

import com.pholser.junit.parameters.extractors.ServiceLoaderExtractorSource;

import com.pholser.junit.parameters.extractors.RandomValueExtractor;
import com.pholser.junit.parameters.random.SecureJDKSourceOfRandomness;
import com.pholser.junit.parameters.random.SourceOfRandomness;
import org.junit.experimental.theories.ParameterSignature;
import org.junit.experimental.theories.ParameterSupplier;
import org.junit.experimental.theories.PotentialAssignment;

public class GeneratingParameterSupplier extends ParameterSupplier {
private static final Map<Class<?>, RandomValueExtractor> extractors =
new HashMap<Class<?>, RandomValueExtractor>();

static {
extractors.put(int.class, new RandomValueExtractor() {
@Override
public Object randomValue(SourceOfRandomness random) {
return random.nextInt();
}
});
extractors.put(Integer.class, extractors.get(int.class));
extractors.put(double.class, new RandomValueExtractor() {
@Override
public Object randomValue(SourceOfRandomness random) {
return random.nextDouble();
}
});
extractors.put(Double.class, extractors.get(double.class));
extractors.put(float.class, new RandomValueExtractor() {
@Override
public Object randomValue(SourceOfRandomness random) {
return random.nextFloat();
}
});
extractors.put(Float.class, extractors.get(float.class));
extractors.put(boolean.class, new RandomValueExtractor() {
@Override
public Object randomValue(SourceOfRandomness random) {
return random.nextBoolean();
}
});
extractors.put(Boolean.class, extractors.get(boolean.class));
extractors.put(String.class, new RandomValueExtractor() {
@Override
public Object randomValue(SourceOfRandomness random) {
try {
return new String(random.nextBytes(16), "US-ASCII");
} catch (UnsupportedEncodingException ex) {
throw new AssertionError(ex);
}
}
});
}
import static org.apache.commons.lang.ClassUtils.*;

public class GeneratingParameterSupplier extends ParameterSupplier {
private final SourceOfRandomness random;
private final Map<Class<?>, RandomValueExtractor<?>> extractors;

public GeneratingParameterSupplier() {
this(new SecureJDKSourceOfRandomness());
this(new SecureJDKSourceOfRandomness(), new ServiceLoaderExtractorSource());
}

public GeneratingParameterSupplier(SourceOfRandomness random) {
public GeneratingParameterSupplier(SourceOfRandomness random, RandomValueExtractorSource extractorSource) {
this.random = random;
extractors = extractorSource.extractors();
}

@Override
public List<PotentialAssignment> getValueSources(ParameterSignature sig) {
RandomValueExtractor extractor = extractor(sig);
RandomValueExtractor<?> extractor = extractor(sig);
int sampleSize = sampleSizeFor(sig);

List<PotentialAssignment> potentials = new ArrayList<PotentialAssignment>();
Expand All @@ -79,27 +44,13 @@ public List<PotentialAssignment> getValueSources(ParameterSignature sig) {
}

private static int sampleSizeFor(ParameterSignature sig) {
Class<?> type = sig.getType();
if (boolean.class.equals(type) || Boolean.class.equals(type))
return 2;
return sig.getAnnotation(ForAll.class).sampleSize();
}

private RandomValueExtractor extractor(ParameterSignature sig) {
ExtractedBy extractedBy = sig.getAnnotation(ExtractedBy.class);

if (extractedBy != null)
return instantiate(extractedBy.value());
return extractors.get(sig.getType());
}

private RandomValueExtractor instantiate(Class<? extends RandomValueExtractor> type) {
try {
return type.newInstance();
} catch (InstantiationException ex) {
throw new IllegalStateException(ex);
} catch (IllegalAccessException ex) {
throw new IllegalStateException(ex);
}
private RandomValueExtractor<?> extractor(ParameterSignature sig) {
Class<?> key = primitiveToWrapper(sig.getType());
if (!extractors.containsKey(key))
throw new IllegalStateException("Don't know how to generate values of " + sig.getType());
return extractors.get(key);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.pholser.junit.parameters.extractors;

import com.pholser.junit.parameters.random.SourceOfRandomness;

public interface RandomValueExtractor<T> {
T randomValue(SourceOfRandomness random);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.pholser.junit.parameters.extractors;

import java.util.Map;

public interface RandomValueExtractorSource {
Map<Class<?>, RandomValueExtractor<?>> extractors();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.pholser.junit.parameters.extractors;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import java.util.ServiceLoader;

public class ServiceLoaderExtractorSource implements RandomValueExtractorSource {
@Override
public Map<Class<?>, RandomValueExtractor<?>> extractors() {
Map<Class<?>, RandomValueExtractor<?>> extractors = new HashMap<Class<?>, RandomValueExtractor<?>>();
for (RandomValueExtractor<?> each : ServiceLoader.load(RandomValueExtractor.class))
addExtractor(extractors, each);
return extractors;
}

private void addExtractor(Map<Class<?>, RandomValueExtractor<?>> extractors,
RandomValueExtractor<?> newExtractor) {

for (Type each : newExtractor.getClass().getGenericInterfaces()) {
if (each instanceof ParameterizedType) {
ParameterizedType parameterized = (ParameterizedType) each;
if (RandomValueExtractor.class.equals(parameterized.getRawType())) {
Type typeArgument = parameterized.getActualTypeArguments()[0];
if (typeArgument instanceof Class<?>)
extractors.put((Class<?>) typeArgument, newExtractor);
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.pholser.junit.parameters.internal.extractors;

import com.pholser.junit.parameters.extractors.RandomValueExtractor;
import com.pholser.junit.parameters.random.SourceOfRandomness;

public class BooleanExtractor implements RandomValueExtractor<Boolean> {
@Override
public Boolean randomValue(SourceOfRandomness random) {
return random.nextBoolean();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.pholser.junit.parameters.internal.extractors;

import com.pholser.junit.parameters.extractors.RandomValueExtractor;
import com.pholser.junit.parameters.random.SourceOfRandomness;

public class ByteExtractor implements RandomValueExtractor<Byte> {
@Override
public Byte randomValue(SourceOfRandomness random) {
return (byte) random.nextInt();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.pholser.junit.parameters.internal.extractors;

import com.pholser.junit.parameters.extractors.RandomValueExtractor;
import com.pholser.junit.parameters.random.SourceOfRandomness;

public class CharacterExtractor implements RandomValueExtractor<Character> {
@Override
public Character randomValue(SourceOfRandomness random) {
return (char) random.nextInt();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.pholser.junit.parameters.internal.extractors;

import java.util.Date;

import com.pholser.junit.parameters.extractors.RandomValueExtractor;
import com.pholser.junit.parameters.random.SourceOfRandomness;

public class DateExtractor implements RandomValueExtractor<Date> {
@Override
public Date randomValue(SourceOfRandomness random) {
return new Date(random.nextLong());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.pholser.junit.parameters.internal.extractors;

import com.pholser.junit.parameters.extractors.RandomValueExtractor;
import com.pholser.junit.parameters.random.SourceOfRandomness;

public class DoubleExtractor implements RandomValueExtractor<Double> {
@Override
public Double randomValue(SourceOfRandomness random) {
return random.nextDouble();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.pholser.junit.parameters.internal.extractors;

import com.pholser.junit.parameters.extractors.RandomValueExtractor;
import com.pholser.junit.parameters.random.SourceOfRandomness;

public class FloatExtractor implements RandomValueExtractor<Float> {
@Override
public Float randomValue(SourceOfRandomness random) {
return random.nextFloat();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.pholser.junit.parameters.internal.extractors;

import com.pholser.junit.parameters.extractors.RandomValueExtractor;
import com.pholser.junit.parameters.random.SourceOfRandomness;

public class IntegerExtractor implements RandomValueExtractor<Integer> {
@Override
public Integer randomValue(SourceOfRandomness random) {
return random.nextInt();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.pholser.junit.parameters.internal.extractors;

import com.pholser.junit.parameters.extractors.RandomValueExtractor;
import com.pholser.junit.parameters.random.SourceOfRandomness;

public class LongExtractor implements RandomValueExtractor<Long> {
@Override
public Long randomValue(SourceOfRandomness random) {
return random.nextLong();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.pholser.junit.parameters.internal.extractors;

import com.pholser.junit.parameters.extractors.RandomValueExtractor;
import com.pholser.junit.parameters.random.SourceOfRandomness;

public class ShortExtractor implements RandomValueExtractor<Short> {
@Override
public Short randomValue(SourceOfRandomness random) {
return (short) random.nextInt();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.pholser.junit.parameters.internal.extractors;

import java.io.UnsupportedEncodingException;

import com.pholser.junit.parameters.extractors.RandomValueExtractor;
import com.pholser.junit.parameters.random.SourceOfRandomness;

public class StringExtractor implements RandomValueExtractor<String> {
@Override
public String randomValue(SourceOfRandomness random) {
try {
return new String(random.nextBytes(16), "US-ASCII");
} catch (UnsupportedEncodingException ex) {
throw new AssertionError(ex);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.pholser.junit.parameters;
package com.pholser.junit.parameters.random;

import java.util.Random;

public abstract class AbstractJDKSourceOfRandomness implements SourceOfRandomness {
abstract class AbstractJDKSourceOfRandomness implements SourceOfRandomness {
private final Random random;

protected AbstractJDKSourceOfRandomness(Random random) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.pholser.junit.parameters;
package com.pholser.junit.parameters.random;

import java.util.Random;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.pholser.junit.parameters;
package com.pholser.junit.parameters.random;

import java.security.SecureRandom;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.pholser.junit.parameters;
package com.pholser.junit.parameters.random;

public interface SourceOfRandomness {
boolean nextBoolean();
Expand Down
Loading

0 comments on commit 13d8db7

Please sign in to comment.