簡體   English   中英

生成包含Long的元組以進行Vavr屬性檢查

[英]Generating tuples containing Long for Vavr Property Checking

我需要一對隨機long來使用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中,有沒有更好/更好的方法可以做到這一點?

可以將任意<T>視為類型的函數

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)

解釋一個整數,只要長

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)的作者

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM