Skip to content

Commit 5497f01

Browse files
author
Befrish
committed
fix #5 Add support for Maps
1 parent 7b032fa commit 5497f01

File tree

93 files changed

+1151
-201
lines changed

Some content is hidden

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

93 files changed

+1151
-201
lines changed

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,20 @@ Adds [jqwik](https://jqwik.net/) arbitraries for [Vavr](https://www.vavr.io/vavr
1919
- `io.vavr.collection.Set`
2020
- `io.vavr.collection.HashSet`
2121
- `io.vavr.collection.LinkedHashSet`
22+
- `io.vavr.collection.SortedSet`
2223
- `io.vavr.collection.TreeSet`
2324
- `io.vavr.collection.BitSet`
2425
- `io.vavr.collection.Tree`
26+
- `io.vavr.collection.Map`
27+
- `io.vavr.collection.HashMap`
28+
- `io.vavr.collection.LinkedHashMap`
29+
- `io.vavr.collection.SortedMap`
30+
- `io.vavr.collection.TreeMap`
31+
- `io.vavr.collection.Multimap`
32+
- `io.vavr.collection.HashMultimap`
33+
- `io.vavr.collection.LinkedHashMultimap`
34+
- `io.vavr.collection.SortedMultimap`
35+
- `io.vavr.collection.TreeMultimap`
2536

2637
- `io.vavr.Lazy`
2738

src/main/java/de/befrish/jqwik/vavr/VavrArbitraries.java

Lines changed: 109 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,61 @@
11
package de.befrish.jqwik.vavr;
22

3-
import de.befrish.jqwik.vavr.arbitraries.VavrArrayArbitrary;
4-
import de.befrish.jqwik.vavr.arbitraries.VavrBitSetArbitrary;
5-
import de.befrish.jqwik.vavr.arbitraries.VavrCharSeqArbitrary;
6-
import de.befrish.jqwik.vavr.arbitraries.VavrEitherArbitrary;
7-
import de.befrish.jqwik.vavr.arbitraries.VavrFutureArbitrary;
8-
import de.befrish.jqwik.vavr.arbitraries.VavrHashSetArbitrary;
9-
import de.befrish.jqwik.vavr.arbitraries.VavrIteratorArbitrary;
3+
import de.befrish.jqwik.vavr.arbitraries.collection.map.VavrHashMultimapArbitrary;
4+
import de.befrish.jqwik.vavr.arbitraries.collection.map.VavrLinkedHashMultimapArbitrary;
5+
import de.befrish.jqwik.vavr.arbitraries.collection.map.VavrTreeMultimapArbitrary;
6+
import de.befrish.jqwik.vavr.arbitraries.collection.seq.VavrArrayArbitrary;
7+
import de.befrish.jqwik.vavr.arbitraries.collection.set.VavrBitSetArbitrary;
8+
import de.befrish.jqwik.vavr.arbitraries.collection.seq.VavrCharSeqArbitrary;
9+
import de.befrish.jqwik.vavr.arbitraries.control.VavrEitherArbitrary;
10+
import de.befrish.jqwik.vavr.arbitraries.concurrent.VavrFutureArbitrary;
11+
import de.befrish.jqwik.vavr.arbitraries.collection.map.VavrHashMapArbitrary;
12+
import de.befrish.jqwik.vavr.arbitraries.collection.set.VavrHashSetArbitrary;
13+
import de.befrish.jqwik.vavr.arbitraries.collection.VavrIteratorArbitrary;
1014
import de.befrish.jqwik.vavr.arbitraries.VavrLazyArbitrary;
11-
import de.befrish.jqwik.vavr.arbitraries.VavrLinkedHashSetArbitrary;
12-
import de.befrish.jqwik.vavr.arbitraries.VavrListArbitrary;
13-
import de.befrish.jqwik.vavr.arbitraries.VavrOptionArbitrary;
14-
import de.befrish.jqwik.vavr.arbitraries.VavrPriorityQueueArbitrary;
15-
import de.befrish.jqwik.vavr.arbitraries.VavrQueueArbitrary;
16-
import de.befrish.jqwik.vavr.arbitraries.VavrStreamArbitrary;
17-
import de.befrish.jqwik.vavr.arbitraries.VavrTreeArbitrary;
18-
import de.befrish.jqwik.vavr.arbitraries.VavrTreeSetArbitrary;
19-
import de.befrish.jqwik.vavr.arbitraries.VavrTryArbitrary;
20-
import de.befrish.jqwik.vavr.arbitraries.VavrValidationArbitrary;
21-
import de.befrish.jqwik.vavr.arbitraries.VavrVectorArbitrary;
15+
import de.befrish.jqwik.vavr.arbitraries.collection.map.VavrLinkedHashMapArbitrary;
16+
import de.befrish.jqwik.vavr.arbitraries.collection.set.VavrLinkedHashSetArbitrary;
17+
import de.befrish.jqwik.vavr.arbitraries.collection.seq.VavrListArbitrary;
18+
import de.befrish.jqwik.vavr.arbitraries.control.VavrOptionArbitrary;
19+
import de.befrish.jqwik.vavr.arbitraries.collection.queue.VavrPriorityQueueArbitrary;
20+
import de.befrish.jqwik.vavr.arbitraries.collection.queue.VavrQueueArbitrary;
21+
import de.befrish.jqwik.vavr.arbitraries.collection.VavrStreamArbitrary;
22+
import de.befrish.jqwik.vavr.arbitraries.collection.VavrTreeArbitrary;
23+
import de.befrish.jqwik.vavr.arbitraries.collection.map.VavrTreeMapArbitrary;
24+
import de.befrish.jqwik.vavr.arbitraries.collection.set.VavrTreeSetArbitrary;
25+
import de.befrish.jqwik.vavr.arbitraries.control.VavrTryArbitrary;
26+
import de.befrish.jqwik.vavr.arbitraries.control.VavrValidationArbitrary;
27+
import de.befrish.jqwik.vavr.arbitraries.collection.seq.VavrVectorArbitrary;
2228
import io.vavr.collection.Array;
2329
import io.vavr.collection.BitSet;
2430
import io.vavr.collection.CharSeq;
31+
import io.vavr.collection.HashMap;
32+
import io.vavr.collection.HashMultimap;
2533
import io.vavr.collection.HashSet;
2634
import io.vavr.collection.IndexedSeq;
2735
import io.vavr.collection.Iterator;
2836
import io.vavr.collection.LinearSeq;
37+
import io.vavr.collection.LinkedHashMap;
38+
import io.vavr.collection.LinkedHashMultimap;
2939
import io.vavr.collection.LinkedHashSet;
3040
import io.vavr.collection.List;
41+
import io.vavr.collection.Map;
42+
import io.vavr.collection.Multimap;
3143
import io.vavr.collection.PriorityQueue;
3244
import io.vavr.collection.Queue;
3345
import io.vavr.collection.Seq;
3446
import io.vavr.collection.Set;
47+
import io.vavr.collection.SortedMap;
48+
import io.vavr.collection.SortedMultimap;
3549
import io.vavr.collection.Stream;
3650
import io.vavr.collection.Tree;
51+
import io.vavr.collection.TreeMap;
52+
import io.vavr.collection.TreeMultimap;
3753
import io.vavr.collection.TreeSet;
3854
import io.vavr.collection.Vector;
3955
import net.jqwik.api.Arbitrary;
56+
import net.jqwik.api.arbitraries.SizableArbitrary;
4057
import net.jqwik.api.arbitraries.StreamableArbitrary;
4158

42-
import java.util.ArrayList;
4359
import java.util.Comparator;
4460

4561
public final class VavrArbitraries {
@@ -156,6 +172,56 @@ public static <T> StreamableArbitrary<T, Tree<T>> tree(final Arbitrary<T> elemen
156172
return new VavrTreeArbitrary<>(elementArbitrary, elementArbitrary.isUnique());
157173
}
158174

175+
public static <K, V> SizableArbitrary<HashMap<K, V>> hashMap(
176+
final Arbitrary<K> keysArbitrary,
177+
final Arbitrary<V> valuesArbitrary) {
178+
return new VavrHashMapArbitrary<>(keysArbitrary, valuesArbitrary);
179+
}
180+
181+
public static <K, V> SizableArbitrary<LinkedHashMap<K, V>> linkedHashMap(
182+
final Arbitrary<K> keysArbitrary,
183+
final Arbitrary<V> valuesArbitrary) {
184+
return new VavrLinkedHashMapArbitrary<>(keysArbitrary, valuesArbitrary);
185+
}
186+
187+
public static <K, V> SizableArbitrary<TreeMap<K, V>> treeMap(
188+
final Arbitrary<K> keysArbitrary,
189+
final Arbitrary<V> valuesArbitrary) {
190+
return new VavrTreeMapArbitrary<>(keysArbitrary, valuesArbitrary);
191+
}
192+
193+
public static <K, V> SizableArbitrary<TreeMap<K, V>> treeMap(
194+
final Arbitrary<K> keysArbitrary,
195+
final Arbitrary<V> valuesArbitrary,
196+
final Comparator<K> keyComparator) {
197+
return new VavrTreeMapArbitrary<>(keysArbitrary, valuesArbitrary, keyComparator);
198+
}
199+
200+
public static <K, V> SizableArbitrary<HashMultimap<K, V>> hashMultimap(
201+
final Arbitrary<K> keysArbitrary,
202+
final Arbitrary<V> valuesArbitrary) {
203+
return new VavrHashMultimapArbitrary<>(keysArbitrary, valuesArbitrary);
204+
}
205+
206+
public static <K, V> SizableArbitrary<LinkedHashMultimap<K, V>> linkedHashMultimap(
207+
final Arbitrary<K> keysArbitrary,
208+
final Arbitrary<V> valuesArbitrary) {
209+
return new VavrLinkedHashMultimapArbitrary<>(keysArbitrary, valuesArbitrary);
210+
}
211+
212+
public static <K, V> SizableArbitrary<TreeMultimap<K, V>> treeMultimap(
213+
final Arbitrary<K> keysArbitrary,
214+
final Arbitrary<V> valuesArbitrary) {
215+
return new VavrTreeMultimapArbitrary<>(keysArbitrary, valuesArbitrary);
216+
}
217+
218+
public static <K, V> SizableArbitrary<TreeMultimap<K, V>> treeMultimap(
219+
final Arbitrary<K> keysArbitrary,
220+
final Arbitrary<V> valuesArbitrary,
221+
final Comparator<K> keyComparator) {
222+
return new VavrTreeMultimapArbitrary<>(keysArbitrary, valuesArbitrary, keyComparator);
223+
}
224+
159225
/*
160226
* Interfaces
161227
*/
@@ -181,4 +247,28 @@ public static <T extends Comparable<T>> StreamableArbitrary<T, TreeSet<T>> sorte
181247
return treeSet(elementArbitrary);
182248
}
183249

250+
public static <K, V> SizableArbitrary<? extends Map<K, V>> map(
251+
final Arbitrary<K> keysArbitrary,
252+
final Arbitrary<V> valuesArbitrary) {
253+
return hashMap(keysArbitrary, valuesArbitrary);
254+
}
255+
256+
public static <K, V> SizableArbitrary<? extends SortedMap<K, V>> sortedMap(
257+
final Arbitrary<K> keysArbitrary,
258+
final Arbitrary<V> valuesArbitrary) {
259+
return treeMap(keysArbitrary, valuesArbitrary);
260+
}
261+
262+
public static <K, V> SizableArbitrary<? extends Multimap<K, V>> multimap(
263+
final Arbitrary<K> keysArbitrary,
264+
final Arbitrary<V> valuesArbitrary) {
265+
return hashMultimap(keysArbitrary, valuesArbitrary);
266+
}
267+
268+
public static <K, V> SizableArbitrary<? extends SortedMultimap<K, V>> sortedMultimap(
269+
final Arbitrary<K> keysArbitrary,
270+
final Arbitrary<V> valuesArbitrary) {
271+
return treeMultimap(keysArbitrary, valuesArbitrary);
272+
}
273+
184274
}

