packages feed

antigen-0.3.0.0: README.md

# AntiGen

AntiGen lets you write `QuickCheck` generators that can also be negated to generate negative examples. It can be used as a drop-in replacement for `Gen`.

## Example

```haskell
-- Returns an integer `n` (such that 0 <= n <= 5) and a string of length `n` consisting only of characters 'a'
antiGenLengthString :: AntiGen (Int, String)
antiGenLengthString = do
  -- Use (|!) to provide both a positive and a negative generator
  l <- choose (0, 5) |! choose (6, 10)
  s <-
    pure (replicate l 'a') |! do
      NonNegative l' <- suchThat arbitrary $ \(NonNegative x) -> x /= l
      pure $ replicate l' 'b'
  pure (l, s)
```

To generate a positive example, use `runAntiGen`
```
ghci> generate (runAntiGen antiGenLengthString)
(1, "a")
```

To generate a negative example, use `zapAntiGen`
```
ghci> generate (zapAntiGen 1 antiGenLengthString)
(6, "aaaaaa") -- length is too long
ghci> generate (zapAntiGen 1 antiGenLengthString)
(2, "bbbb") -- length of the string does not match up with the integer
```

Notice that there is exactly one mistake in the example above. 
The first argument of `zapAntiGen` can be used to specify how many negations the generator should introduce.
```
ghci> generate $ zapAntiGen 2 antiGenLengthString
(10,"b") -- both values are wrong
```