Как сгенерировать отсортированный массив чисел с помощью jqwik

Я использую java jqwik для тестирования на основе свойств, я хочу сгенерировать отсортированный массив, пока мой код:

@Provide
Integer[] arrProvider() {
    Arbitrary<Integer> integerArbitrary = Arbitraries.integers().between(0, 100);
    Arbitrary<Integer[]> arrayArbitrary = integerArbitrary.array(Integer[].class).ofMinSize(0).ofMaxSize(30);

 // how to make my arbitrary sorted ? and I want to return it as array of Integers?
}

1 ответ

Здесь есть две проблемы, которые могут вас укусить:

  1. Какой тип возвращаемого значения имеют методы поставщика?
  2. Как преобразовать сгенерированный объект?

Давайте разберемся с этим в два этапа:

В jqwik генераторы представлены как Arbitrary<TypeToGenerate> так что подпись вашего метода провайдера:

@Provide
Arbitrary<Integer[]> arrProvider() {
    return ...;
}

Произвольные объекты на самом деле являются фабриками генераторов, и они предоставляют все возможности для фильтрации, комбинирования и сопоставления. Отображение - это то, что нам нужно для второй части вопроса:

integerArbitrary
    .array(Integer[].class).ofMinSize(0).ofMaxSize(30)
    .map(anArray -> {
        Arrays.sort(anArray);
        return anArray;
    });

Давайте объединим это вместе и используем в свойстве:

@Property
void arrayIsSorted(@ForAll("arrProvider") Integer[] array) {
    System.out.println(Arrays.toString(array));
}

@Provide
Arbitrary<Integer[]> arrProvider() {
    Arbitrary<Integer> integerArbitrary = Arbitraries.integers().between(0, 100);
    return integerArbitrary
        .array(Integer[].class).ofMinSize(0).ofMaxSize(30)
        .map(anArray -> {
            Arrays.sort(anArray);
            return anArray;
        });
}

На выходе теперь должны отображаться отсортированные массивы, похожие на это:

[0, 1, 27, 33, 47, 80, 84, 91, 92]
[1, 2, 2, 5, 5, 5, 15, 16, 38, 39, 44, 54, 54, 63, 71, 78, 86, 93, 93, 100]
[0, 3, 4, 4, 4, 11, 12, 20, 21, 25, 44, 51, 55, 62, 66, 75, 78, 80, 81, 87, 90, 92, 94]
[3, 45, 45, 78, 95, 96]

Только больше.

Другие вопросы по тегам