diff --git a/Directory.Build.props b/Directory.Build.props index 640cb81..19a68f4 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -10,7 +10,7 @@ FS3388,FS3559 - + diff --git a/WoofWare.Myriad.Plugins.Attributes/Test/WoofWare.Myriad.Plugins.Attributes.Test.fsproj b/WoofWare.Myriad.Plugins.Attributes/Test/WoofWare.Myriad.Plugins.Attributes.Test.fsproj index ebcc26b..ba20e11 100644 --- a/WoofWare.Myriad.Plugins.Attributes/Test/WoofWare.Myriad.Plugins.Attributes.Test.fsproj +++ b/WoofWare.Myriad.Plugins.Attributes/Test/WoofWare.Myriad.Plugins.Attributes.Test.fsproj @@ -17,7 +17,7 @@ - + diff --git a/WoofWare.Myriad.Plugins.Test/TestJsonSerialize/TestJsonSerde.fs b/WoofWare.Myriad.Plugins.Test/TestJsonSerialize/TestJsonSerde.fs index f78284f..1638732 100644 --- a/WoofWare.Myriad.Plugins.Test/TestJsonSerialize/TestJsonSerde.fs +++ b/WoofWare.Myriad.Plugins.Test/TestJsonSerialize/TestJsonSerde.fs @@ -3,7 +3,7 @@ namespace WoofWare.Myriad.Plugins.Test open System open System.Collections.Generic open System.Text.Json.Nodes -open FsCheck.Random +open FsCheck.FSharp open Microsoft.FSharp.Reflection open NUnit.Framework open FsCheck @@ -15,21 +15,21 @@ module TestJsonSerde = let uriGen : Gen = gen { - let! suffix = Arb.generate + let! suffix = ArbMap.generate ArbMap.defaults return Uri $"https://example.com/%i{suffix}" } let rec innerGen (count : int) : Gen = gen { - let! guid = Arb.generate - let! mapKeys = Gen.listOf Arb.generate> + let! guid = ArbMap.generate ArbMap.defaults + let! mapKeys = Gen.listOf (ArbMap.generate> ArbMap.defaults) let mapKeys = mapKeys |> List.map _.Get |> List.distinct let! mapValues = Gen.listOfLength mapKeys.Length uriGen let map = List.zip mapKeys mapValues |> Map.ofList let! concreteDictKeys = if count > 0 then - Gen.listOf Arb.generate> + Gen.listOf (ArbMap.generate> ArbMap.defaults) else Gen.constant [] @@ -50,13 +50,16 @@ module TestJsonSerde = |> List.map KeyValuePair |> Dictionary - let! readOnlyDictKeys = Gen.listOf Arb.generate> + let! readOnlyDictKeys = Gen.listOf (ArbMap.generate> ArbMap.defaults) let readOnlyDictKeys = readOnlyDictKeys |> List.map _.Get |> List.distinct - let! readOnlyDictValues = Gen.listOfLength readOnlyDictKeys.Length (Gen.listOf Arb.generate) + + let! readOnlyDictValues = + Gen.listOfLength readOnlyDictKeys.Length (Gen.listOf (ArbMap.generate ArbMap.defaults)) + let readOnlyDict = List.zip readOnlyDictKeys readOnlyDictValues |> readOnlyDict let! dictKeys = Gen.listOf uriGen - let! dictValues = Gen.listOfLength dictKeys.Length Arb.generate + let! dictValues = Gen.listOfLength dictKeys.Length (ArbMap.generate ArbMap.defaults) let dict = List.zip dictKeys dictValues |> dict return @@ -71,28 +74,38 @@ module TestJsonSerde = let outerGen : Gen = gen { - let! a = Arb.generate - let! b = Arb.generate> - let! c = Gen.listOf Arb.generate + let! a = ArbMap.generate ArbMap.defaults + let! b = ArbMap.generate> ArbMap.defaults + let! c = Gen.listOf (ArbMap.generate ArbMap.defaults) let! depth = Gen.choose (0, 2) let! d = innerGen depth - let! e = Gen.arrayOf Arb.generate> - let! arr = Gen.arrayOf Arb.generate - let! byte = Arb.generate - let! sbyte = Arb.generate - let! i = Arb.generate - let! i32 = Arb.generate - let! i64 = Arb.generate - let! u = Arb.generate - let! u32 = Arb.generate - let! u64 = Arb.generate - let! f = Arb.generate |> Gen.filter (fun s -> Double.IsFinite (s / 1.0)) - let! f32 = Arb.generate |> Gen.filter (fun s -> Single.IsFinite (s / 1.0f)) - let! single = Arb.generate |> Gen.filter (fun s -> Single.IsFinite (s / 1.0f)) - let! intMeasureOption = Arb.generate - let! intMeasureNullable = Arb.generate + let! e = Gen.arrayOf (ArbMap.generate> ArbMap.defaults) + let! arr = Gen.arrayOf (ArbMap.generate ArbMap.defaults) + let! byte = ArbMap.generate ArbMap.defaults + let! sbyte = ArbMap.generate ArbMap.defaults + let! i = ArbMap.generate ArbMap.defaults + let! i32 = ArbMap.generate ArbMap.defaults + let! i64 = ArbMap.generate ArbMap.defaults + let! u = ArbMap.generate ArbMap.defaults + let! u32 = ArbMap.generate ArbMap.defaults + let! u64 = ArbMap.generate ArbMap.defaults + + let! f = + ArbMap.generate ArbMap.defaults + |> Gen.filter (fun s -> Double.IsFinite (s / 1.0)) + + let! f32 = + ArbMap.generate ArbMap.defaults + |> Gen.filter (fun s -> Single.IsFinite (s / 1.0f)) + + let! single = + ArbMap.generate ArbMap.defaults + |> Gen.filter (fun s -> Single.IsFinite (s / 1.0f)) + + let! intMeasureOption = ArbMap.generate ArbMap.defaults + let! intMeasureNullable = ArbMap.generate ArbMap.defaults let! someEnum = Gen.choose (0, 1) - let! timestamp = Arb.generate + let! timestamp = ArbMap.generate ArbMap.defaults return { @@ -270,10 +283,10 @@ module TestJsonSerde = match case with | 0 -> return FirstDu.EmptyCase | 1 -> - let! s = Arb.generate> + let! s = ArbMap.generate> ArbMap.defaults return FirstDu.Case1 s.Get | 2 -> - let! i = Arb.generate + let! i = ArbMap.generate ArbMap.defaults let! record = outerGen return FirstDu.Case2 (record, i) | _ -> return failwith $"unexpected: %i{case}" @@ -293,7 +306,6 @@ module TestJsonSerde = [] let ``DU generator covers all cases`` () = - let rand = Random () let cases = FSharpType.GetUnionCases typeof let counts = Array.zeroCreate cases.Length @@ -301,11 +313,13 @@ module TestJsonSerde = let mutable i = 0 - while i < 10_000 && Array.exists (fun i -> i = 0) counts do - let du = Gen.eval 10 (StdGen.StdGen (rand.Next (), rand.Next ())) duGen + let property (du : FirstDu) = let tag = decompose du counts.[tag] <- counts.[tag] + 1 i <- i + 1 + true + + Check.One (Config.Quick, Prop.forAll (Arb.fromGen duGen) property) for i in counts do i |> shouldBeGreaterThan 0 diff --git a/WoofWare.Myriad.Plugins.Test/WoofWare.Myriad.Plugins.Test.fsproj b/WoofWare.Myriad.Plugins.Test/WoofWare.Myriad.Plugins.Test.fsproj index c35dc32..2b4b5f0 100644 --- a/WoofWare.Myriad.Plugins.Test/WoofWare.Myriad.Plugins.Test.fsproj +++ b/WoofWare.Myriad.Plugins.Test/WoofWare.Myriad.Plugins.Test.fsproj @@ -41,8 +41,8 @@ - - + + diff --git a/nix/deps.json b/nix/deps.json index ec86b96..2f96da0 100644 --- a/nix/deps.json +++ b/nix/deps.json @@ -1,8 +1,8 @@ [ { "pname": "ApiSurface", - "version": "4.1.15", - "hash": "sha256-E0J62c/viqvVBvBA5lBPG90BgPCrA6+cS/h4MZjKz+k=" + "version": "4.1.16", + "hash": "sha256-3F+dY2nZMFukUjIGrvB/h3ZsZYdLJ9jvQKRxX33qk2E=" }, { "pname": "fantomas", @@ -21,19 +21,14 @@ }, { "pname": "FsCheck", - "version": "2.16.6", - "hash": "sha256-1hR2SaJTkqBzU3D955MvLNVzkQHkx0Z/QzOXZfzk2Zw=" + "version": "3.0.0", + "hash": "sha256-/5FqiNeTVFairRtInS0cjQ3uGlqVfVJG2FsKIo8mdZ4=" }, { "pname": "fsharp-analyzers", "version": "0.28.0", "hash": "sha256-BqGk9MzHHA3oRPNfWuANcM1YELsdhzWI+kLF4mUDUx8=" }, - { - "pname": "FSharp.Core", - "version": "4.2.3", - "hash": "sha256-yMGMrMUY+4Lwnh9JIbD2/3FBGIFcSK7leGURWaSQsLQ=" - }, { "pname": "FSharp.Core", "version": "4.3.4", @@ -191,8 +186,8 @@ }, { "pname": "Nerdbank.GitVersioning", - "version": "3.7.112", - "hash": "sha256-vrItlaH5MpBHa4MI1cQgI11NAe4W3XsxR9DizFE7fus=" + "version": "3.7.115", + "hash": "sha256-sqn+i7vvBgBUtm7j82mH+SpApgI2hsmL5DYfLm1Z7gw=" }, { "pname": "NETStandard.Library",