SwiftCheck icon indicating copy to clipboard operation
SwiftCheck copied to clipboard

How exactly to rerun failed examples?

Open Fryie opened this issue 7 years ago • 5 comments

Hi, I'm trying to figure out how exactly to reproduce a failure in my test so I can debug it. I receive output like "Replay with 1006624065 8850 and size 2". But I'm not exactly sure how I can generate the exact example that caused the failure.

I'm trying

let args = CheckerArguments(replay: (StdGen(1006624065, 8850), 2))
property("something", arguments: args) <- forAll ...

but it looks like that generates 100 test cases. How can I get only exactly the one that failed?

As a workaround I guess I can assign my condition in the forAll closure to a variable and work with if ... else, but maybe there's an easier way.

(Also, it would be nice if the output could be something like

Replay with "arguments: CheckerArguments(replay: (StdGen(1006624065, 8850), 2))"

or something, because currently it's not really intuitively clear where these values need to be inserted.)

Fryie avatar Oct 18 '18 14:10 Fryie

You should have the shrunken version of the values that failed your property printed to the console by the failure handler.

CodaFi avatar Oct 18 '18 19:10 CodaFi

Yes. But if you have quite complicated structures (even after shrinking) with very custom description strings, it can be very hard to take that output and translate it back to code that initializes said value. This is certainly true in my case.

Fryie avatar Oct 19 '18 10:10 Fryie

Very true. This is a language-level problem I think, and requires a language-level solution. Being able to stringify arbitrary bits of the AST with a good macro system would make this trivial.

In the mean time, as a hack, you could write a modifier type that dumps a value declaration as its description

CodaFi avatar Oct 19 '18 14:10 CodaFi

I do agree with your suggestion to improve the replay diagnostic. Especially now that Xcode lets you copy diagnostic banner text.

CodaFi avatar Oct 19 '18 14:10 CodaFi

I do agree with your suggestion to improve the replay diagnostic. Especially now that Xcode lets you copy diagnostic banner text.

Maybe one could also add another property to CheckerArguments, like runOnlyExample: Int? Then the output could indicate the seed, the size and also this attribute so the exact test case can be easily reproduced.

Fryie avatar Oct 19 '18 14:10 Fryie