Skip to content

Commit

Permalink
Merge pull request #131 from /issues/130
Browse files Browse the repository at this point in the history
For #130, Fields generator ignores final fields
  • Loading branch information
pholser committed Sep 15, 2016
2 parents 6422c98 + 38efd74 commit 303786a
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 26 deletions.
Expand Up @@ -27,12 +27,14 @@ a copy of this software and associated documentation files (the

import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

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

import static com.pholser.junit.quickcheck.internal.Reflection.*;
import static java.util.stream.Collectors.*;

/**
* <p>Produces instances of a class by reflecting the class's fields and
Expand Down Expand Up @@ -63,7 +65,10 @@ public class Fields<T> extends Generator<T> {
public Fields(Class<T> type) {
super(type);

this.fields = allDeclaredFieldsOf(type);
this.fields =
allDeclaredFieldsOf(type).stream()
.filter(f -> !Modifier.isFinal(f.getModifiers()))
.collect(toList());

instantiate(type);
}
Expand All @@ -72,8 +77,13 @@ public Fields(Class<T> type) {
Class<T> type = types().get(0);
Object generated = instantiate(type);

for (Field each : fields)
setField(each, generated, gen().field(each).generate(random, status), true);
for (Field each : fields) {
setField(
each,
generated,
gen().field(each).generate(random, status),
true);
}

return type.cast(generated);
}
Expand Down
Expand Up @@ -193,7 +193,10 @@ public static List<Field> allDeclaredFieldsOf(Class<?> type) {
for (Class<?> c = type; c != null; c = c.getSuperclass())
Collections.addAll(allFields, c.getDeclaredFields());

List<Field> results = allFields.stream().filter(f -> ! f.isSynthetic()).collect(toList());
List<Field> results =
allFields.stream()
.filter(f -> !f.isSynthetic())
.collect(toList());
results.forEach(f -> f.setAccessible(true));

return results;
Expand Down
Expand Up @@ -25,6 +25,7 @@ a copy of this software and associated documentation files (the

package com.pholser.junit.quickcheck;

import java.io.Serializable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

Expand Down Expand Up @@ -60,11 +61,11 @@ public class PropertyParameterGenerationByFieldsTest {
private static Object object;

@Test public void autoGeneration() {
assertThat(testResult(WithAutoGeneration.class), isSuccessful());
assertThat(testResult(AutoGeneration.class), isSuccessful());
}

@RunWith(JUnitQuickcheck.class)
public static class WithAutoGeneration {
public static class AutoGeneration {
public static class P {
public Zilch z;
public Foo f;
Expand All @@ -76,11 +77,11 @@ public static class P {
}

@Test public void autoGenerationOnGenericType() {
assertThat(testResult(WithAutoGenerationOnGenericType.class), isSuccessful());
assertThat(testResult(AutoGenerationOnGenericType.class), isSuccessful());
}

@RunWith(JUnitQuickcheck.class)
public static class WithAutoGenerationOnGenericType {
public static class AutoGenerationOnGenericType {
@Property public void shouldHold(@From(Fields.class) FakeList<Foo> list) {
}
}
Expand All @@ -98,35 +99,47 @@ public static class FakeList<T> {
}

@Test public void autoGenerationOnPrimitiveType() {
PrintableResult result = testResult(WithAutoGenerationOnPrimitiveType.class);
assertThat(result, hasSingleFailureContaining(ReflectionException.class.getName()));
assertThat(result, hasSingleFailureContaining(InstantiationException.class.getName()));
PrintableResult result = testResult(AutoGenerationOnPrimitiveType.class);

assertThat(
result,
hasSingleFailureContaining(ReflectionException.class.getName()));
assertThat(
result,
hasSingleFailureContaining(InstantiationException.class.getName()));
}

@RunWith(JUnitQuickcheck.class)
public static class WithAutoGenerationOnPrimitiveType {
public static class AutoGenerationOnPrimitiveType {
@Property public void shouldHold(@From(Fields.class) int i) {
}
}

@Test public void autoGenerationOnPrimitiveWrapperType() {
PrintableResult result = testResult(WithAutoGenerationOnPrimitiveWrapperType.class);
assertThat(result, hasSingleFailureContaining(ReflectionException.class.getName()));
assertThat(result, hasSingleFailureContaining(InstantiationException.class.getName()));
PrintableResult result = testResult(AutoGenerationOnPrimitiveWrapperType.class);

assertThat(
result,
hasSingleFailureContaining(ReflectionException.class.getName()));
assertThat(
result,
hasSingleFailureContaining(InstantiationException.class.getName()));
}

@RunWith(JUnitQuickcheck.class)
public static class WithAutoGenerationOnPrimitiveWrapperType {
public static class AutoGenerationOnPrimitiveWrapperType {
@Property public void shouldHold(@From(Fields.class) Float f) {
}
}

@Test public void autoGenerationWithAnnotations() {
assertThat(testResult(WithAutoGenerationWithAnnotations.class), isSuccessful());
assertThat(
testResult(AutoGenerationWithAnnotations.class),
isSuccessful());
}

@RunWith(JUnitQuickcheck.class)
public static class WithAutoGenerationWithAnnotations {
public static class AutoGenerationWithAnnotations {
public static class P {
@From(AnInt.class) @Between(min = 2, max = 4) public int i;
}
Expand All @@ -137,11 +150,13 @@ public static class P {
}

@Test public void autoGenerationWithAggregateAnnotation() {
assertThat(testResult(WithAutoGenerationWithAggregateAnnotations.class), isSuccessful());
assertThat(
testResult(AutoGenerationWithAggregateAnnotations.class),
isSuccessful());
}

@RunWith(JUnitQuickcheck.class)
public static class WithAutoGenerationWithAggregateAnnotations {
public static class AutoGenerationWithAggregateAnnotations {
@Target({PARAMETER, FIELD, ANNOTATION_TYPE, TYPE_USE})
@Retention(RUNTIME)
@From(AnInt.class)
Expand All @@ -159,11 +174,13 @@ public static class P {
}

@Test public void autoGenerationWithAnnotationsOnTypeUsesInFields() {
assertThat(testResult(WithAutoGenerationWithAnnotationsOnTypeUsesInFields.class), isSuccessful());
assertThat(
testResult(AutoGenerationWithAnnotationsOnTypeUsesInFields.class),
isSuccessful());
}

@RunWith(JUnitQuickcheck.class)
public static class WithAutoGenerationWithAnnotationsOnTypeUsesInFields {
public static class AutoGenerationWithAnnotationsOnTypeUsesInFields {
public static class P {
public Box<@X Foo> box;
}
Expand All @@ -175,11 +192,13 @@ public static class P {
}

@Test public void autoGenerationWithAggregateAnnotationsOnTypeUsesInFields() {
assertThat(testResult(WithAutoGenerationWithAggregateAnnotationsOnTypeUsesInFields.class), isSuccessful());
assertThat(
testResult(AutoGenerationWithAggregateAnnotationsOnTypeUsesInFields.class),
isSuccessful());
}

@RunWith(JUnitQuickcheck.class)
public static class WithAutoGenerationWithAggregateAnnotationsOnTypeUsesInFields {
public static class AutoGenerationWithAggregateAnnotationsOnTypeUsesInFields {
@Target({PARAMETER, FIELD, ANNOTATION_TYPE, TYPE_USE})
@Retention(RUNTIME)
@X
Expand All @@ -206,13 +225,29 @@ public static class Tuple3<A, B, C> {

@Test public void autoGenerationWithUnresolvedTypeVariablesInFields() {
assertThat(
testResult(WithAutoGenerationWithUnresolvedTypeVariablesInFields.class),
testResult(AutoGenerationWithUnresolvedTypeVariablesInFields.class),
hasSingleFailureContaining("No variable substitution established"));
}

@RunWith(JUnitQuickcheck.class)
public static class WithAutoGenerationWithUnresolvedTypeVariablesInFields<A, B, C> {
public static class AutoGenerationWithUnresolvedTypeVariablesInFields<A, B, C> {
@Property public void shouldHold(@From(Fields.class) Tuple3<A, B, C> t) {
}
}

@Test public void autoGenerationWithFinalFields() {
assertThat(
testResult(AutoGenerationWithFinalFields.class),
isSuccessful());
}

@RunWith(JUnitQuickcheck.class)
public static class AutoGenerationWithFinalFields {
public static class Hamster{
private static final Foo F = new Foo(12, false);
}

@Property public void holds(@From(Fields.class) Hamster h) {
}
}
}

0 comments on commit 303786a

Please sign in to comment.