Skip to content

Commit ae91f71

Browse files
authored
Merge pull request #1021 from jqno/add-cached-valueprovider
Add cached valueprovider
2 parents bf849eb + 486c144 commit ae91f71

File tree

63 files changed

+906
-628
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+906
-628
lines changed

equalsverifier-16/src/test/java/nl/jqno/equalsverifier/integration/extended_contract/RecordsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public void succeed_whenRecordValidatesInput_givenValidPrefabValues() {
134134
}
135135

136136
@Test
137-
public void succeed_whenRecord() {
137+
public void succeed_whenRecordHasBoundedWildcardGeneric() {
138138
EqualsVerifier.forClass(WildcardGenericRecordContainer.class).verify();
139139
}
140140

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package nl.jqno.equalsverifier.internal.reflection.vintage;
2+
3+
import static nl.jqno.equalsverifier.internal.reflection.vintage.prefabvalues.factories.Factories.values;
4+
import static org.junit.jupiter.api.Assertions.assertEquals;
5+
import static org.junit.jupiter.api.Assertions.assertNotSame;
6+
7+
import nl.jqno.equalsverifier.internal.reflection.Tuple;
8+
import nl.jqno.equalsverifier.internal.reflection.TypeTag;
9+
import nl.jqno.equalsverifier.internal.reflection.instantiation.CachedValueProvider;
10+
import nl.jqno.equalsverifier.internal.reflection.instantiation.ValueProvider.Attributes;
11+
import nl.jqno.equalsverifier.internal.reflection.vintage.prefabvalues.factories.FallbackFactory;
12+
import nl.jqno.equalsverifier.internal.testhelpers.TestValueProviders;
13+
import org.junit.jupiter.api.BeforeEach;
14+
import org.junit.jupiter.api.Test;
15+
import org.objenesis.Objenesis;
16+
import org.objenesis.ObjenesisStd;
17+
18+
public class RecordFallbackFactoryTest {
19+
20+
private FallbackFactory<?> factory;
21+
private VintageValueProvider valueProvider;
22+
private Attributes attributes;
23+
24+
@BeforeEach
25+
public void setUp() {
26+
Objenesis objenesis = new ObjenesisStd();
27+
factory = new FallbackFactory<>(objenesis);
28+
CachedValueProvider cache = new CachedValueProvider();
29+
FactoryCache factoryCache = new FactoryCache();
30+
factoryCache.put(int.class, values(42, 1337, 42));
31+
valueProvider =
32+
new VintageValueProvider(TestValueProviders.empty(), cache, factoryCache, objenesis);
33+
attributes = Attributes.unlabeled();
34+
}
35+
36+
@Test
37+
public void redCopyHasTheSameValuesAsRed_whenSutContainsGenericValueThatNeedsToBeIdenticalInRedAndRedCopy() {
38+
Tuple<?> tuple = factory.createValues(
39+
new TypeTag(GenericRecordContainer.class),
40+
valueProvider,
41+
attributes
42+
);
43+
44+
assertEquals(tuple.getRed(), tuple.getRedCopy());
45+
assertNotSame(tuple.getRed(), tuple.getRedCopy());
46+
}
47+
48+
record GenericRecord<T>(T t) {}
49+
50+
record GenericRecordContainer(GenericRecord<?> bgr) {}
51+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package nl.jqno.equalsverifier.internal.reflection.vintage;
1+
package nl.jqno.equalsverifier.internal.reflection.vintage.mutation;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
44
import static org.junit.jupiter.api.Assertions.assertNotSame;
Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,39 @@
1-
package nl.jqno.equalsverifier.internal.reflection.vintage;
1+
package nl.jqno.equalsverifier.internal.reflection.vintage.mutation;
22

33
import static nl.jqno.equalsverifier.internal.reflection.vintage.prefabvalues.factories.Factories.values;
44
import static org.junit.jupiter.api.Assertions.assertFalse;
55
import static org.junit.jupiter.api.Assertions.assertNotSame;
66

77
import java.lang.reflect.Constructor;
8-
import java.util.LinkedHashSet;
98
import nl.jqno.equalsverifier.internal.reflection.JavaApiPrefabValues;
109
import nl.jqno.equalsverifier.internal.reflection.TypeTag;
11-
import nl.jqno.equalsverifier.internal.reflection.instantiation.VintageValueProvider;
10+
import nl.jqno.equalsverifier.internal.reflection.instantiation.CachedValueProvider;
11+
import nl.jqno.equalsverifier.internal.reflection.instantiation.ValueProvider.Attributes;
12+
import nl.jqno.equalsverifier.internal.reflection.vintage.FactoryCache;
13+
import nl.jqno.equalsverifier.internal.reflection.vintage.VintageValueProvider;
1214
import nl.jqno.equalsverifier.internal.testhelpers.TestValueProviders;
1315
import org.junit.jupiter.api.BeforeEach;
1416
import org.junit.jupiter.api.Test;
1517
import org.objenesis.ObjenesisStd;
1618

1719
public class RecordObjectAccessorScramblingTest {
1820

19-
private static final LinkedHashSet<TypeTag> EMPTY_TYPE_STACK = new LinkedHashSet<>();
21+
private static final Attributes EMPTY_ATTRIBUTES = Attributes.unlabeled();
22+
private CachedValueProvider cache;
2023
private FactoryCache factoryCache;
2124
private VintageValueProvider valueProvider;
2225

2326
@BeforeEach
2427
public void setup() throws Exception {
28+
cache = new CachedValueProvider();
2529
factoryCache = JavaApiPrefabValues.build();
2630
valueProvider =
27-
new VintageValueProvider(TestValueProviders.empty(), factoryCache, new ObjenesisStd());
31+
new VintageValueProvider(
32+
TestValueProviders.empty(),
33+
cache,
34+
factoryCache,
35+
new ObjenesisStd()
36+
);
2837
}
2938

3039
@Test
@@ -58,7 +67,7 @@ private <T> RecordObjectAccessor<T> create(T object) {
5867
}
5968

6069
private ObjectAccessor<Object> doScramble(Object object) {
61-
return create(object).scramble(valueProvider, TypeTag.NULL, EMPTY_TYPE_STACK);
70+
return create(object).scramble(valueProvider, TypeTag.NULL, EMPTY_ATTRIBUTES);
6271
}
6372

6473
record Point(int x, int y) {}
Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
1-
package nl.jqno.equalsverifier.internal.reflection.vintage;
1+
package nl.jqno.equalsverifier.internal.reflection.vintage.mutation;
22

33
import static org.junit.jupiter.api.Assertions.assertSame;
44
import static org.junit.jupiter.api.Assertions.assertTrue;
55

66
import java.lang.reflect.Constructor;
7-
import java.util.LinkedHashSet;
87
import java.util.Objects;
98
import nl.jqno.equalsverifier.internal.exceptions.ReflectionException;
109
import nl.jqno.equalsverifier.internal.reflection.Instantiator;
1110
import nl.jqno.equalsverifier.internal.reflection.JavaApiPrefabValues;
1211
import nl.jqno.equalsverifier.internal.reflection.TypeTag;
13-
import nl.jqno.equalsverifier.internal.reflection.instantiation.VintageValueProvider;
12+
import nl.jqno.equalsverifier.internal.reflection.instantiation.CachedValueProvider;
13+
import nl.jqno.equalsverifier.internal.reflection.instantiation.ValueProvider.Attributes;
14+
import nl.jqno.equalsverifier.internal.reflection.vintage.VintageValueProvider;
1415
import nl.jqno.equalsverifier.internal.testhelpers.ExpectedException;
1516
import nl.jqno.equalsverifier.internal.testhelpers.TestValueProviders;
1617
import org.junit.jupiter.api.BeforeEach;
@@ -20,7 +21,7 @@
2021

2122
public class RecordObjectAccessorTest {
2223

23-
private static final LinkedHashSet<TypeTag> EMPTY_TYPE_STACK = new LinkedHashSet<>();
24+
private static final Attributes EMPTY_ATTRIBUTES = Attributes.unlabeled();
2425
private Objenesis objenesis;
2526
private Object recordInstance;
2627

@@ -77,11 +78,12 @@ public void fail_whenConstructorThrowsOnSomethingElse() {
7778

7879
VintageValueProvider vp = new VintageValueProvider(
7980
TestValueProviders.empty(),
81+
new CachedValueProvider(),
8082
JavaApiPrefabValues.build(),
8183
objenesis
8284
);
8385
ExpectedException
84-
.when(() -> accessorFor(instance).scramble(vp, TypeTag.NULL, EMPTY_TYPE_STACK))
86+
.when(() -> accessorFor(instance).scramble(vp, TypeTag.NULL, EMPTY_ATTRIBUTES))
8587
.assertThrows(ReflectionException.class)
8688
.assertMessageContains("Record:", "failed to run constructor", "prefab values");
8789
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import org.junit.jupiter.api.Test;
77

8-
public class ClassAccessorSealedTest {
8+
public class ClassProbeSealedTest {
99

1010
@Test
1111
public void isNotSealed() {
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package nl.jqno.equalsverifier.internal.reflection.vintage;
2+
3+
import static nl.jqno.equalsverifier.internal.reflection.vintage.prefabvalues.factories.Factories.values;
4+
import static org.junit.jupiter.api.Assertions.assertEquals;
5+
import static org.junit.jupiter.api.Assertions.assertNotSame;
6+
7+
import java.util.Objects;
8+
import nl.jqno.equalsverifier.internal.reflection.Tuple;
9+
import nl.jqno.equalsverifier.internal.reflection.TypeTag;
10+
import nl.jqno.equalsverifier.internal.reflection.instantiation.CachedValueProvider;
11+
import nl.jqno.equalsverifier.internal.reflection.instantiation.ValueProvider.Attributes;
12+
import nl.jqno.equalsverifier.internal.reflection.vintage.prefabvalues.factories.FallbackFactory;
13+
import nl.jqno.equalsverifier.internal.testhelpers.TestValueProviders;
14+
import org.junit.jupiter.api.BeforeEach;
15+
import org.junit.jupiter.api.Test;
16+
import org.objenesis.Objenesis;
17+
import org.objenesis.ObjenesisStd;
18+
19+
public class SealedTypesFallbackFactoryTest {
20+
21+
private FallbackFactory<?> factory;
22+
private VintageValueProvider valueProvider;
23+
private Attributes attributes;
24+
25+
@BeforeEach
26+
public void setUp() {
27+
Objenesis objenesis = new ObjenesisStd();
28+
factory = new FallbackFactory<>(objenesis);
29+
CachedValueProvider cache = new CachedValueProvider();
30+
FactoryCache factoryCache = new FactoryCache();
31+
factoryCache.put(int.class, values(42, 1337, 42));
32+
valueProvider =
33+
new VintageValueProvider(TestValueProviders.empty(), cache, factoryCache, objenesis);
34+
attributes = Attributes.unlabeled();
35+
}
36+
37+
@Test
38+
public void redCopyHasTheSameValuesAsRed_whenSutIsAbstractSealedAndPermittedTypeAddsField() {
39+
Tuple<?> tuple = factory.createValues(
40+
new TypeTag(SealedParentWithFinalChild.class),
41+
valueProvider,
42+
attributes
43+
);
44+
45+
assertEquals(tuple.getRed(), tuple.getRedCopy());
46+
assertNotSame(tuple.getRed(), tuple.getRedCopy());
47+
}
48+
49+
public abstract static sealed class SealedParentWithFinalChild permits FinalSealedChild {
50+
51+
private final int i;
52+
53+
public SealedParentWithFinalChild(int i) {
54+
this.i = i;
55+
}
56+
57+
@Override
58+
public boolean equals(Object obj) {
59+
return obj instanceof SealedParentWithFinalChild other && i == other.i;
60+
}
61+
62+
@Override
63+
public int hashCode() {
64+
return Objects.hash(i);
65+
}
66+
}
67+
68+
public static final class FinalSealedChild extends SealedParentWithFinalChild {
69+
70+
private final int j;
71+
72+
public FinalSealedChild(int i, int j) {
73+
super(i);
74+
this.j = j;
75+
}
76+
77+
@Override
78+
public boolean equals(Object obj) {
79+
return obj instanceof FinalSealedChild other && super.equals(obj) && j == other.j;
80+
}
81+
82+
@Override
83+
public int hashCode() {
84+
return Objects.hash(super.hashCode(), j);
85+
}
86+
}
87+
}

equalsverifier-core/src/main/java/nl/jqno/equalsverifier/ConfiguredEqualsVerifier.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
import nl.jqno.equalsverifier.api.SingleTypeEqualsVerifierApi;
1212
import nl.jqno.equalsverifier.internal.reflection.PackageScanner;
1313
import nl.jqno.equalsverifier.internal.reflection.vintage.FactoryCache;
14+
import nl.jqno.equalsverifier.internal.reflection.vintage.PrefabValuesApi;
1415
import nl.jqno.equalsverifier.internal.util.ListBuilders;
15-
import nl.jqno.equalsverifier.internal.util.PrefabValuesApi;
1616
import nl.jqno.equalsverifier.internal.util.Validations;
1717
import org.objenesis.Objenesis;
1818
import org.objenesis.ObjenesisStd;

equalsverifier-core/src/main/java/nl/jqno/equalsverifier/api/SingleTypeEqualsVerifierApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import nl.jqno.equalsverifier.internal.checkers.*;
1212
import nl.jqno.equalsverifier.internal.exceptions.MessagingException;
1313
import nl.jqno.equalsverifier.internal.reflection.vintage.FactoryCache;
14+
import nl.jqno.equalsverifier.internal.reflection.vintage.PrefabValuesApi;
1415
import nl.jqno.equalsverifier.internal.util.*;
1516
import nl.jqno.equalsverifier.internal.util.Formatter;
1617
import org.objenesis.Objenesis;

equalsverifier-core/src/main/java/nl/jqno/equalsverifier/internal/checkers/AbstractDelegationChecker.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import nl.jqno.equalsverifier.internal.reflection.TypeTag;
1111
import nl.jqno.equalsverifier.internal.reflection.instantiation.SubjectCreator;
1212
import nl.jqno.equalsverifier.internal.reflection.instantiation.ValueProvider;
13+
import nl.jqno.equalsverifier.internal.reflection.instantiation.ValueProvider.Attributes;
1314
import nl.jqno.equalsverifier.internal.util.*;
1415

1516
public class AbstractDelegationChecker<T> implements Checker {
@@ -74,7 +75,7 @@ private void checkAbstractDelegationInFields() {
7475

7576
private <U> Tuple<U> safelyGetTuple(TypeTag tag, String fieldName) {
7677
try {
77-
return valueProvider.provideOrThrow(tag, fieldName);
78+
return valueProvider.provideOrThrow(tag, Attributes.labeled(fieldName));
7879
} catch (Exception ignored) {
7980
// If it fails for some reason, any reason, just return null so we can skip the test.
8081
return null;

0 commit comments

Comments
 (0)