Skip to content

Commit e2da415

Browse files
author
bosob
committed
fix #4 Add support for Lazy
1 parent 8adf21d commit e2da415

12 files changed

+166
-18
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ Adds [jqwik](https://jqwik.net/) arbitraries for [Vavr](https://www.vavr.io/vavr
88
- io.vavr.collection.List
99
- io.vavr.collection.Set
1010

11+
- io.vavr.Lazy
12+
1113
<!--
1214
- io.vavr.collection.*
1315
- io.vavr.concurrent.*

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import de.befrish.jqwik.vavr.arbitraries.VavrListArbitrary;
44
import de.befrish.jqwik.vavr.arbitraries.VavrSetArbitrary;
5+
import de.befrish.jqwik.vavr.arbitraries.impl.DefaultVavrLazyArbitrary;
56
import de.befrish.jqwik.vavr.arbitraries.impl.DefaultVavrListArbitrary;
67
import de.befrish.jqwik.vavr.arbitraries.impl.DefaultVavrSetArbitrary;
8+
import de.befrish.jqwik.vavr.arbitraries.impl.VavrLazyArbitrary;
79
import net.jqwik.api.Arbitrary;
810

911
/**
@@ -15,6 +17,10 @@ private VavrArbitraries() {
1517
super();
1618
}
1719

20+
public static <T> VavrLazyArbitrary<T> lazy(final Arbitrary<T> innerArbitrary) {
21+
return new DefaultVavrLazyArbitrary<>(innerArbitrary);
22+
}
23+
1824
public static <T> VavrListArbitrary<T> list(final Arbitrary<T> elementArbitrary) {
1925
return new DefaultVavrListArbitrary<>(elementArbitrary, elementArbitrary.isUnique());
2026
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package de.befrish.jqwik.vavr.arbitraries.impl;
2+
3+
import io.vavr.Lazy;
4+
import net.jqwik.api.Arbitrary;
5+
6+
/**
7+
* @author Benno Müller
8+
*/
9+
public class DefaultVavrLazyArbitrary<T> extends SinglevalueArbitraryBase<T, Lazy<T>> implements VavrLazyArbitrary<T> {
10+
11+
public DefaultVavrLazyArbitrary(final Arbitrary<T> innerArbitrary) {
12+
super(innerArbitrary);
13+
}
14+
15+
@Override
16+
protected Lazy<T> mapValue(final T value) {
17+
return Lazy.of(() -> value);
18+
}
19+
20+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package de.befrish.jqwik.vavr.arbitraries.impl;
2+
3+
import io.vavr.Lazy;
4+
import net.jqwik.api.Arbitrary;
5+
import net.jqwik.api.EdgeCases;
6+
import net.jqwik.api.RandomGenerator;
7+
8+
/**
9+
* @author Benno Müller
10+
*/
11+
public abstract class SinglevalueArbitraryBase<T, U> implements Arbitrary<U> {
12+
13+
private final Arbitrary<T> innerArbitrary;
14+
15+
public SinglevalueArbitraryBase(final Arbitrary<T> innerArbitrary) {
16+
this.innerArbitrary = innerArbitrary;
17+
}
18+
19+
protected abstract U mapValue(T value);
20+
21+
@Override
22+
public RandomGenerator<U> generator(int genSize) {
23+
return innerArbitrary.generator(genSize).map(this::mapValue);
24+
}
25+
26+
@Override
27+
public EdgeCases<U> edgeCases() {
28+
return innerArbitrary.edgeCases().map(this::mapValue);
29+
}
30+
31+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package de.befrish.jqwik.vavr.arbitraries.impl;
2+
3+
import io.vavr.Lazy;
4+
import net.jqwik.api.Arbitrary;
5+
6+
/**
7+
* @author Benno Müller
8+
*/
9+
public interface VavrLazyArbitrary<T> extends Arbitrary<Lazy<T>> {
10+
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
*
1313
* @author Benno Müller
1414
*/
15-
abstract class AbstractVavrCollectionArbitraryProvider implements ArbitraryProvider {
15+
abstract class AbstractVavrContainerArbitraryProvider implements ArbitraryProvider {
1616

1717
@Override
1818
public boolean canProvideFor(final TypeUsage targetType) {
@@ -23,9 +23,9 @@ public boolean canProvideFor(final TypeUsage targetType) {
2323

2424
@Override
2525
public Set<Arbitrary<?>> provideFor(final TypeUsage targetType, final SubtypeProvider subtypeProvider) {
26-
final TypeUsage elementType = targetType.getTypeArgument(0);
27-
final Set<Arbitrary<?>> elementArbitraries = subtypeProvider.apply(elementType);
28-
return elementArbitraries.stream()
26+
final TypeUsage innerType = targetType.getTypeArgument(0);
27+
final Set<Arbitrary<?>> innerArbitraries = subtypeProvider.apply(innerType);
28+
return innerArbitraries.stream()
2929
.map(this::create)
3030
.collect(Collectors.toSet());
3131
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package de.befrish.jqwik.vavr.providers;
2+
3+
import de.befrish.jqwik.vavr.arbitraries.impl.DefaultVavrLazyArbitrary;
4+
import de.befrish.jqwik.vavr.arbitraries.impl.VavrLazyArbitrary;
5+
import io.vavr.Lazy;
6+
import net.jqwik.api.Arbitrary;
7+
import net.jqwik.api.providers.ArbitraryProvider;
8+
import org.kohsuke.MetaInfServices;
9+
10+
/**
11+
* @author Benno Müller
12+
*/
13+
@MetaInfServices(ArbitraryProvider.class)
14+
public class VavrLazyArbitraryProvider extends AbstractVavrContainerArbitraryProvider {
15+
16+
@Override
17+
protected Class<?> getProvidedType() {
18+
return Lazy.class;
19+
}
20+
21+
@Override
22+
protected VavrLazyArbitrary<?> create(final Arbitrary<?> innerArbitrary) {
23+
return new DefaultVavrLazyArbitrary<>(innerArbitrary);
24+
}
25+
26+
}

src/main/java/de/befrish/jqwik/vavr/providers/VavrListArbitraryProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* @author Benno Müller
1212
*/
1313
@MetaInfServices(ArbitraryProvider.class)
14-
public class VavrListArbitraryProvider extends AbstractVavrCollectionArbitraryProvider {
14+
public class VavrListArbitraryProvider extends AbstractVavrContainerArbitraryProvider {
1515

1616
@Override
1717
protected Class<?> getProvidedType() {

src/main/java/de/befrish/jqwik/vavr/providers/VavrSetArbitraryProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* @author Benno Müller
1313
*/
1414
@MetaInfServices(ArbitraryProvider.class)
15-
public class VavrSetArbitraryProvider extends AbstractVavrCollectionArbitraryProvider {
15+
public class VavrSetArbitraryProvider extends AbstractVavrContainerArbitraryProvider {
1616

1717
@Override
1818
protected Class<?> getProvidedType() {
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package de.befrish.jqwik.vavr.providers;
2+
3+
import de.befrish.jqwik.vavr.VavrArbitraries;
4+
import io.vavr.Lazy;
5+
import io.vavr.collection.List;
6+
import net.jqwik.api.Arbitraries;
7+
import net.jqwik.api.Arbitrary;
8+
import net.jqwik.api.ForAll;
9+
import net.jqwik.api.From;
10+
import net.jqwik.api.Property;
11+
import net.jqwik.api.Provide;
12+
import net.jqwik.api.constraints.IntRange;
13+
import net.jqwik.api.constraints.NotEmpty;
14+
import net.jqwik.api.constraints.Positive;
15+
import net.jqwik.api.constraints.Size;
16+
import net.jqwik.api.constraints.Unique;
17+
18+
import static org.hamcrest.MatcherAssert.assertThat;
19+
import static org.hamcrest.Matchers.emptyIterable;
20+
import static org.hamcrest.Matchers.greaterThan;
21+
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
22+
import static org.hamcrest.Matchers.is;
23+
import static org.hamcrest.Matchers.lessThanOrEqualTo;
24+
import static org.hamcrest.Matchers.not;
25+
26+
/**
27+
* @author Benno Müller
28+
*/
29+
class VavrLazyArbitraryProviderTest {
30+
31+
@Property
32+
void generate(@ForAll final Lazy<Integer> lazy) {
33+
// Test that the ArbitraryProvider works (fails if not found)
34+
}
35+
36+
@Property
37+
void generateWithValueContrains(@ForAll final Lazy<@IntRange(min = 3, max = 42) Integer> lazy) {
38+
final Integer value = lazy.get();
39+
assertThat(value, is(greaterThanOrEqualTo(3)));
40+
assertThat(value, is(lessThanOrEqualTo(42)));
41+
}
42+
43+
@Provide
44+
Arbitrary<Lazy<Integer>> integersMin3() {
45+
return VavrArbitraries.lazy(Arbitraries.integers().greaterOrEqual(3));
46+
}
47+
48+
@Property
49+
void generateFrom(@ForAll @From("integersMin3") final Lazy<Integer> lazy) {
50+
assertThat(lazy.get(), is(greaterThanOrEqualTo(3)));
51+
}
52+
53+
}

0 commit comments

Comments
 (0)