2015-03-15 6 views
6

Ich probiere ScalaCheck zum ersten Mal aus und möchte ein geordnetes Array von Ints erzeugen.ScalaCheck - Geordneter Array-Generator

Ich habe die Dokumentation gelesen und eine Suche durchgeführt, aber ich habe keinen Weg gefunden, es zu tun.

Kann jemand etwas Licht darauf werfen?

Dank

Antwort

7

Ich nehme an, Sie eine beliebige Array von ganzen Zahlen wollen, die sortiert worden ist, nicht wahr? Wenn das der Fall ist, können Sie eine der folgenden Ansätze nutzen, um eine Gen[Array[Int]]:

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

Oder:

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

Sie können dann map verwenden um den Generator zu ändern, um ihre Ergebnisse zu sortieren:

Jetzt können Sie genSortedIntArray.sample.get ein paar Mal ausführen, um sich davon zu überzeugen, dass das Ergebnis ein sortiertes Array von zufälligen Ganzzahlen ist.

Wenn Sie eine Arbitrary für sortierte Arrays von ganzen Zahlen möchten, ist es am besten, einen Wrapper zu definieren, anstatt den Standard Arbitrary[Array[Int]] zu verbergen. Zum Beispiel könnte schreiben Sie Folgendes:

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

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

Und dann:

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

Wenn wie diese mit speziellen Generatoren, ich denke, dass es besser ist, alle zusammen zu vermeiden Willkürliche. Sie können Ihren Generator einfach direkt verwenden: forAll (genSortedIntArray) {a => ...}. Es könnte jedoch eine Frage des Geschmacks sein. –

Verwandte Themen