Performs a configured property checks by applying property check functions passed to its apply methods to arguments
supplied by implicitly passed generators, modifying the values in the
PropertyGenConfig object passed implicitly to its apply methods with parameter values passed to its constructor.
A PropertyCheckConfigParam that specifies the maximum number of discarded
property evaluations allowed during property evaluation.
A PropertyCheckConfigParam that specifies the maximum size parameter to
provide to ScalaCheck, which it will use when generating objects for which size matters (such as
strings or lists).
A PropertyCheckConfigParam that specifies the minimum size parameter to
provide to ScalaCheck, which it will use when generating objects for which size matters (such as
strings or lists).
A PropertyCheckConfigParam that specifies the minimum number of successful
property evaluations required for the property to pass.
Configuration object for property checks.
Abstract class defining a family of configuration parameters for property checks.
A PropertyCheckConfigParam that specifies the number of worker threads
to use when evaluating a property.
Performs a property check by applying the specified property check function to named arguments supplied by the specified generators.
Performs a property check by applying the specified property check function to named arguments supplied by the specified generators.
Here's an example:
import org.scalacheck.Gen
// Define your own string generator: val famousLastWords = for { s <- Gen.oneOf("the", "program", "compiles", "therefore", "it", "should", "work") } yield s
forAll ((famousLastWords, "a"), (famousLastWords, "b"), (famousLastWords, "c"), (famousLastWords, "d"), (famousLastWords, "e"), (famousLastWords, "f")) { (a: String, b: String, c: String, d: String, e: String, f: String) => a.length + b.length + c.length + d.length + e.length + f.length should equal ((a + b + c + d + e + f).length) }
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to arguments supplied by the specified generators.
Performs a property check by applying the specified property check function to arguments supplied by the specified generators.
Here's an example:
import org.scalacheck.Gen
// Define your own string generator: val famousLastWords = for { s <- Gen.oneOf("the", "program", "compiles", "therefore", "it", "should", "work") } yield s
forAll (famousLastWords, famousLastWords, famousLastWords, famousLastWords, famousLastWords, famousLastWords) { (a: String, b: String, c: String, d: String, e: String, f: String) => a.length + b.length + c.length + d.length + e.length + f.length should equal ((a + b + c + d + e + f).length) }
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function with the specified argument names to arguments supplied by implicitly passed generators.
Performs a property check by applying the specified property check function with the specified argument names to arguments supplied by implicitly passed generators.
Here's an example:
forAll ("a", "b", "c", "d", "e", "f") { (a: String, b: String, c: String, d: String, e: String, f: String) =>
a.length + b.length + c.length + d.length + e.length + f.length should equal ((a + b + c + d + e + f).length)
}
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to arguments supplied by implicitly passed generators.
Performs a property check by applying the specified property check function to arguments supplied by implicitly passed generators.
Here's an example:
forAll { (a: String, b: String, c: String, d: String, e: String, f: String) =>
a.length + b.length + c.length + d.length + e.length + f.length should equal ((a + b + c + d + e + f).length)
}
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to named arguments supplied by the specified generators.
Performs a property check by applying the specified property check function to named arguments supplied by the specified generators.
Here's an example:
import org.scalacheck.Gen
// Define your own string generator: val famousLastWords = for { s <- Gen.oneOf("the", "program", "compiles", "therefore", "it", "should", "work") } yield s
forAll ((famousLastWords, "a"), (famousLastWords, "b"), (famousLastWords, "c"), (famousLastWords, "d"), (famousLastWords, "e")) { (a: String, b: String, c: String, d: String, e: String) => a.length + b.length + c.length + d.length + e.length should equal ((a + b + c + d + e).length) }
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to arguments supplied by the specified generators.
Performs a property check by applying the specified property check function to arguments supplied by the specified generators.
Here's an example:
import org.scalacheck.Gen
// Define your own string generator: val famousLastWords = for { s <- Gen.oneOf("the", "program", "compiles", "therefore", "it", "should", "work") } yield s
forAll (famousLastWords, famousLastWords, famousLastWords, famousLastWords, famousLastWords) { (a: String, b: String, c: String, d: String, e: String) => a.length + b.length + c.length + d.length + e.length should equal ((a + b + c + d + e).length) }
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function with the specified argument names to arguments supplied by implicitly passed generators.
Performs a property check by applying the specified property check function with the specified argument names to arguments supplied by implicitly passed generators.
Here's an example:
forAll ("a", "b", "c", "d", "e") { (a: String, b: String, c: String, d: String, e: String) =>
a.length + b.length + c.length + d.length + e.length should equal ((a + b + c + d + e).length)
}
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to arguments supplied by implicitly passed generators.
Performs a property check by applying the specified property check function to arguments supplied by implicitly passed generators.
Here's an example:
forAll { (a: String, b: String, c: String, d: String, e: String) =>
a.length + b.length + c.length + d.length + e.length should equal ((a + b + c + d + e).length)
}
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to named arguments supplied by the specified generators.
Performs a property check by applying the specified property check function to named arguments supplied by the specified generators.
Here's an example:
import org.scalacheck.Gen
// Define your own string generator: val famousLastWords = for { s <- Gen.oneOf("the", "program", "compiles", "therefore", "it", "should", "work") } yield s
forAll ((famousLastWords, "a"), (famousLastWords, "b"), (famousLastWords, "c"), (famousLastWords, "d")) { (a: String, b: String, c: String, d: String) => a.length + b.length + c.length + d.length should equal ((a + b + c + d).length) }
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to arguments supplied by the specified generators.
Performs a property check by applying the specified property check function to arguments supplied by the specified generators.
Here's an example:
import org.scalacheck.Gen
// Define your own string generator: val famousLastWords = for { s <- Gen.oneOf("the", "program", "compiles", "therefore", "it", "should", "work") } yield s
forAll (famousLastWords, famousLastWords, famousLastWords, famousLastWords) { (a: String, b: String, c: String, d: String) => a.length + b.length + c.length + d.length should equal ((a + b + c + d).length) }
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function with the specified argument names to arguments supplied by implicitly passed generators.
Performs a property check by applying the specified property check function with the specified argument names to arguments supplied by implicitly passed generators.
Here's an example:
forAll ("a", "b", "c", "d") { (a: String, b: String, c: String, d: String) =>
a.length + b.length + c.length + d.length should equal ((a + b + c + d).length)
}
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to arguments supplied by implicitly passed generators.
Performs a property check by applying the specified property check function to arguments supplied by implicitly passed generators.
Here's an example:
forAll { (a: String, b: String, c: String, d: String) =>
a.length + b.length + c.length + d.length should equal ((a + b + c + d).length)
}
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to named arguments supplied by the specified generators.
Performs a property check by applying the specified property check function to named arguments supplied by the specified generators.
Here's an example:
import org.scalacheck.Gen
// Define your own string generator: val famousLastWords = for { s <- Gen.oneOf("the", "program", "compiles", "therefore", "it", "should", "work") } yield s
forAll ((famousLastWords, "a"), (famousLastWords, "b"), (famousLastWords, "c")) { (a: String, b: String, c: String) => a.length + b.length + c.length should equal ((a + b + c).length) }
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to arguments supplied by the specified generators.
Performs a property check by applying the specified property check function to arguments supplied by the specified generators.
Here's an example:
import org.scalacheck.Gen
// Define your own string generator: val famousLastWords = for { s <- Gen.oneOf("the", "program", "compiles", "therefore", "it", "should", "work") } yield s
forAll (famousLastWords, famousLastWords, famousLastWords) { (a: String, b: String, c: String) => a.length + b.length + c.length should equal ((a + b + c).length) }
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function with the specified argument names to arguments supplied by implicitly passed generators.
Performs a property check by applying the specified property check function with the specified argument names to arguments supplied by implicitly passed generators.
Here's an example:
forAll ("a", "b", "c") { (a: String, b: String, c: String) =>
a.length + b.length + c.length should equal ((a + b + c).length)
}
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to arguments supplied by implicitly passed generators.
Performs a property check by applying the specified property check function to arguments supplied by implicitly passed generators.
Here's an example:
forAll { (a: String, b: String, c: String) =>
a.length + b.length + c.length should equal ((a + b + c).length)
}
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to named arguments supplied by the specified generators.
Performs a property check by applying the specified property check function to named arguments supplied by the specified generators.
Here's an example:
import org.scalacheck.Gen
// Define your own string generator: val famousLastWords = for { s <- Gen.oneOf("the", "program", "compiles", "therefore", "it", "should", "work") } yield s
forAll ((famousLastWords, "a"), (famousLastWords, "b")) { (a: String, b: String) => a.length + b.length should equal ((a + b).length) }
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to arguments supplied by the specified generators.
Performs a property check by applying the specified property check function to arguments supplied by the specified generators.
Here's an example:
import org.scalacheck.Gen
// Define your own string generator: val famousLastWords = for { s <- Gen.oneOf("the", "program", "compiles", "therefore", "it", "should", "work") } yield s
forAll (famousLastWords, famousLastWords) { (a: String, b: String) => a.length + b.length should equal ((a + b).length) }
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function with the specified argument names to arguments supplied by implicitly passed generators.
Performs a property check by applying the specified property check function with the specified argument names to arguments supplied by implicitly passed generators.
Here's an example:
forAll ("a", "b") { (a: String, b: String) =>
a.length + b.length should equal ((a + b).length)
}
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to arguments supplied by implicitly passed generators.
Performs a property check by applying the specified property check function to arguments supplied by implicitly passed generators.
Here's an example:
forAll { (a: String, b: String) =>
a.length + b.length should equal ((a + b).length)
}
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to named arguments supplied by the specified generators.
Performs a property check by applying the specified property check function to named arguments supplied by the specified generators.
Here's an example:
import org.scalacheck.Gen
// Define your own string generator: val famousLastWords = for { s <- Gen.oneOf("the", "program", "compiles", "therefore", "it", "should", "work") } yield s
forAll ((famousLastWords, "a")) { (a: String) => a.length should equal ((a).length) }
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to arguments supplied by the specified generators.
Performs a property check by applying the specified property check function to arguments supplied by the specified generators.
Here's an example:
import org.scalacheck.Gen
// Define your own string generator: val famousLastWords = for { s <- Gen.oneOf("the", "program", "compiles", "therefore", "it", "should", "work") } yield s
forAll (famousLastWords) { (a: String) => a.length should equal ((a).length) }
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function with the specified argument names to arguments supplied by implicitly passed generators.
Performs a property check by applying the specified property check function with the specified argument names to arguments supplied by implicitly passed generators.
Here's an example:
forAll ("a") { (a: String) =>
a.length should equal ((a).length)
}
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to arguments supplied by implicitly passed generators.
Performs a property check by applying the specified property check function to arguments supplied by implicitly passed generators.
Here's an example:
forAll { (a: String) =>
a.length should equal ((a).length)
}
the property check function to apply to the generated arguments
Performs a property check by applying the specified property check function to arguments
supplied by implicitly passed generators, modifying the values in the implicitly passed
PropertyGenConfig object with explicitly passed parameter values.
Performs a property check by applying the specified property check function to arguments
supplied by implicitly passed generators, modifying the values in the implicitly passed
PropertyGenConfig object with explicitly passed parameter values.
This method creates a ConfiguredPropertyCheck object that has six overloaded apply methods
that take a function. Thus it is used with functions of all six arities.
Here are some examples:
forAll (minSize(1), maxSize(10)) { (a: String) => a.length should equal ((a).length) }
forAll (minSize(1), maxSize(10)) { (a: String, b: String) => a.length + b.length should equal ((a + b).length) }
forAll (minSize(1), maxSize(10)) { (a: String, b: String, c: String) => a.length + b.length + c.length should equal ((a + b + c).length) }
forAll (minSize(1), maxSize(10)) { (a: String, b: String, c: String, d: String) => a.length + b.length + c.length + d.length should equal ((a + b + c + d).length) }
forAll (minSize(1), maxSize(10)) { (a: String, b: String, c: String, d: String, e: String) => a.length + b.length + c.length + d.length + e.length should equal ((a + b + c + d + e).length) }
forAll (minSize(1), maxSize(10)) { (a: String, b: String, c: String, d: String, e: String, f: String) => a.length + b.length + c.length + d.length + e.length + f.length should equal ((a + b + c + d + e + f).length) }
a variable length list of PropertyCheckConfigParam objects that should override corresponding
values in the PropertyCheckConfig implicitly passed to the apply methods of the ConfiguredPropertyCheck
object returned by this method.
Implicit PropertyCheckConfig value providing default configuration values.
Implicit PropertyCheckConfig value providing default configuration values.
Returns a MaxDiscarded property check configuration parameter containing the passed value, which specifies the maximum number of discarded
property evaluations allowed during property evaluation.
Returns a MaxDiscarded property check configuration parameter containing the passed value, which specifies the maximum number of discarded
property evaluations allowed during property evaluation.
if specified value is less than zero.
Returns a MaxSize property check configuration parameter containing the passed value, which specifies the maximum size parameter to
provide to ScalaCheck, which it will use when generating objects for which size matters (such as
strings or lists).
Returns a MaxSize property check configuration parameter containing the passed value, which specifies the maximum size parameter to
provide to ScalaCheck, which it will use when generating objects for which size matters (such as
strings or lists).
Note that the maximum size should be greater than or equal to the minimum size. This requirement is
enforced by the PropertyCheckConfig constructor and the forAll methods of
traits PropertyChecks and Checkers. In other words, it is enforced at the point
both a maximum and minimum size are provided together.
if specified value is less than zero.
Returns a MinSize property check configuration parameter containing the passed value, which specifies the minimum size parameter to
provide to ScalaCheck, which it will use when generating objects for which size matters (such as
strings or lists).
Returns a MinSize property check configuration parameter containing the passed value, which specifies the minimum size parameter to
provide to ScalaCheck, which it will use when generating objects for which size matters (such as
strings or lists).
if specified value is less than zero.
Returns a MinSuccessful property check configuration parameter containing the passed value, which specifies the minimum number of successful
property evaluations required for the property to pass.
Returns a MinSuccessful property check configuration parameter containing the passed value, which specifies the minimum number of successful
property evaluations required for the property to pass.
if specified value is less than or equal to zero.
Evaluates the passed code block if the passed boolean condition is true, else throws DiscardedEvaluationException.
Evaluates the passed code block if the passed boolean condition is true, else throws DiscardedEvaluationException.
The whenever method can be used inside property check functions to discard invocations of the function with
data for which it is known the property would fail. For example, given the following Fraction class:
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 }
import org.scalatest.prop.TableDrivenPropertyChecks._
val fractions = Table( ("n", "d"), ( 1, 2), ( -1, 2), ( 1, -2), ( -1, -2), ( 3, 1), ( -3, 1), ( -3, 0), ( 3, -1), ( 3, Integer.MIN_VALUE), (Integer.MIN_VALUE, 3), ( -3, -1) )
Imagine you wanted to check a property against this class with data that includes some
value that are rejected by the constructor, such as a denominator of zero, which should
result in an IllegalArgumentException. You could use whenever
to discard any rows in the fraction that represent illegal arguments, like this:
import org.scalatest.matchers.ShouldMatchers._
forAll (fractions) { (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 } }
In this example, rows 6, 8, and 9 have values that would cause a false to be passed
to whenever. (For example, in row 6, d is 0, which means d != 0
will be false.) For those rows, whenever will throw DiscardedEvaluationException,
which will cause the forAll method to discard that row.
the boolean condition that determines whether whenever will evaluate the
fun function (condition is true) or throws DiscardedEvaluationException (condition is false)
the function to evaluate if the specified condition is true
Returns a Workers property check configuration parameter containing the passed value, which specifies the number of worker threads
to use when evaluating a property.
Returns a Workers property check configuration parameter containing the passed value, which specifies the number of worker threads
to use when evaluating a property.
if specified value is less than or equal to zero.
Trait containing methods that faciliate property checks against generated data using ScalaCheck.
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
GeneratorDrivenPropertyChecksin action, imagine you want to test thisFractionclass:To test the behavior of
Fraction, you could mix in or import the members ofGeneratorDrivenPropertyChecks(andShouldMatchers) 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
GeneratorDrivenPropertyChecksprovides 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 aGeneratorDrivenPropertyCheckFailedExceptionif 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:When this fails, you'll see an error message that includes this:
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:
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:
Given 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:
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:Were this property check to fail, it would mention the names n and d in the error message, like this:
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:The
forAllmethods of traitGeneratorDrivenPropertyCheckseach take aPropertyCheckConfigobject 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 theGeneratorDrivenPropertyCheckscompanion object rather than mixing in the trait.) For example, if you want all parameters at their defaults except forminSizeandmaxSize, you can overridegeneratorDrivenConfig, like this:Or, hide it by declaring a variable of the same name in whatever scope you want the changed values to be in effect:
In addition to taking a
PropertyCheckConfigobject as an implicit parameter, theforAllmethods of traitGeneratorDrivenPropertyChecksalso take a variable length argument list ofPropertyCheckConfigParamobjects that you can use to override the values provided by the implicitPropertyCheckConfigfor a singleforAllinvocation. For example, if you want to setminSuccessfulto 500 for just one particularforAllinvocation, you can do so like this:This invocation of
forAllwill use 500 forminSuccessfuland whatever values are specified by the implicitly passedPropertyCheckConfigobject for the other configuration parameters. If you want to set multiple configuration parameters in this way, just list them separated by commas: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:For more information, see the documentation for supertrait
Configuration.