52 lines
1.3 KiB
Markdown
52 lines
1.3 KiB
Markdown
|
|
# Haskell QuickCheck
|
||
|
|
|
||
|
|
This note covers `26-haskell-quickcheck/`, which normalizes overlapping maintenance windows and checks the implementation with QuickCheck
|
||
|
|
properties.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. Why Properties Help Here
|
||
|
|
|
||
|
|
The function under test is not a single arithmetic helper. It sorts, merges, and preserves the covered time range of several windows.
|
||
|
|
|
||
|
|
That kind of behavior is a strong fit for property testing, because you care about broad rules:
|
||
|
|
|
||
|
|
- the result should be normalized,
|
||
|
|
- normalizing twice should not change the answer, and
|
||
|
|
- the normalized result should cover exactly the same minutes as the input.
|
||
|
|
|
||
|
|
Those are better teaching examples for QuickCheck than a one-line `reverse . reverse` property.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. What the Generator Controls
|
||
|
|
|
||
|
|
The test suite generates windows within a bounded minute range.
|
||
|
|
|
||
|
|
That keeps the coverage property finite, because the test can compare membership across `0..60` directly.
|
||
|
|
|
||
|
|
The important point is not the numeric range itself. It is the workflow:
|
||
|
|
|
||
|
|
1. generate realistic structured input,
|
||
|
|
2. state invariant-like properties, and
|
||
|
|
3. let QuickCheck search for counterexamples.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. Commands to Try
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cd 26-haskell-quickcheck
|
||
|
|
|
||
|
|
nix develop
|
||
|
|
cabal run
|
||
|
|
cabal run -- 0-10 8-14 20-24 24-30
|
||
|
|
cabal test
|
||
|
|
|
||
|
|
nix build
|
||
|
|
./result/bin/mini-windows 0-10 8-14 20-24 24-30
|
||
|
|
|
||
|
|
nix run . -- 0-10 8-14 20-24 24-30
|
||
|
|
nix flake check
|
||
|
|
```
|