smallcheck
smallcheck copied to clipboard
Improve showing functions
First, provide a Fun datatype which knows about the function structure and show it instead.
Second, implement either function shrinking as described by Klaessen, or lazy-smallcheck-like shrinking.
Perhaps the current instance for a->b should live in a separate module so that it can be optionally imported ?
It would be nice indeed, but this instance is needed to be able to test higher-order functions.
(Note the Show constraint in instance (Serial m a, Show a, Testable m b) => Testable m (a->b)
.)
This has now become a real problem.
Some of tasty's dependencies (I don't know which one) apparently imports Text.Show.Functions
which contains a conflicting Show instance for function. So an attempt to use tasty and test functions using smallcheck results in an error:
Overlapping instances for Show (Bool -> JT Bool Maybe Bool)
arising from a use of `testProperty'
Matching instances:
instance [safe] Show (a -> b) -- Defined in `Text.Show.Functions'
instance [overlap ok] (Serial Identity a, Show a, Show b) =>
Show (a -> b)
-- Defined in `Test.SmallCheck.Series'
So, I'm going to remove the Show (a -> b)
instance and replace it with a Show Fun
instance.
Here are two approaches that I can think of:
- When generating a function, store the additional information (such as the inspected size of the argument and the default value) so that we know what/how to show
- Use the LogicT continuations to "refine" the function akin to lazy smallcheck. First try with the a never defined function, then catch exceptions and add cases to the table. This will work only with first-order functions, but OTOH it will produce much better results
I'm tempted to implement both approaches, like QuickCheck does (CoArbitrary
vs Argument
).
I think that modern QuickCheck-like frameworks with powerful shrinking such as falsify
offer a smoother user experience than smallcheck
. I'll carry on with life support of smallcheck
, but not really interested in changing things. Closing, won't do.