【问题标题】:Generating tuples containing Long for Vavr Property Checking为 Vavr 属性检查生成包含 Long 的元组
【发布时间】:2017-10-02 17:29:28
【问题描述】:

我需要一对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();

在 vavr 中有没有更好/更好的方法来做同样的事情?

【问题讨论】:

    标签: property-testing vavr vavr-test


    【解决方案1】:

    任意可以看作是类型的函数

    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)
    

    将整数大小解释为 long

    可以以自定义方式解释 size 参数。更具体地说,我们可以将给定的 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)的作者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 2016-01-20
      相关资源
      最近更新 更多