/*-------------------------------------------------------------------------*\ ** ScalaCheck ** ** Copyright (c) 2007-2010 Rickard Nilsson. All rights reserved. ** ** http://www.scalacheck.org ** ** ** ** This software is released under the terms of the Revised BSD License. ** ** There is NO WARRANTY. See the file LICENSE for the full text. ** \*-------------------------------------------------------------------------*/ package org.scalacheck /** Represents a collection of properties, with convenient methods * for checking all properties at once. This class is itself a property, which * holds if and only if all of the contained properties hold. *
Properties are added in the following way:
* *
*
* object MyProps extends Properties("MyProps") {
* property("myProp1") = forAll { (n:Int, m:Int) =>
* n+m == m+n
* }
*
* property("myProp2") = ((0/1) throws classOf[ArithmeticException])
* }
*/
class Properties(val name: String) extends Prop {
import Test.cmdLineParser.{Success, NoSuccess}
private val props = new scala.collection.mutable.ListBuffer[(String,Prop)]
/** Returns one property which holds if and only if all of the
* properties in this property collection hold */
private def oneProperty: Prop = Prop.all((properties map (_._2)):_*)
/** Returns all properties of this collection in a list of name/property
* pairs. */
def properties: Seq[(String,Prop)] = props
def apply(p: Prop.Params) = oneProperty(p)
/** Convenience method that checks the properties with the given parameters
* and reports the result on the console. If you need to get the results
* from the test use the
check
methods in Test
* instead. */
override def check(prms: Test.Params): Unit = Test.checkProperties(
prms copy (testCallback = ConsoleReporter(1) chain prms.testCallback), this
)
/** Convenience method that checks the properties and reports the
* result on the console. If you need to get the results from the test use
* the check
methods in Test
instead. */
override def check: Unit = check(Test.Params())
/** Convenience method that makes it possible to use a this instance
* as an application that checks itself on execution */
override def main(args: Array[String]): Unit =
Test.cmdLineParser.parseParams(args) match {
case Success(params, _) => Test.checkProperties(params, this)
case e: NoSuccess =>
println("Incorrect options:"+"\n"+e+"\n")
Test.cmdLineParser.printHelp
}
/** Adds all properties from another property collection to this one. */
def include(ps: Properties) = for((n,p) <- ps.properties) property(n) = p
/** Used for specifying properties. Usage:
* property("myProp") = ...
*/
class PropertySpecifier() {
def update(propName: String, p: Prop) = props += ((name+"."+propName, p))
}
lazy val property = new PropertySpecifier()
}