src/main/java/de/befrish/jqwik/vavr/arbitraries/VavrLazyArbitrary.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package de.befrish.jqwik.vavr.arbitraries;
22

3-
import de.befrish.jqwik.vavr.arbitraries.base.SinglevalueArbitraryBase;
3+
import de.befrish.jqwik.vavr.arbitraries.base.AbstractSingleValueArbitrary;
44
import io.vavr.Lazy;
55
import net.jqwik.api.Arbitrary;
66

7-
public class VavrLazyArbitrary<T> extends SinglevalueArbitraryBase<T, Lazy<T>> implements Arbitrary<Lazy<T>> {
7+
public class VavrLazyArbitrary<T> extends AbstractSingleValueArbitrary<T, Lazy<T>> implements Arbitrary<Lazy<T>> {
88

99
public VavrLazyArbitrary(final Arbitrary<T> innerArbitrary) {
1010
super(innerArbitrary);

src/main/java/de/befrish/jqwik/vavr/arbitraries/base/MultivalueArbitraryBase.java renamed to src/main/java/de/befrish/jqwik/vavr/arbitraries/base/AbstractCollectionBasedArbitrary.java

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919

2020
import static net.jqwik.engine.properties.arbitraries.ArbitrariesSupport.maxNumberOfElements;
2121

22-
public abstract class MultivalueArbitraryBase<T, U> extends AbstractArbitraryBase implements StreamableArbitrary<T, U> {
22+
public abstract class AbstractCollectionBasedArbitrary<T, U> extends AbstractArbitraryBase implements StreamableArbitrary<T, U> {
2323

2424
protected Arbitrary<T> elementArbitrary;
2525
protected int minSize = 0;
2626
protected int maxSize = RandomGenerators.DEFAULT_COLLECTION_SIZE;
2727
private final boolean elementsUnique;
2828

29-
public MultivalueArbitraryBase(final Arbitrary<T> elementArbitrary, final boolean elementsUnique) {
29+
public AbstractCollectionBasedArbitrary(final Arbitrary<T> elementArbitrary, final boolean elementsUnique) {
3030
this.elementArbitrary = elementArbitrary;
3131
this.elementsUnique = elementsUnique;
3232
if (elementsUnique) {
@@ -36,14 +36,14 @@ public MultivalueArbitraryBase(final Arbitrary<T> elementArbitrary, final boolea
3636

3737
@Override
3838
public StreamableArbitrary<T, U> ofMinSize(final int minSize) {
39-
final MultivalueArbitraryBase<T, U> clone = typedClone();
39+
final AbstractCollectionBasedArbitrary<T, U> clone = typedClone();
4040
clone.minSize = minSize;
4141
return clone;
4242
}
4343

4444
@Override
4545
public StreamableArbitrary<T, U> ofMaxSize(final int maxSize) {
46-
final MultivalueArbitraryBase<T, U> clone = typedClone();
46+
final AbstractCollectionBasedArbitrary<T, U> clone = typedClone();
4747
clone.maxSize = maxSize;
4848
return clone;
4949
}
@@ -79,10 +79,17 @@ protected RandomGenerator<T> elementGenerator(final Arbitrary<T> elementArbitrar
7979
return elementArbitrary.generator(genSize);
8080
}
8181

82-
protected <C extends Collection<?>> EdgeCases<C> edgeCases(final BiFunction<List<Shrinkable<T>>, Integer, Shrinkable<C>> shrinkableCreator) {
83-
final EdgeCases<C> emptyListEdgeCase = (this.minSize == 0) ? emptyListEdgeCase(shrinkableCreator) : EdgeCases.none();
84-
final EdgeCases<C> singleElementEdgeCases = (this.minSize <= 1 && this.maxSize >= 1) ? fixedSizeEdgeCases(1, shrinkableCreator) : EdgeCases.none();
85-
final EdgeCases<C> fixedSizeEdgeCases = generateFixedSizeEdgeCases() ? fixedSizeEdgeCases(this.minSize, shrinkableCreator) : EdgeCases.none();
82+
protected <C extends Collection<?>> EdgeCases<C> edgeCases(
83+
final BiFunction<List<Shrinkable<T>>, Integer, Shrinkable<C>> shrinkableCreator) {
84+
final EdgeCases<C> emptyListEdgeCase = (this.minSize == 0)
85+
? emptyListEdgeCase(shrinkableCreator)
86+
: EdgeCases.none();
87+
final EdgeCases<C> singleElementEdgeCases = (this.minSize <= 1 && this.maxSize >= 1)
88+
? fixedSizeEdgeCases(1, shrinkableCreator)
89+
: EdgeCases.none();
90+
final EdgeCases<C> fixedSizeEdgeCases = generateFixedSizeEdgeCases()
91+
? fixedSizeEdgeCases(this.minSize, shrinkableCreator)
92+
: EdgeCases.none();
8693
return EdgeCasesSupport.concat(Arrays.asList(emptyListEdgeCase, singleElementEdgeCases, fixedSizeEdgeCases));
8794
}
8895

@@ -100,15 +107,15 @@ private <C extends Collection<?>> EdgeCases<C> fixedSizeEdgeCases(
100107
return this.elementArbitrary
101108
.edgeCases()
102109
.mapShrinkable((Shrinkable<T> shrinkableT) -> {
103-
final List<Shrinkable<T>> elements = new ArrayList<>(Collections.nCopies(fixedSize, shrinkableT));
110+
final List<Shrinkable<T>> elements = new ArrayList<>(
111+
Collections.nCopies(fixedSize, shrinkableT));
104112
return shrinkableCreator.apply(elements, this.minSize);
105113
});
106114
}
107115

108-
private <C extends Collection<?>> EdgeCases<C> emptyListEdgeCase(final BiFunction<List<Shrinkable<T>>, Integer, Shrinkable<C>> shrinkableCreator) {
109-
return EdgeCases.fromSupplier(
110-
() -> shrinkableCreator.apply(Collections.emptyList(), this.minSize)
111-
);
116+
private <C extends Collection<?>> EdgeCases<C> emptyListEdgeCase(
117+
final BiFunction<List<Shrinkable<T>>, Integer, Shrinkable<C>> shrinkableCreator) {
118+
return EdgeCases.fromSupplier(() -> shrinkableCreator.apply(Collections.emptyList(), this.minSize));
112119
}
113120

114121
}

src/main/java/de/befrish/jqwik/vavr/arbitraries/base/DoublevalueArbitraryBase.java renamed to src/main/java/de/befrish/jqwik/vavr/arbitraries/base/AbstractDoubleValueArbitrary.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
import net.jqwik.api.EdgeCases;
66
import net.jqwik.api.RandomGenerator;
77

8-
public abstract class DoublevalueArbitraryBase<T1, T2, U> implements Arbitrary<U> {
8+
public abstract class AbstractDoubleValueArbitrary<T1, T2, U> implements Arbitrary<U> {
99

1010
private final Arbitrary<T1> firstArbitrary;
1111
private final Arbitrary<T2> secondArbitrary;
1212

13-
public DoublevalueArbitraryBase(final Arbitrary<T1> firstArbitrary, final Arbitrary<T2> secondArbitrary) {
13+
public AbstractDoubleValueArbitrary(final Arbitrary<T1> firstArbitrary, final Arbitrary<T2> secondArbitrary) {
1414
this.firstArbitrary = firstArbitrary;
1515
this.secondArbitrary = secondArbitrary;
1616
}

src/main/java/de/befrish/jqwik/vavr/arbitraries/base/AbstractListBasedVavrArbitrary.java

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,12 @@
55
import net.jqwik.api.EdgeCases;
66
import net.jqwik.api.ExhaustiveGenerator;
77
import net.jqwik.api.RandomGenerator;
8-
import net.jqwik.api.arbitraries.StreamableArbitrary;
98
import net.jqwik.engine.properties.arbitraries.exhaustive.ExhaustiveGenerators;
109
import net.jqwik.engine.properties.shrinking.ShrinkableList;
1110

1211
import java.util.Optional;
1312

14-
public abstract class AbstractListBasedVavrArbitrary<T, U extends Traversable<T>>
15-
extends MultivalueArbitraryBase<T, U>
16-
implements StreamableArbitrary<T, U> {
13+
public abstract class AbstractListBasedVavrArbitrary<T, U extends Traversable<T>> extends AbstractCollectionBasedArbitrary<T, U> {
1714

1815
public AbstractListBasedVavrArbitrary(final Arbitrary<T> elementArbitrary, final boolean elementsUnique) {
1916
super(elementArbitrary, elementsUnique);
@@ -43,21 +40,4 @@ public EdgeCases<U> edgeCases() {
4340
.map(this::convertJavaListToVavrCollection);
4441
}
4542

46-
// @Override
47-
// public <U> Arbitrary<List<U>> mapEach(final BiFunction<List<T>, T, U> mapper) {
48-
// return this.map(elements -> elements.stream()
49-
// .map(e -> mapper.apply(elements, e))
50-
// .collect(Collectors.toList()));
51-
// }
52-
//
53-
// @Override
54-
// public <U> Arbitrary<List<U>> flatMapEach(final BiFunction<List<T>, T, Arbitrary<U>> flatMapper) {
55-
// return this.flatMap(elements -> {
56-
// final List<Arbitrary<U>> arbitraries =
57-
// elements.stream()
58-
// .map(e -> flatMapper.apply(elements, e))
59-
// .collect(Collectors.toList());
60-
// return Combinators.combine(arbitraries).as(ArrayList::new);
61-
// });
62-
// }
6343
}

0 commit comments

Comments
 (0)