Unlock This Episode
Our Free plan includes 1 subscriber-only episode of your choice, plus weekly updates from our newsletter.
So what we are seeing is that we put in a lot of upfront work with
Decodable, and got some impressive results out it because we can effortlessly generate a random value from pretty much any data type we define. However, the system is very rigid and will mostly create invalid values for your domain, like email addresses and positive user ids.
Maybe there’s another way. We saw last time that our
Gen type was able to do things that the Swift 4.2 randomness APIs were not capable of, so maybe it can help us out again?
Gen‘s base unit of randomness,
random, which is a
Gen<UInt32>to work with Swift 4.2’s base unit of randomness, the
RandomNumberGeneratorprotocol. The base random type should should change to
Swift 4.2’s protocol-oriented solution allows us to define custom types that conform to
Gento evaluate given any
Use a custom random number generator that can be configured with a stable seed to allow for the
Gentype to predictably generate the same random value for a given seed.
Write a helper that runs a property test for
XCTest! A property test, given a generator and a block of code, will evaluate the block of code with a configurable number of random runs. If the block returns
true, the property test passes. It it returns
false, it fails. The signature should be the following.
func forAll<A>(_ a: Gen<A>, propertyShouldHold: (A) -> Bool)
It should, internally, call an
XCTAssertfunction. Upon failure, print out the seed so that it can be reproduced.
forAllAPI to take
file: StaticString = #file, line: UInt = #line, which can be passed to XCTest in order to highlight the correct line on failure.