2016-06-02 21 views
0

Gegeben:Kann Gen [String] Andere Werte erzeugen?

import org.scalatest._ 
import org.scalatest.prop.Checkers 
import org.scalacheck.Gen 
import org.scalacheck.Gen._ 

object Test { 
    def fooOrBar: Gen[String] = oneOf("foo", "bar") 
} 

class Test extends FunSuite with Checkers { 

    import Test._ 

    test("generated String should equal 'foo' or 'bar'") { 
    check(org.scalacheck.Prop.forAll(fooOrBar) { x: String => 
     x == "foo" || x == "bar" 
    }) 
    } 
} 

Lauf sbt test Renditen, die alle Tests erfolgreich waren.

den obigen Code angegeben, ist es möglich, für x: String, das heißt die String von fooOrBar, vom Typ Gen[String], einen anderen Wert als foo oder bar zu entsprechen?

In meinem Real-World-Code sehe ich Werte für meine x: String, die sich von dem Gen[String] Argument zu org.scalacheck.Prop.forAll unterscheiden.

Deshalb frage ich, ob es für das obige Beispiel möglich ist, ob x: String nicht gleich foo oder bar sein kann.

+0

I 'benötigt verwenden sehen org.scalacheck.Prop.forAllNoShrink' –

+0

Einschrumpfen nicht gut mit Generatoren in der Tat spielen. Dasselbe gilt, wenn Sie Filterbedingungen 'thatThat' haben. – Eric

+0

@Eric - Care, um eine Antwort für Kredit zu buchen? Ich fand, dass "forAllNoShrink" für mich funktioniert hat, aber ich bin mir nicht ganz sicher, was "Schrumpfen" beinhaltet. –

Antwort

1

Wenn ScalaCheck einige Daten findet, die eine Eigenschaft verfälschen, wird es versuchen, die Daten zu verkleinern, um ein kleineres Gegenbeispiel zu finden. Leider können während dieses Prozesses einige Gen Einschränkungen verloren gehen. Dies ist ein known issue.

Eine Abhilfe besteht darin, das Schrumpfen durch Verwendung von forAllNoShrink anstelle von forAll zu deaktivieren.

Eine andere Lösung ist specify a postcondition on the generator with suchThat. Zum Beispiel die Definition von Gen.oneOf

def oneOf[T](xs: Seq[T]): Gen[T] = 
    choose(0, xs.size-1).map(xs(_)).suchThat(xs.contains)