为 Vavr 属性 生成包含 Long 的元组正在检查
Generating tuples containing Long for Vavr Property Checking
我需要一对 property checking with Vavr 的随机多头。
我的实现是这样的:
Gen<Long> longs = Gen.choose(Long.MIN_VALUE, Long.MAX_VALUE);
Arbitrary<Tuple2<Long, Long>> pairOfLongs = longs
.flatMap(value -> random -> Tuple.of(value, longs.apply(random)))
.arbitrary();
有什么 better/nicer 方法可以在 vavr 中做同样的事情吗?
Arbitrary可以看成是
类型的函数
int -> Random -> T
生成任意整数
因为样本量是int类型,所以很自然的会做如下:
Arbitrary<Tuple2<Integer, Integer>> intPairs = size -> {
Gen<Integer> ints = Gen.choose(-size, size);
return random -> Tuple.of(ints.apply(random), ints.apply(random));
};
我们来测试一下:
Property.def("print int pairs")
.forAll(intPairs.peek(System.out::println))
.suchThat(pair -> true)
.check(10, 5);
输出:
(-9, 2)
(-2, -10)
(5, -2)
(3, 8)
(-10, 10)
生成任意长值
目前我们无法定义 long 类型的大小,因此解决方法是忽略大小并使用完整的 long 范围:
Arbitrary<Tuple2<Long, Long>> longPairs = ignored -> {
Gen<Long> longs = Gen.choose(Long.MIN_VALUE, Long.MAX_VALUE);
return random -> Tuple.of(longs.apply(random), longs.apply(random));
};
我们再测试一下:
Property.def("print long pairs")
.forAll(longPairs.peek(System.out::println))
.suchThat(pair -> true)
.check(0, 5);
输出:
(2766956995563010048, 1057025805628715008)
(-6881523912167376896, 7985876340547620864)
(7449864279215405056, 6862094372652388352)
(3203043896949684224, -2508953386204733440)
(1541228130048020480, 4106286124314660864)
将整数大小解释为长
可以自定义方式解释大小参数。更具体地说,我们可以将给定的 int 大小映射到 long 大小:
Arbitrary<Tuple2<Long, Long>> longPairs = size -> {
long longSize = ((long) size) << 32;
Gen<Long> longs = Gen.choose(-longSize, longSize);
return random -> Tuple.of(longs.apply(random), longs.apply(random));
};
但是,最后一个例子不匹配完整的长范围。也许可以找到更好的映射。
免责声明:我是 Vavr(以前称为 Javaslang)的作者
我需要一对 property checking with Vavr 的随机多头。
我的实现是这样的:
Gen<Long> longs = Gen.choose(Long.MIN_VALUE, Long.MAX_VALUE);
Arbitrary<Tuple2<Long, Long>> pairOfLongs = longs
.flatMap(value -> random -> Tuple.of(value, longs.apply(random)))
.arbitrary();
有什么 better/nicer 方法可以在 vavr 中做同样的事情吗?
Arbitrary
int -> Random -> T
生成任意整数
因为样本量是int类型,所以很自然的会做如下:
Arbitrary<Tuple2<Integer, Integer>> intPairs = size -> {
Gen<Integer> ints = Gen.choose(-size, size);
return random -> Tuple.of(ints.apply(random), ints.apply(random));
};
我们来测试一下:
Property.def("print int pairs")
.forAll(intPairs.peek(System.out::println))
.suchThat(pair -> true)
.check(10, 5);
输出:
(-9, 2)
(-2, -10)
(5, -2)
(3, 8)
(-10, 10)
生成任意长值
目前我们无法定义 long 类型的大小,因此解决方法是忽略大小并使用完整的 long 范围:
Arbitrary<Tuple2<Long, Long>> longPairs = ignored -> {
Gen<Long> longs = Gen.choose(Long.MIN_VALUE, Long.MAX_VALUE);
return random -> Tuple.of(longs.apply(random), longs.apply(random));
};
我们再测试一下:
Property.def("print long pairs")
.forAll(longPairs.peek(System.out::println))
.suchThat(pair -> true)
.check(0, 5);
输出:
(2766956995563010048, 1057025805628715008)
(-6881523912167376896, 7985876340547620864)
(7449864279215405056, 6862094372652388352)
(3203043896949684224, -2508953386204733440)
(1541228130048020480, 4106286124314660864)
将整数大小解释为长
可以自定义方式解释大小参数。更具体地说,我们可以将给定的 int 大小映射到 long 大小:
Arbitrary<Tuple2<Long, Long>> longPairs = size -> {
long longSize = ((long) size) << 32;
Gen<Long> longs = Gen.choose(-longSize, longSize);
return random -> Tuple.of(longs.apply(random), longs.apply(random));
};
但是,最后一个例子不匹配完整的长范围。也许可以找到更好的映射。
免责声明:我是 Vavr(以前称为 Javaslang)的作者