2015-03-15 23 views
6

Próbuję ScalaCheck po raz pierwszy i chcę wygenerować uporządkowaną tablicę Ints.ScalaCheck - Generowany generator tablicy

Przeczytałem dokumentację i przeszukałem ją, ale nie znalazłem sposobu, aby to zrobić.

Czy ktoś może rzucić trochę światła na to?

Dzięki

Odpowiedz

7

zakładam chcesz dowolną tablicę liczb całkowitych, które zostało uporządkowane, prawda? Jeśli to przypadek, można użyć jednej z następujących metod, aby uzyskać Gen[Array[Int]]:

val genIntArray = Gen.containerOf[Array, Int](
    Gen.chooseNum(Int.MinValue, Int.MaxValue) 
) 

Lub:

val genIntArray = implicitly[Arbitrary[Array[Int]]].arbitrary 

Następnie można użyć map zmodyfikować generator uporządkować swoje wyniki:

val genSortedIntArray = genIntArray.map(_.sorted) 

Teraz możesz uruchomić genSortedIntArray.sample.get kilka razy, aby przekonać się, że wynikiem jest posortowana tablica losowych liczb całkowitych.

Jeśli chcesz, aby Arbitrary posortowane tablice z liczb całkowitych, najlepiej zdefiniować wrapper zamiast ukrywać domyślne Arbitrary[Array[Int]]. Na przykład, można napisać następujące:

case class SortedIntArray(value: Array[Int]) extends AnyVal 

object SortedIntArray { 
    implicit val arb: Arbitrary[SortedIntArray] = Arbitrary(
    genSortedIntArray.map(SortedIntArray(_)) 
) 
} 

, a następnie:

forAll { (a: SortedIntArray) => 
    confirmThatMyFunctionOnSortedIntArraysWorks(a.value) 
} 
+0

Przy użyciu specjalistycznych generatorów tak, myślę, że lepiej jest, aby uniknąć arbitralnych razem. Możesz po prostu użyć swojego generatora bezpośrednio: forAll (genSortedIntArray) {a => ...}. Może to jednak być kwestia gustu. –