fscheck / FsCheck

Random Testing for .NET
https://fscheck.github.io/FsCheck/
BSD 3-Clause "New" or "Revised" License
1.17k stars 156 forks source link

No instances of class FsCheck.Testable+ITestable1[T] for type Microsoft.FSharp.Collections.FSharpList1[FsCheck.Property] #660

Closed rynoV closed 7 months ago

rynoV commented 7 months ago

I was expecting lists and tuples to be testable based on these docs, but it seems they're not implemented yet:

https://github.com/fscheck/FsCheck/blob/f1bd17add9fc8ac82e58b59ef3b09e522973e83e/src/FsCheck/Testable.fs#L190

On a related note, these would be useful because auto formatting with fantomas can make the test labels less readable in some case by breaking the label onto a new line (and that is less likely when using an indentation based list):

        test1 |@ "label 1"
        .&. test2
        |@ "label 2"

Last, would it make sense to expose ITestable for custom implementations?

Thanks for your help!

rynoV commented 7 months ago

Last, would it make sense to expose ITestable for custom implementations?

Another reason for this might be to facilitate helper functions, for example if I want to make a helper like:

    let testAll (tests: 'a seq) : FsCheck.Property = tests |> Seq.reduce (.&.)

F# constrains 'a to be a Property, when ideally it would be anything implementing ITestable, but I don't think there's any way to prevent this with the current API

kurtschelfthout commented 7 months ago

This is an intentional removal in 3.0. I think I also wanted to remove the @| operators but probably forgot, so you got "lucky" there ;)

I'd advice using instead:

test1 |> Prop.label"label 1"
.&. test2 |> Prop.label "label 2"

Which may need some additional parens.

I also generally wanted to move away from having to maintain API for combining properties in this way. Using a test runner/assertion library like xunit or nunit is the suggested way forward here.

At the time, I felt like maintaining the additional, and bespoke API surface in FsCheck was not really worth it. People seem to like being able to return bools as assertions and combining them. I've found in practice that assertions while a bit more verbose often give better error indications.

kurtschelfthout commented 7 months ago

In other words, as you can see from other issues, the docs are out of date on this...I've barely changed them from the 2.0 version.