package scalacheck
- Alphabetic
- Public
- Protected
Type Members
- trait CheckerAsserting[T] extends AnyRef
Supertrait for
CheckerAssertingtypeclasses, which are used to implement and determine the result type of GeneratorDrivenPropertyChecks'sapplyandforAllmethod.Supertrait for
CheckerAssertingtypeclasses, which are used to implement and determine the result type of GeneratorDrivenPropertyChecks'sapplyandforAllmethod.Currently, an GeneratorDrivenPropertyChecks expression will have result type
Assertion, if the function passed has result typeAssertion, else it will have result typeUnit. - trait Checkers extends ScalaCheckConfiguration
Trait that contains several “check” methods that perform ScalaCheck property checks.
Trait that contains several “check” methods that perform ScalaCheck property checks. If ScalaCheck finds a test case for which a property doesn't hold, the problem will be reported as a ScalaTest test failure.
To use ScalaCheck, you specify properties and, in some cases, generators that generate test data. You need not always create generators, because ScalaCheck provides many default generators for you that can be used in many situations. ScalaCheck will use the generators to generate test data and with that data run tests that check that the property holds. Property-based tests can, therefore, give you a lot more testing for a lot less code than assertion-based tests. Here's an example of using ScalaCheck from a
JUnitSuite:import org.scalatest.junit.JUnitSuite import org.scalatest.prop.Checkers import org.scalacheck.Arbitrary._ import org.scalacheck.Prop._
class MySuite extends JUnitSuite with Checkers { @Test def testConcat() { check((a: List[Int], b: List[Int]) => a.size + b.size == (a ::: b).size) } }The
checkmethod, defined inCheckers, makes it easy to write property-based tests inside ScalaTest, JUnit, and TestNG test suites. This example specifies a property thatList's:::method should obey. ScalaCheck properties are expressed as function values that take the required test data as parameters. ScalaCheck will generate test data using generators and repeatedly pass generated data to the function. In this case, the test data is composed of integer lists namedaandb. Inside the body of the function, you see:a.size + b.size == (a ::: b).size
The property in this case is a
Booleanexpression that will yield true if the size of the concatenated list is equal to the size of each individual list added together. With this small amount of code, ScalaCheck will generate possibly hundreds of value pairs foraandband test each pair, looking for a pair of integers for which the property doesn't hold. If the property holds true for every value ScalaCheck tries,checkreturns normally. Otherwise,checkwill complete abruptly with aTestFailedExceptionthat contains information about the failure, including the values that cause the property to be false.For more information on using ScalaCheck properties, see the documentation for ScalaCheck, which is available from http://code.google.com/p/scalacheck/.
To execute a suite that mixes in
Checkerswith ScalaTest'sRunner, you must include ScalaCheck's jar file on the class path or runpath.Property check configuration
The property checks performed by the
checkmethods of this trait can be flexibly configured via the services provided by supertraitConfiguration. The five configuration parameters for property checks along with their default values and meanings are described in the following table:Configuration Parameter Default Value Meaning minSuccessful 100 the minimum number of successful property evaluations required for the property to pass maxDiscarded 500 the maximum number of discarded property evaluations allowed during a property check minSize 0 the minimum size parameter to provide to ScalaCheck, which it will use when generating objects for which size matters (such as strings or lists) maxSize 100 the maximum size parameter to provide to ScalaCheck, which it will use when generating objects for which size matters (such as strings or lists) workers 1 specifies the number of worker threads to use during property evaluation The
checkmethods of traitCheckerseach take aPropertyCheckConfigurationobject as an implicit parameter. This object provides values for each of the five configuration parameters. TraitConfigurationprovides an implicitvalnamedgeneratorDrivenConfigwith each configuration parameter set to its default value. If you want to set one or more configuration parameters to a different value for all property checks in a suite you can override this val (or hide it, for example, if you are importing the members of theCheckerscompanion object rather than mixing in the trait.) For example, if you want all parameters at their defaults except forminSizeandmaxSize, you can overridegeneratorDrivenConfig, like this:implicit override val generatorDrivenConfig = PropertyCheckConfiguration(minSize = 10, sizeRange = 10)
Or, if hide it by declaring a variable of the same name in whatever scope you want the changed values to be in effect:
implicit val generatorDrivenConfig = PropertyCheckConfiguration(minSize = 10, sizeRange = 10)
In addition to taking a
PropertyCheckConfigurationobject as an implicit parameter, thecheckmethods of traitCheckersalso take a variable length argument list ofPropertyCheckConfigParamobjects that you can use to override the values provided by the implicitPropertyCheckConfigurationfor a singlecheckinvocation. You place these configuration settings after the property or property function, For example, if you want to setminSuccessfulto 500 for just one particularcheckinvocation, you can do so like this:check((n: Int) => n + 0 == n, minSuccessful(500))
This invocation of
checkwill use 500 forminSuccessfuland whatever values are specified by the implicitly passedPropertyCheckConfigurationobject for the other configuration parameters. If you want to set multiple configuration parameters in this way, just list them separated by commas:check((n: Int) => n + 0 == n, minSuccessful(500), maxDiscardedFactor(0.6))
The previous configuration approach works the same in
Checkersas it does inGeneratorDrivenPropertyChecks. TraitCheckersalso provides onecheckmethod that takes anorg.scalacheck.Test.Parametersobject, in case you want to configure ScalaCheck that way.import org.scalacheck.Prop import org.scalacheck.Test.Parameters import org.scalatest.prop.Checkers._
check(Prop.forAll((n: Int) => n + 0 == n), Parameters.Default { override val minSuccessfulTests = 5 })For more information, see the documentation for supertrait
Configuration. - abstract class ExpectationCheckerAsserting extends UnitCheckerAsserting
Abstract class that in the future will hold an intermediate priority
CheckerAssertingimplicit, which will enable inspector expressions that have result typeExpectation, a more composable form of assertion that returns a result instead of throwing an exception when it fails. - trait ScalaCheckDrivenPropertyChecks extends Whenever with ScalaCheckConfiguration
Trait containing methods that faciliate property checks against generated data.
Trait containing methods that faciliate property checks against generated data.
This trait contains
forAllmethods that provide various ways to check properties using generated data. Use of this trait requires that ScalaCheck be on the class path when you compile and run your tests. It also contains awherevermethod that can be used to indicate a property need only hold whenever some condition is true.For an example of trait
ScalaCheckDrivenPropertyChecksin action, imagine you want to test thisFractionclass:class Fraction(n: Int, d: Int) {
require(d != 0) require(d != Integer.MIN_VALUE) require(n != Integer.MIN_VALUE)
val numer = if (d < 0) -1 * n else n val denom = d.abs
override def toString = numer + " / " + denom }To test the behavior of
Fraction, you could mix in or import the members ofScalaCheckDrivenPropertyChecks(andMatchers) and check a property using aforAllmethod, like this:forAll { (n: Int, d: Int) =>
whenever (d != 0 && d != Integer.MIN_VALUE && n != Integer.MIN_VALUE) {
val f = new Fraction(n, d)
if (n < 0 && d < 0 || n > 0 && d > 0) f.numer should be > 0 else if (n != 0) f.numer should be < 0 else f.numer should be === 0
f.denom should be > 0 } }Trait
ScalaCheckDrivenPropertyChecksprovides overloadedforAllmethods that allow you to check properties using the data provided by a ScalaCheck generator. The simplest form offorAllmethod takes two parameter lists, the second of which is implicit. The first parameter list is a "property" function with one to six parameters. An implicitArbitrarygenerator andShrinkobject needs to be supplied for TheforAllmethod will pass each row of data to each parameter type. ScalaCheck provides many implicitArbitrarygenerators for common types such asInt,String,List[Float], etc., in itsorg.scalacheck.Arbitrarycompanion object. So long as you use types for which ScalaCheck already provides implicitArbitrarygenerators, you needn't worry about them. Same forShrinkobjects, which are provided by ScalaCheck'sorg.scalacheck.Shrinkcompanion object. Most often you can simply pass a property function toforAll, and the compiler will grab the implicit values provided by ScalaCheck.The
forAllmethods use the suppliedArbitrarygenerators to generate example arguments and pass them to the property function, and generate aScalaCheckDrivenPropertyCheckFailedExceptionif the function completes abruptly for any exception that would normally cause a test to fail in ScalaTest other thanDiscardedEvaluationException. AnDiscardedEvaluationException, which is thrown by thewhenevermethod (defined in traitWhenever, which this trait extends) to indicate a condition required by the property function is not met by a row of passed data, will simply causeforAllto discard that row of data.Supplying argument names
You can optionally specify string names for the arguments passed to a property function, which will be used in any error message when describing the argument values that caused the failure. To supply the names, place them in a comma separated list in parentheses after
forAllbefore the property function (a curried form offorAll). Here's an example:forAll ("a", "b") { (a: String, b: String) => a.length + b.length should equal ((a + b).length + 1) // Should fail }
When this fails, you'll see an error message that includes this:
Occurred when passed generated values ( a = "", b = "" )
When you don't supply argument names, the error message will say
arg0,arg1, etc.. For example, this property check:forAll { (a: String, b: String) => a.length + b.length should equal ((a + b).length + 1) // Should fail }Will fail with an error message that includes:
Occurred when passed generated values ( arg0 = "", arg1 = "" )
Supplying generators
ScalaCheck provides a nice library of compositors that makes it easy to create your own custom generators. If you want to supply custom generators to a property check, place them in parentheses after
forAll, before the property check function (a curried form offorAll).For example, to create a generator of even integers between (and including) -2000 and 2000, you could write this:
import org.scalacheck.Gen
val evenInts = for (n <- Gen.choose(-1000, 1000)) yield 2 * nGiven this generator, you could use it on a property check like this:
forAll (evenInts) { (n) => n % 2 should equal (0) }Custom generators are necessary when you want to pass data types not supported by ScalaCheck's arbitrary generators, but are also useful when some of the values in the full range for the passed types are not valid. For such values you would use a
wheneverclause. In theFractionclass shown above, neither the passed numerator or denominator can beInteger.MIN_VALUE, and the passed denominator cannot be zero. This shows up in thewheneverclause like this:whenever (d != 0 && d != Integer.MIN_VALUE && n != Integer.MIN_VALUE) { ...You could in addition define generators for the numerator and denominator that only produce valid values, like this:
val validNumers = for (n <- Gen.choose(Integer.MIN_VALUE + 1, Integer.MAX_VALUE)) yield n val validDenoms = for (d <- validNumers if d != 0) yield d
You could then use them in the property check like this:
forAll (validNumers, validDenoms) { (n: Int, d: Int) =>
whenever (d != 0 && d != Integer.MIN_VALUE && n != Integer.MIN_VALUE) {
val f = new Fraction(n, d)
if (n < 0 && d < 0 || n > 0 && d > 0) f.numer should be > 0 else if (n != 0) f.numer should be < 0 else f.numer should be === 0
f.denom should be > 0 } }Note that even if you use generators that don't produce the invalid values, you still need the
wheneverclause. The reason is that once a property fails, ScalaCheck will try and shrink the values to the smallest values that still cause the property to fail. During this shrinking process ScalaCheck may pass invalid values. Thewheneverclause is still needed to guard against those values. (Thewheneverclause also clarifies to readers of the code exactly what the property is in a succinct way, without requiring that they find and understand the generator definitions.)Supplying both generators and argument names
If you want to supply both generators and named arguments, you can do so by providing a list of
(<generator>, <name>)pairs in parentheses afterforAll, before the property function. Here's an example:forAll ((validNumers, "n"), (validDenoms, "d")) { (n: Int, d: Int) =>
whenever (d != 0 && d != Integer.MIN_VALUE && n != Integer.MIN_VALUE) {
val f = new Fraction(n, d)
if (n < 0 && d < 0 || n > 0 && d > 0) f.numer should be > 0 else if (n != 0) f.numer should be < 0 else f.numer should be === 0
f.denom should be > 0 } }Were this property check to fail, it would mention the names n and d in the error message, like this:
Occurred when passed generated values ( n = 17, d = 21 )
Property check configuration
The property checks performed by the
forAllmethods of this trait can be flexibly configured via the services provided by supertraitConfiguration. The five configuration parameters for property checks along with their default values and meanings are described in the following table:Configuration Parameter Default Value Meaning minSuccessful 100 the minimum number of successful property evaluations required for the property to pass maxDiscardedFactor 500 the maximum discarded factor property evaluations allowed during a property check minSize 0 the minimum size parameter to provide to ScalaCheck, which it will use when generating objects for which size matters (such as strings or lists) sizeRange 100 the size range parameter to provide to ScalaCheck, which it will use when generating objects for which size matters (such as strings or lists) workers 1 specifies the number of worker threads to use during property evaluation The
forAllmethods of traitScalaCheckDrivenPropertyCheckseach take aPropertyCheckConfigurationobject as an implicit parameter. This object provides values for each of the five configuration parameters. TraitConfigurationprovides an implicitvalnamedgeneratorDrivenConfigwith each configuration parameter set to its default value. If you want to set one or more configuration parameters to a different value for all property checks in a suite you can override this val (or hide it, for example, if you are importing the members of theScalaCheckDrivenPropertyCheckscompanion object rather than mixing in the trait.) For example, if you want all parameters at their defaults except forminSizeandsizeRange, you can overridegeneratorDrivenConfig, like this:implicit override val generatorDrivenConfig = PropertyCheckConfiguration(minSize = 10, sizeRange = 10)
Or, hide it by declaring a variable of the same name in whatever scope you want the changed values to be in effect:
implicit val generatorDrivenConfig = PropertyCheckConfiguration(minSize = 10, sizeRange = 10)
In addition to taking a
PropertyCheckConfigurationobject as an implicit parameter, theforAllmethods of traitScalaCheckDrivenPropertyChecksalso take a variable length argument list ofPropertyCheckConfigParamobjects that you can use to override the values provided by the implicitPropertyCheckConfigurationfor a singleforAllinvocation. For example, if you want to setminSuccessfulto 500 for just one particularforAllinvocation, you can do so like this:forAll (minSuccessful(500)) { (n: Int, d: Int) => ...
This invocation of
forAllwill use 500 forminSuccessfuland whatever values are specified by the implicitly passedPropertyCheckConfigurationobject for the other configuration parameters. If you want to set multiple configuration parameters in this way, just list them separated by commas:forAll (minSuccessful(500), maxDiscardedFactor(0.6)) { (n: Int, d: Int) => ...
If you are using an overloaded form of
forAllthat already takes an initial parameter list, just add the configuration parameters after the list of generators, names, or generator/name pairs, as in:// If providing argument names forAll ("n", "d", minSuccessful(500), maxDiscardedFactor(0.6)) { (n: Int, d: Int) => ...
// If providing generators forAll (validNumers, validDenoms, minSuccessful(500), maxDiscardedFactor(0.6)) { (n: Int, d: Int) => ...
// If providing (<generators>, <name>) pairs forAll ((validNumers, "n"), (validDenoms, "d"), minSuccessful(500), maxDiscardedFactor(0.6)) { (n: Int, d: Int) => ...For more information, see the documentation for supertrait
Configuration. - trait ScalaCheckPropertyChecks extends TableDrivenPropertyChecks with ScalaCheckDrivenPropertyChecks
Trait that facilitates property checks on data supplied by tables and ScalaCheck generators.
Trait that facilitates property checks on data supplied by tables and ScalaCheck generators.
This trait extends both
TableDrivenPropertyChecksandScalaCheckDrivenPropertyChecks. Thus by mixing in this trait you can perform property checks on data supplied either by tables or generators. For the details of table- and generator-driven property checks, see the documentation for each by following the links above.For a quick example of using both table and generator-driven property checks in the same suite of tests, however, imagine you want to test this
Fractionclass:class Fraction(n: Int, d: Int) {
require(d != 0) require(d != Integer.MIN_VALUE) require(n != Integer.MIN_VALUE)
val numer = if (d < 0) -1 * n else n val denom = d.abs
override def toString = numer + " / " + denom }If you mix in
PropertyChecks, you could use a generator-driven property check to test that the passed values for numerator and denominator are properly normalized, like this:forAll { (n: Int, d: Int) =>
whenever (d != 0 && d != Integer.MIN_VALUE && n != Integer.MIN_VALUE) {
val f = new Fraction(n, d)
if (n < 0 && d < 0 || n > 0 && d > 0) f.numer should be > 0 else if (n != 0) f.numer should be < 0 else f.numer shouldEqual 0
f.denom should be > 0 } }And you could use a table-driven property check to test that all combinations of invalid values passed to the
Fractionconstructor produce the expectedIllegalArgumentException, like this:val invalidCombos = Table( ("n", "d"), (Integer.MIN_VALUE, Integer.MIN_VALUE), (1, Integer.MIN_VALUE), (Integer.MIN_VALUE, 1), (Integer.MIN_VALUE, 0), (1, 0) )
forAll (invalidCombos) { (n: Int, d: Int) => an [IllegalArgumentException] should be thrownBy { new Fraction(n, d) } } - abstract class UnitCheckerAsserting extends AnyRef
Class holding lowest priority
CheckerAssertingimplicit, which enables GeneratorDrivenPropertyChecks expressions that have result typeUnit.
Value Members
- object CheckerAsserting extends ExpectationCheckerAsserting
Companion object to
CheckerAssertingthat provides two implicit providers, a higher priority one for passed functions that have result typeAssertion, which also yields result typeAssertion, and one for any other type, which yields result typeUnit. - object Checkers extends Checkers
Companion object that facilitates the importing of
Checkersmembers as an alternative to mixing it in.Companion object that facilitates the importing of
Checkersmembers as an alternative to mixing it in. One use case is to importCheckersmembers so you can use them in the Scala interpreter. - object ScalaCheckDrivenPropertyChecks extends ScalaCheckDrivenPropertyChecks
- object ScalaCheckPropertyChecks extends ScalaCheckPropertyChecks
Companion object that facilitates the importing of
PropertyChecksmembers as an alternative to mixing it in.Companion object that facilitates the importing of
PropertyChecksmembers as an alternative to mixing it in. One use case is to importPropertyChecksmembers so you can use them in the Scala interpreter.