smallcheck icon indicating copy to clipboard operation
smallcheck copied to clipboard

Improve showing functions

Open UnkindPartition opened this issue 12 years ago • 4 comments

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.

UnkindPartition avatar Jan 25 '13 11:01 UnkindPartition

Perhaps the current instance for a->b should live in a separate module so that it can be optionally imported ?

pepeiborra avatar Aug 17 '13 17:08 pepeiborra

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).)

UnkindPartition avatar Aug 18 '13 22:08 UnkindPartition

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.

UnkindPartition avatar Feb 03 '14 16:02 UnkindPartition

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).

UnkindPartition avatar Feb 06 '14 08:02 UnkindPartition

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.

Bodigrim avatar Jun 01 '23 22:06 Bodigrim