falsify-0.4.0: CHANGELOG.md
# Revision history for falsify
## 0.4.0 -- 2026-07-01
This release is a major cleanup release, and backwards incompatible with 0.3 in
various ways. Below we provide a list of changes as well as a migration guide.
### New features
* `Test.Falsify.Interactive` now offers a pure function `sampleUsing` (#65),
using `ReplaySeed` to initialize the PRNG. `ReplaySeed` is no longer opaque.
* `Property` now offers `getContext`, which allows properties to vary their
behaviour across different test iterations; for example, tests might want to
start with generating values from small ranges and then slowly increase that
range. There is also a derived function `sized` for that specific application.
(#102, together with Peter Lebbing and Martijn Bastiaan from QBayLogic)
### Package split: `falsify` vs `tasty-falsify`
* The main `falsify` package no longer provides `tasty` integration (indeed,
it does not depend on `tasty` at all anymore); instead, `tasty` integration
is provided by a new `tasty-falsify` package (#80).
* Module `Test.Tasty.Falsify` now lives in `tasty-falsify`, and it _only_
provides the functionality required for the use of `falsify` with `tasty`; it
no longer re-exports anything from `falsify`.
* `Test.Falsify.Driver` now provides the "official" API for use in driver
integration.
### Module hierarchy
The module hierarchy has been improved.
* There is a new top-level module `Test.Falsify`, which is intended to provide
all definitions that are meant for unqualified import. A typical `falsify`
test suite will therefore start with
```hs
import Test.Falsify
import qualified Test.Falsify.Generator as Gen
import qualified Test.Falsify.Predicate as P
import qualified Test.Falsify.Range as Range
```
* `Test.Falsify.Generator` now really only provides generators
(it was previously an awkward mix of generators and custom datatypes)
* `Data.Falsify.*` is a new public module hierarchy providing some general
purpose data structures and utilities:
- `Data.Falsify.Concrete`
- `Data.Falsify.Permutation`
- `Data.Falsify.ProperFraction`
- `Data.Falsify.Tree`
- `Data.Falsify.WordN`
* Some testing specific data structures now have dedicated modules:
- `Test.Falsify.Fun`
- `Test.Falsify.Marked`
- `Test.Falsify.SampleTree`
- `Test.Falsify.ShrinkTree`
The internal (private) module hierarchy has been simplified as well; the
`Reexported.*` module hierarchy is no longer used (the distinction had lost its
purpose).
### Newtypes
A number of type aliases have been replaced by newtypes.
* In `Test.Falsify.Predicate`, `VarName` is now a newtype rather than a type
alias, and we now also have `FnName` alongside `VarName`. Both of these have
`IsString` instances, so code that uses `OverloadedStrings` should not be
affected
* `ShrinkTree` is now a newtype rather than a type alias, and is moved to
`Test.Falsify.ShrinkTree`
### Other changes
* The signature of `path` has been simplified: it no longer uses `IsValidShrink`
(which is now internal API)
* Simplified signature of `bst`, which now only accepts inclusive bounds (#91)
* Remove deprecated functions `integral` and `enum`
* Rename `Test.Falsify.Range.between` to `uniform` (#92).
This avoid confusion with `Test.Falsify.Predicate.between` (since the values
produced by the former do not necessarily satisfy the latter!). Also improved
documentation.
* Predicates `alwaysPass` and `alwaysFail` have been renamed to `pass` and
`fail` respectively, and `fail` now takes an error messages. The new names
are a more natural fit when used together with `lam` to construct predicates
of arbitrary arity. To consider the old `alwaysFail`, use `Fail "Fail"`.
* Predicate documentation has been significantly improved.
* Dropped support for GHC < 8.10.7
## 0.3.0 -- 2026-03-05
* Introduce new `Range` constructor called `between`, which can be used for
better uniform selection of large bit-size `Integral` types.
[#81, reported by Andrea Vezzosi]
* Support generating functions from empty types [#84, Sjoerd Visscher]
* Add `minimalValue` function [#86, Sjoerd Visscher]
* Fix overflow in `Fun Int8` [#89, reported by Jake McArthur]
* The primitive `Range` constructor is now based on `WordN` rather than
`ProperFraction`. Most users will not notice this difference, but the
signature of the primitive `eval` function has changed.
* Relax package bounds and test with ghc 9.14.1
## 0.2.0 -- 2023-11-08
* Avoid use of `Expr` in `at` (#48)
* Add `oneof` (#54; Simon Kohlmeyer)
* Generalize `Range`, so that it can be used for types like `Char` (#51).
As a consequence, `Gen.integral` and `Gen.enum` are now deprecated, and
superseded by `Gen.inRange`.
* Add `GenDefault` class and `DerivingVia` helpers to derive generators
(Eric Conlon; #61, #64).
## 0.1.1 -- 2023-04-07
* Better verbose mode for test failures
* New predicates: `split` and `pairwise`.
* Shrink towards the _second_ half of the range in `withOrigin`
## 0.1.0 -- 2023-04-05
* First release