diff --git a/guide/src/test/scala/org/specs2/guide/UseScalaCheck.scala b/guide/src/test/scala/org/specs2/guide/UseScalaCheck.scala index 92f3cc418a..c6e8be96fc 100644 --- a/guide/src/test/scala/org/specs2/guide/UseScalaCheck.scala +++ b/guide/src/test/scala/org/specs2/guide/UseScalaCheck.scala @@ -173,16 +173,6 @@ class ScalaCheckSpec extends mutable.Specification with ScalaCheck { } }} -You can also set the random generator that is used in all the ScalaCheck generators: ${snippet{ -case class MyRandomGenerator() extends java.util.Random { - // implement a deterministic generator for example -} - -"this is a specific property" ! prop { (a: Int, b: Int) => - (a + b) must_== (b + a) -}.set(rng = MyRandomGenerator(), minTestsOk = 200, workers = 3) -}} - #### Command-line Some properties can be overridden from the command line diff --git a/project/depends.scala b/project/depends.scala index 23ba264c02..ca2d355e76 100644 --- a/project/depends.scala +++ b/project/depends.scala @@ -29,7 +29,7 @@ object depends { lazy val kindp = Seq("org.spire-math" % "kind-projector" % "0.7.1" cross CrossVersion.binary) - lazy val scalacheck = Seq("org.scalacheck" %% "scalacheck" % "1.12.5") + lazy val scalacheck = Seq("org.scalacheck" %% "scalacheck" % "1.13.0") lazy val mockito = Seq("org.mockito" % "mockito-core" % "1.9.5") lazy val junit = Seq("junit" % "junit" % "4.12") lazy val hamcrest = Seq("org.hamcrest" % "hamcrest-core" % "1.3") diff --git a/scalacheck/src/main/scala/org/specs2/scalacheck/AsResultProp.scala b/scalacheck/src/main/scala/org/specs2/scalacheck/AsResultProp.scala index 0eacd38735..cf79ac7bdc 100644 --- a/scalacheck/src/main/scala/org/specs2/scalacheck/AsResultProp.scala +++ b/scalacheck/src/main/scala/org/specs2/scalacheck/AsResultProp.scala @@ -1,7 +1,7 @@ package org.specs2 package scalacheck -import org.scalacheck.{Gen, Prop} +import org.scalacheck.{Properties, Gen, Prop} import org.scalacheck.util._ import execute._ import org.specs2.main.{CommandLine, CommandLineAsResult} @@ -15,28 +15,26 @@ trait AsResultProp extends ScalaCheckPropertyCheck with ScalaCheckParameters wit r match { case p: Prop => p case _ => - new Prop { - def apply(params: Gen.Parameters) = { - lazy val result = ResultExecution.execute(AsResult(r)) + Prop.apply { params: Gen.Parameters => + lazy val result = ResultExecution.execute(AsResult(r)) - val prop = - result match { - case f : execute.Failure => Prop.falsified :| (f.message+" ("+f.location+")") - case s : execute.Skipped => Prop.exception(new SkipException(s)) - case p : execute.Pending => Prop.exception(new PendingException(p)) - case e : execute.Error => Prop.exception(e.exception) - case other => Prop.passed - } + val prop = result match { - case f: execute.Failure if f.details != NoDetails => - prop.apply(params).collect(f.details) - - case _ => - prop.apply(params) + case f : execute.Failure => Prop.falsified :| (f.message+" ("+f.location+")") + case s : execute.Skipped => Prop.exception(new SkipException(s)) + case p : execute.Pending => Prop.exception(new PendingException(p)) + case e : execute.Error => Prop.exception(e.exception) + case other => Prop.passed } + result match { + case f: execute.Failure if f.details != NoDetails => + prop.apply(params).collect(f.details) + + case _ => + prop.apply(params) } } - } + } } implicit def scalaCheckPropertyCommandLineAsResult[S <: ScalaCheckProperty]: CommandLineAsResult[S] = new CommandLineAsResult[S] { @@ -46,12 +44,17 @@ trait AsResultProp extends ScalaCheckPropertyCheck with ScalaCheckParameters wit } } - /** implicit typeclass instance to create examples from Props */ - implicit def propAsResult[P <: Prop](implicit p: Parameters, pfq: FreqMap[Set[Any]] => Pretty): AsResult[P] = new AsResult[P] { - def asResult(prop: =>P): Result = + /** implicit typeclass instance to create examples from a Prop */ + implicit def propAsResult(implicit p: Parameters, pfq: FreqMap[Set[Any]] => Pretty): AsResult[Prop] = new AsResult[Prop] { + def asResult(prop: =>Prop): Result = check(prop, p, pfq) } + /** implicit typeclass instance to create examples from Properties */ + implicit def propertiesAsResult(implicit p: Parameters, pfq: FreqMap[Set[Any]] => Pretty): AsResult[Properties] = new AsResult[Properties] { + def asResult(properties: =>Properties): Result = + checkProperties(properties, p, pfq) + } } trait AsResultPropLowImplicits extends ScalaCheckPropertyCheck { diff --git a/scalacheck/src/main/scala/org/specs2/scalacheck/OneExpectationPerProp.scala b/scalacheck/src/main/scala/org/specs2/scalacheck/OneExpectationPerProp.scala index 888fc2b1d1..a7edf28130 100644 --- a/scalacheck/src/main/scala/org/specs2/scalacheck/OneExpectationPerProp.scala +++ b/scalacheck/src/main/scala/org/specs2/scalacheck/OneExpectationPerProp.scala @@ -1,7 +1,7 @@ package org.specs2 package scalacheck -import org.scalacheck.Prop +import org.scalacheck.{Properties, Prop} import org.scalacheck.util.{Pretty, FreqMap} import org.specs2.execute.AsResult @@ -10,9 +10,14 @@ import org.specs2.execute.AsResult * number of expectations. With this trait we just count 1 for each result */ trait OneExpectationPerProp extends AsResultProp { - private def superPropAsResult[P <: Prop] = super.propAsResult[P] + private def superPropAsResult = super.propAsResult + private def superPropertiesAsResult = super.propertiesAsResult - implicit override def propAsResult[P <: Prop](implicit p: Parameters, pfq: FreqMap[Set[Any]] => Pretty): AsResult[P] = new AsResult[P] { - def asResult(prop: =>P) = superPropAsResult.asResult(prop).setExpectationsNb(1) + implicit override def propAsResult(implicit p: Parameters, pfq: FreqMap[Set[Any]] => Pretty): AsResult[Prop] = new AsResult[Prop] { + def asResult(prop: =>Prop) = superPropAsResult.asResult(prop).setExpectationsNb(1) + } + + implicit override def propertiesAsResult(implicit p: Parameters, pfq: FreqMap[Set[Any]] => Pretty): AsResult[Properties] = new AsResult[Properties] { + def asResult(properties: =>Properties) = superPropertiesAsResult.asResult(properties).setExpectationsNb(1) } } diff --git a/scalacheck/src/main/scala/org/specs2/scalacheck/Parameters.scala b/scalacheck/src/main/scala/org/specs2/scalacheck/Parameters.scala index fa382bcf1c..d1992a6b5d 100644 --- a/scalacheck/src/main/scala/org/specs2/scalacheck/Parameters.scala +++ b/scalacheck/src/main/scala/org/specs2/scalacheck/Parameters.scala @@ -13,7 +13,6 @@ case class Parameters(minTestsOk: Int = Test.Parameters.default. maxDiscardRatio: Float = Test.Parameters.default.maxDiscardRatio, maxSize: Int = Test.Parameters.default.maxSize, workers: Int = Test.Parameters.default.workers, - rng: scala.util.Random = Test.Parameters.default.rng, testCallback: Test.TestCallback = Test.Parameters.default.testCallback, loader: Option[ClassLoader] = Test.Parameters.default.customClassLoader, prettyParams: Pretty.Params = Pretty.defaultParams) { outer => @@ -25,16 +24,14 @@ case class Parameters(minTestsOk: Int = Test.Parameters.default. copy(prettyParams = prettyParams.copy(verbosity = v)) def testParameters: Test.Parameters = - new Test.Parameters { - val minSuccessfulTests = outer.minTestsOk - val maxDiscardRatio = outer.maxDiscardRatio - val maxSize = outer.maxSize - val minSize = outer.minSize - val workers = outer.workers - val rng = outer.rng - val testCallback = outer.testCallback - val customClassLoader = outer.loader - } + Test.Parameters.default. + withMinSuccessfulTests(outer.minTestsOk). + withMaxDiscardRatio(outer.maxDiscardRatio). + withMaxSize(outer.maxSize). + withMinSize(outer.minSize). + withWorkers(outer.workers). + withTestCallback(outer.testCallback). + withCustomClassLoader(outer.loader) def overrideWith(commandLine: CommandLine): Parameters = { val updated = diff --git a/scalacheck/src/main/scala/org/specs2/scalacheck/ScalaCheckParameters.scala b/scalacheck/src/main/scala/org/specs2/scalacheck/ScalaCheckParameters.scala index de5c3c72d9..f413f00985 100644 --- a/scalacheck/src/main/scala/org/specs2/scalacheck/ScalaCheckParameters.scala +++ b/scalacheck/src/main/scala/org/specs2/scalacheck/ScalaCheckParameters.scala @@ -20,10 +20,9 @@ trait ScalaCheckParameters { maxDiscardRatio: Float = defaultParameters.maxDiscardRatio, maxSize: Int = defaultParameters.maxSize, workers: Int = defaultParameters.workers, - rng: scala.util.Random = defaultParameters.rng, callback: Test.TestCallback = defaultParameters.testCallback, loader: Option[ClassLoader] = defaultParameters.loader): Parameters = - new Parameters(minTestsOk, minSize, maxDiscardRatio, maxSize, workers, rng, callback, loader) + new Parameters(minTestsOk, minSize, maxDiscardRatio, maxSize, workers, callback, loader) /** create parameters with verbose = true */ def display(minTestsOk: Int = defaultParameters.minTestsOk, @@ -31,9 +30,8 @@ trait ScalaCheckParameters { maxDiscardRatio: Float = defaultParameters.maxDiscardRatio, maxSize: Int = defaultParameters.maxSize, workers: Int = defaultParameters.workers, - rng: scala.util.Random = defaultParameters.rng, callback: Test.TestCallback = defaultParameters.testCallback, loader: Option[ClassLoader] = defaultParameters.loader): Parameters = - new Parameters(minTestsOk, minSize, maxDiscardRatio, maxSize, workers, rng, callback, loader).verbose + new Parameters(minTestsOk, minSize, maxDiscardRatio, maxSize, workers, callback, loader).verbose } diff --git a/scalacheck/src/main/scala/org/specs2/scalacheck/ScalaCheckProperty.scala b/scalacheck/src/main/scala/org/specs2/scalacheck/ScalaCheckProperty.scala index 00bca623d2..deb49516e9 100644 --- a/scalacheck/src/main/scala/org/specs2/scalacheck/ScalaCheckProperty.scala +++ b/scalacheck/src/main/scala/org/specs2/scalacheck/ScalaCheckProperty.scala @@ -32,7 +32,6 @@ trait ScalaCheckProperty { maxDiscardRatio: Float = parameters.maxDiscardRatio, maxSize: Int = parameters.maxSize, workers: Int = parameters.workers, - rng: scala.util.Random = parameters.rng, callback: Test.TestCallback = parameters.testCallback, loader: Option[ClassLoader] = parameters.loader ):SelfType = @@ -43,7 +42,6 @@ trait ScalaCheckProperty { maxDiscardRatio = maxDiscardRatio, maxSize = maxSize, workers = workers, - rng = rng, testCallback = callback, loader = loader )) @@ -53,7 +51,6 @@ trait ScalaCheckProperty { maxDiscardRatio: Float = parameters.maxDiscardRatio, maxSize: Int = parameters.maxSize, workers: Int = parameters.workers, - rng: scala.util.Random = parameters.rng, callback: Test.TestCallback = parameters.testCallback, loader: Option[ClassLoader] = parameters.loader ):SelfType = @@ -64,7 +61,6 @@ trait ScalaCheckProperty { maxDiscardRatio = maxDiscardRatio, maxSize = maxSize, workers = workers, - rng = rng, testCallback = callback, loader = loader ).setVerbosity(1)) diff --git a/scalacheck/src/main/scala/org/specs2/scalacheck/ScalaCheckPropertyCheck.scala b/scalacheck/src/main/scala/org/specs2/scalacheck/ScalaCheckPropertyCheck.scala index 8c1ea1d744..108d1b7bf9 100644 --- a/scalacheck/src/main/scala/org/specs2/scalacheck/ScalaCheckPropertyCheck.scala +++ b/scalacheck/src/main/scala/org/specs2/scalacheck/ScalaCheckPropertyCheck.scala @@ -10,22 +10,19 @@ import PrettyDetails._ trait ScalaCheckPropertyCheck extends ExpectationsCreation { + def checkProperties(properties: Properties, parameters: Parameters, prettyFreqMap: FreqMap[Set[Any]] => Pretty): Result = { + val prop = Prop { params: Gen.Parameters => + Prop.all(properties.properties.map { case (n, p) => p :| n }:_*)(params) + } + check(prop, parameters, prettyFreqMap) + } + /** * checks if the property is true for each generated value, and with the specified * parameters */ def check(prop: Prop, parameters: Parameters, prettyFreqMap: FreqMap[Set[Any]] => Pretty): Result = { - // check the property with ScalaCheck - // first add labels if this Prop is a composite one - val prop1 = prop match { - case ps: Properties => - new Prop { - override def apply(params: Gen.Parameters): Prop.Result = - Prop.all(ps.properties.map { case (n, p) => p :| n }:_*)(params) - } - case _ => prop - } - val result = Test.check(parameters.testParameters, prop1) + val result = Test.check(parameters.testParameters, prop) val prettyTestResult = prettyResult(result, prettyFreqMap)(parameters.prettyParams) val testResult = if (parameters.prettyParams.verbosity == 0) "" else prettyTestResult diff --git a/tests/src/test/scala/org/specs2/scalacheck/ScalaCheckMatchersResultsSpec.scala b/tests/src/test/scala/org/specs2/scalacheck/ScalaCheckMatchersResultsSpec.scala index f9b5b02d6b..98d9f3b6af 100644 --- a/tests/src/test/scala/org/specs2/scalacheck/ScalaCheckMatchersResultsSpec.scala +++ b/tests/src/test/scala/org/specs2/scalacheck/ScalaCheckMatchersResultsSpec.scala @@ -17,7 +17,7 @@ class ScalaCheckMatchersResultsSpec extends Specification with ScalaCheck with R ${ check(Prop.passed) returns "OK, passed 100 tests." } ${ check(Prop.falsified) must beFailing(withMessage("Falsified after 0 passed tests.")) } - ${ check(Prop.undecided) must beFailing(withMessage("Gave up after only 0 passed tests. 101 tests were discarded")) } + ${ check(Prop.undecided) must beFailing(withMessage("Gave up after only 0 passed tests. 501 tests were discarded")) } when there is a conversion exception ${ check(exceptionPropOnConversion) must beFailing(withMessage("failure")) }