Создание кортежей, содержащих Long для проверки свойств Vavr
Мне нужна пара случайных длин для проверки свойств с помощью 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?
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, поэтому обходной путь заключается в игнорировании размера и использовании полного длинного диапазона:
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 на длинный размер:
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)