Skip to content

Commit 7690526

Browse files
author
Befrish
committed
fix #8 Specify edge case for Try, Validation and Future as failures
1 parent b63eec3 commit 7690526

File tree

5 files changed

+69
-12
lines changed

5 files changed

+69
-12
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package de.befrish.jqwik.vavr;
2+
3+
import net.jqwik.api.Shrinkable;
4+
import net.jqwik.api.ShrinkingDistance;
5+
import net.jqwik.engine.properties.shrinking.AbstractValueShrinkable;
6+
7+
import java.util.stream.Stream;
8+
9+
/**
10+
* @author Benno Müller
11+
*/
12+
public class SingletonShrinkable<T> extends AbstractValueShrinkable<T> {
13+
14+
private SingletonShrinkable(final T value) {
15+
super(value);
16+
}
17+
18+
public static <T> SingletonShrinkable<T> of(final T value) {
19+
return new SingletonShrinkable<>(value);
20+
}
21+
22+
@Override
23+
public Stream<Shrinkable<T>> shrink() {
24+
return Stream.of(new SingletonShrinkable(value()));
25+
}
26+
27+
@Override
28+
public ShrinkingDistance distance() {
29+
return ShrinkingDistance.of(Long.MIN_VALUE);
30+
}
31+
32+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import de.befrish.jqwik.vavr.arbitraries.base.AbstractSingleValueArbitrary;
44
import io.vavr.Lazy;
55
import net.jqwik.api.Arbitrary;
6+
import net.jqwik.api.EdgeCases;
67

78
public class VavrLazyArbitrary<T> extends AbstractSingleValueArbitrary<T, Lazy<T>> implements Arbitrary<Lazy<T>> {
89

@@ -15,4 +16,9 @@ protected Lazy<T> mapValue(final T value) {
1516
return Lazy.of(() -> value);
1617
}
1718

19+
@Override
20+
protected EdgeCases<Lazy<T>> edgeCases(final Arbitrary<T> innerArbitrary) {
21+
return innerArbitrary.edgeCases().map(this::mapValue);
22+
}
23+
1824
}
Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package de.befrish.jqwik.vavr.arbitraries.base;
22

3+
import io.vavr.control.Option;
34
import net.jqwik.api.Arbitraries;
45
import net.jqwik.api.Arbitrary;
56
import net.jqwik.api.EdgeCases;
67
import net.jqwik.api.RandomGenerator;
8+
import net.jqwik.engine.properties.arbitraries.EdgeCasesSupport;
9+
10+
import java.util.Arrays;
11+
import java.util.function.Function;
712

813
public abstract class AbstractDoubleValueArbitrary<T1, T2, U> implements Arbitrary<U> {
914

@@ -22,22 +27,20 @@ public AbstractDoubleValueArbitrary(final Arbitrary<T1> firstArbitrary, final Ar
2227
public RandomGenerator<U> generator(final int genSize) {
2328
return Arbitraries.of(true, false)
2429
.generator(genSize)
25-
.flatMap(
26-
firstValue -> firstValue
27-
? this.firstArbitrary.map(this::mapFirstValue)
28-
: this.secondArbitrary.map(this::mapSecondValue),
29-
genSize
30-
);
30+
.flatMap(this::getMappedArbitrary, genSize);
31+
}
3132

33+
private Arbitrary<U> getMappedArbitrary(final Boolean firstValue) {
34+
return firstValue
35+
? this.firstArbitrary.map(this::mapFirstValue)
36+
: this.secondArbitrary.map(this::mapSecondValue);
3237
}
3338

3439
@Override
3540
public EdgeCases<U> edgeCases() {
36-
return Arbitraries.of(true, false)
37-
.edgeCases()
38-
.flatMapArbitrary(firstValue -> firstValue
39-
? this.firstArbitrary.map(this::mapFirstValue)
40-
: this.secondArbitrary.map(this::mapSecondValue));
41+
final EdgeCases<U> firstEdgeCases = this.firstArbitrary.edgeCases().map(this::mapFirstValue);
42+
final EdgeCases<U> secondEdgeCases = this.secondArbitrary.edgeCases().map(this::mapSecondValue);
43+
return EdgeCasesSupport.concat(Arrays.asList(firstEdgeCases, secondEdgeCases));
4144
}
4245

4346
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@ public AbstractSingleValueArbitrary(final Arbitrary<T> innerArbitrary) {
1414

1515
protected abstract U mapValue(T value);
1616

17+
protected abstract EdgeCases<U> edgeCases(final Arbitrary<T> innerArbitrary);
18+
1719
@Override
1820
public RandomGenerator<U> generator(final int genSize) {
1921
return this.innerArbitrary.generator(genSize).map(this::mapValue);
2022
}
2123

2224
@Override
2325
public EdgeCases<U> edgeCases() {
24-
return this.innerArbitrary.edgeCases().map(this::mapValue);
26+
return edgeCases(this.innerArbitrary);
2527
}
2628

2729
}

src/main/java/de/befrish/jqwik/vavr/arbitraries/control/VavrOptionArbitrary.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
package de.befrish.jqwik.vavr.arbitraries.control;
22

3+
import de.befrish.jqwik.vavr.SingletonShrinkable;
34
import de.befrish.jqwik.vavr.arbitraries.base.AbstractSingleValueArbitrary;
45
import io.vavr.control.Option;
56
import net.jqwik.api.Arbitrary;
7+
import net.jqwik.api.EdgeCases;
8+
import net.jqwik.engine.properties.arbitraries.EdgeCasesSupport;
9+
import net.jqwik.engine.properties.shrinking.FixedValueFlatMappedShrinkable;
10+
import net.jqwik.engine.properties.shrinking.SampleShrinkable;
11+
12+
import java.util.Arrays;
613

714
public class VavrOptionArbitrary<T> extends AbstractSingleValueArbitrary<T, Option<T>> implements Arbitrary<Option<T>> {
815

@@ -15,4 +22,11 @@ protected Option<T> mapValue(final T value) {
1522
return Option.of(value);
1623
}
1724

25+
@Override
26+
protected EdgeCases<Option<T>> edgeCases(final Arbitrary<T> innerArbitrary) {
27+
final EdgeCases<Option<T>> noneOptionEdgeCase = EdgeCases.fromSupplier(() -> SingletonShrinkable.of(Option.none()));
28+
final EdgeCases<Option<T>> someOptionEdgeCase = innerArbitrary.edgeCases().map(this::mapValue);
29+
return EdgeCasesSupport.concat(Arrays.asList(noneOptionEdgeCase, someOptionEdgeCase));
30+
}
31+
1832
}

0 commit comments

Comments
 (0)