diff --git a/CHANGELOG.md b/CHANGELOG.md index 134e1e81..834327ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,6 +83,7 @@ - Add missing `QCheck.Gen.ap` for consistency - Add missing `QCheck2.Gen.map_keep_input` for consistency - Add `QCheck.no_shrink` for consistency +- Fix shrinking for `QCheck2.Gen.exponential` which could shrink to `infinity` ## 0.27 (2025-10-31) diff --git a/src/core/QCheck2.ml b/src/core/QCheck2.ml index dd71f85b..af481a56 100644 --- a/src/core/QCheck2.ml +++ b/src/core/QCheck2.ml @@ -368,6 +368,18 @@ module Gen = struct let make_primitive ~(gen : RS.t -> 'a) ~(shrink : 'a -> 'a Seq.t) : 'a t = fun st -> Tree.make_primitive shrink (gen st) + let delay (f : unit -> 'a t) : 'a t = fun st -> f () st + + let add_shrink_invariant (p : 'a -> bool) (gen : 'a t) : 'a t = + fun st -> gen st |> Tree.add_shrink_invariant p + + let set_shrink shrink gen = + make_primitive + ~gen:(fun st -> gen st |> Tree.root) + ~shrink + + let no_shrink (gen: 'a t) : 'a t = set_shrink (fun _ -> Seq.empty) gen + let parse_origin (loc : string) (pp : Format.formatter -> 'a -> unit) ~(origin : 'a) ~(low : 'a) ~(high : 'a) : 'a = if origin < low then invalid_arg Format.(asprintf "%s: origin value %a is lower than low value %a" loc pp origin pp low) else if origin > high then invalid_arg Format.(asprintf "%s: origin value %a is greater than high value %a" loc pp origin pp high) @@ -478,8 +490,9 @@ module Gen = struct let float_exp (mean : float) = if Float.is_nan mean then invalid_arg "Gen.float_exp"; - let unit_gen = float_bound_inclusive 1.0 in - map (fun p -> -. mean *. (log p)) unit_gen + let unit_gen = no_shrink (float_bound_inclusive 1.0) in + let exp_gen = map (fun p -> -. mean *. (log p)) unit_gen in + set_shrink (Shrink.float_towards 0.) exp_gen (* See https://en.wikipedia.org/wiki/Relationships_among_probability_distributions *) let exponential = float_exp @@ -930,18 +943,6 @@ module Gen = struct let generate_tree ?(rand=RS.make_self_init()) (gen : 'a t) : 'a Tree.t = gen rand - let delay (f : unit -> 'a t) : 'a t = fun st -> f () st - - let add_shrink_invariant (p : 'a -> bool) (gen : 'a t) : 'a t = - fun st -> gen st |> Tree.add_shrink_invariant p - - let set_shrink shrink gen = - make_primitive - ~gen:(fun st -> gen st |> Tree.root) - ~shrink - - let no_shrink (gen: 'a t) : 'a t = set_shrink (fun _ -> Seq.empty) gen - let (let+) = (>|=) let (and+) = pair diff --git a/test/core/QCheck2_expect_test.expected.ocaml4.32 b/test/core/QCheck2_expect_test.expected.ocaml4.32 index 566dc335..6b2d8f19 100644 --- a/test/core/QCheck2_expect_test.expected.ocaml4.32 +++ b/test/core/QCheck2_expect_test.expected.ocaml4.32 @@ -347,6 +347,132 @@ Test float >= -1e10 failed (722 shrink steps): --- Failure -------------------------------------------------------------------- +Test float is not nan failed (0 shrink steps): + +-nan + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1e6 <= 10. failed (25 shrink steps): + +10.0001936411 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1e6 <= pi failed (24 shrink steps): + +3.14176318497 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1. <= 0.5 failed (8 shrink steps): + +0.500002807691 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1. <= min_float failed (1029 shrink steps): + +2.22508635315e-308 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive -1. >= -0.5 failed (8 shrink steps): + +-0.500002807691 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive -1e6 >= -.pi failed (24 shrink steps): + +-3.14176318497 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1e6 <= 10. failed (25 shrink steps): + +10.0001936411 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1e6 <= pi failed (24 shrink steps): + +3.14176318497 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1. <= 0.5 failed (8 shrink steps): + +0.500002807691 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1. <= min_float failed (1029 shrink steps): + +2.22508635315e-308 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive -1. >= -0.5 failed (8 shrink steps): + +-0.500002807691 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive -1e6 >= -.pi failed (24 shrink steps): + +-3.14176318497 + +--- Failure -------------------------------------------------------------------- + +Test float_range 1. 10. <= pi failed (8 shrink steps): + +3.14168329529 + +--- Failure -------------------------------------------------------------------- + +Test (float_range -10. 10.)^2 <= 2. failed (8 shrink steps): + +1.41429229241 + +--- Failure -------------------------------------------------------------------- + +Test float_range -10. -1. >= -.pi failed (7 shrink steps): + +-3.14165050694 + +--- Failure -------------------------------------------------------------------- + +Test float_pos < Float.pi failed (753 shrink steps): + +3.14167586353 + +--- Failure -------------------------------------------------------------------- + +Test float_pos is not nan failed (0 shrink steps): + +nan + +--- Failure -------------------------------------------------------------------- + +Test float_neg > Float.pi failed (753 shrink steps): + +-3.14167586353 + +--- Failure -------------------------------------------------------------------- + +Test float_neg is not nan failed (0 shrink steps): + +-nan + +--- Failure -------------------------------------------------------------------- + +Test float_exp 10. < Float.pi failed (6 shrink steps): + +3.1417780719 + +--- Failure -------------------------------------------------------------------- + Test char never produces 'abcdef' failed (1 shrink steps): 'a' @@ -1889,7 +2015,7 @@ Collect results for test float classify: FP_nan: 2 cases (0.0%) ================================================================================ 1 warning(s) -failure (83 tests failed, 3 tests errored, ran 184 tests) +failure (104 tests failed, 3 tests errored, ran 208 tests) random seed: 153870556 +++ Stats for int_dist_empty_bucket ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/test/core/QCheck2_expect_test.expected.ocaml4.64 b/test/core/QCheck2_expect_test.expected.ocaml4.64 index ef0d4da6..58f112a9 100644 --- a/test/core/QCheck2_expect_test.expected.ocaml4.64 +++ b/test/core/QCheck2_expect_test.expected.ocaml4.64 @@ -409,6 +409,132 @@ Test float >= -1e10 failed (722 shrink steps): --- Failure -------------------------------------------------------------------- +Test float is not nan failed (0 shrink steps): + +-nan + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1e6 <= 10. failed (25 shrink steps): + +10.0001936411 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1e6 <= pi failed (24 shrink steps): + +3.14176318497 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1. <= 0.5 failed (8 shrink steps): + +0.500002807691 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1. <= min_float failed (1029 shrink steps): + +2.22508635315e-308 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive -1. >= -0.5 failed (8 shrink steps): + +-0.500002807691 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive -1e6 >= -.pi failed (24 shrink steps): + +-3.14176318497 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1e6 <= 10. failed (25 shrink steps): + +10.0001936411 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1e6 <= pi failed (24 shrink steps): + +3.14176318497 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1. <= 0.5 failed (8 shrink steps): + +0.500002807691 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1. <= min_float failed (1029 shrink steps): + +2.22508635315e-308 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive -1. >= -0.5 failed (8 shrink steps): + +-0.500002807691 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive -1e6 >= -.pi failed (24 shrink steps): + +-3.14176318497 + +--- Failure -------------------------------------------------------------------- + +Test float_range 1. 10. <= pi failed (8 shrink steps): + +3.14168329529 + +--- Failure -------------------------------------------------------------------- + +Test (float_range -10. 10.)^2 <= 2. failed (8 shrink steps): + +1.41429229241 + +--- Failure -------------------------------------------------------------------- + +Test float_range -10. -1. >= -.pi failed (7 shrink steps): + +-3.14165050694 + +--- Failure -------------------------------------------------------------------- + +Test float_pos < Float.pi failed (753 shrink steps): + +3.14167586353 + +--- Failure -------------------------------------------------------------------- + +Test float_pos is not nan failed (0 shrink steps): + +nan + +--- Failure -------------------------------------------------------------------- + +Test float_neg > Float.pi failed (753 shrink steps): + +-3.14167586353 + +--- Failure -------------------------------------------------------------------- + +Test float_neg is not nan failed (0 shrink steps): + +-nan + +--- Failure -------------------------------------------------------------------- + +Test float_exp 10. < Float.pi failed (6 shrink steps): + +3.1417780719 + +--- Failure -------------------------------------------------------------------- + Test char never produces 'abcdef' failed (1 shrink steps): 'a' @@ -1953,7 +2079,7 @@ Collect results for test float classify: FP_nan: 2 cases (0.0%) ================================================================================ 1 warning(s) -failure (83 tests failed, 3 tests errored, ran 184 tests) +failure (104 tests failed, 3 tests errored, ran 208 tests) random seed: 153870556 +++ Stats for int_dist_empty_bucket ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/test/core/QCheck2_expect_test.expected.ocaml5.32 b/test/core/QCheck2_expect_test.expected.ocaml5.32 index 9a778cfb..4de8dfb6 100644 --- a/test/core/QCheck2_expect_test.expected.ocaml5.32 +++ b/test/core/QCheck2_expect_test.expected.ocaml5.32 @@ -330,6 +330,132 @@ Test float >= -1e10 failed (595 shrink steps): --- Failure -------------------------------------------------------------------- +Test float is not nan failed (0 shrink steps): + +nan + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1e6 <= 10. failed (21 shrink steps): + +10.0002602984 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1e6 <= pi failed (22 shrink steps): + +3.14170206035 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1. <= 0.5 failed (11 shrink steps): + +0.500029908118 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1. <= min_float failed (1032 shrink steps): + +2.22520695405e-308 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive -1. >= -0.5 failed (11 shrink steps): + +-0.500029908118 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive -1e6 >= -.pi failed (22 shrink steps): + +-3.14170206035 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1e6 <= 10. failed (21 shrink steps): + +10.0002602984 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1e6 <= pi failed (22 shrink steps): + +3.14170206035 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1. <= 0.5 failed (11 shrink steps): + +0.500029908118 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1. <= min_float failed (1032 shrink steps): + +2.22520695405e-308 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive -1. >= -0.5 failed (11 shrink steps): + +-0.500029908118 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive -1e6 >= -.pi failed (22 shrink steps): + +-3.14170206035 + +--- Failure -------------------------------------------------------------------- + +Test float_range 1. 10. <= pi failed (8 shrink steps): + +3.14165836248 + +--- Failure -------------------------------------------------------------------- + +Test (float_range -10. 10.)^2 <= 2. failed (9 shrink steps): + +1.41422528279 + +--- Failure -------------------------------------------------------------------- + +Test float_range -10. -1. >= -.pi failed (12 shrink steps): + +-3.14171246001 + +--- Failure -------------------------------------------------------------------- + +Test float_pos < Float.pi failed (630 shrink steps): + +3.1417319555 + +--- Failure -------------------------------------------------------------------- + +Test float_pos is not nan failed (0 shrink steps): + +nan + +--- Failure -------------------------------------------------------------------- + +Test float_neg > Float.pi failed (630 shrink steps): + +-3.1417319555 + +--- Failure -------------------------------------------------------------------- + +Test float_neg is not nan failed (0 shrink steps): + +-nan + +--- Failure -------------------------------------------------------------------- + +Test float_exp 10. < Float.pi failed (8 shrink steps): + +3.14167640757 + +--- Failure -------------------------------------------------------------------- + Test char never produces 'abcdef' failed (1 shrink steps): 'a' @@ -1873,7 +1999,7 @@ Collect results for test float classify: FP_subnormal: 3 cases (0.1%) ================================================================================ 1 warning(s) -failure (83 tests failed, 3 tests errored, ran 184 tests) +failure (104 tests failed, 3 tests errored, ran 208 tests) random seed: 153870556 +++ Stats for int_dist_empty_bucket ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/test/core/QCheck2_expect_test.expected.ocaml5.64 b/test/core/QCheck2_expect_test.expected.ocaml5.64 index 54543a68..048c7c11 100644 --- a/test/core/QCheck2_expect_test.expected.ocaml5.64 +++ b/test/core/QCheck2_expect_test.expected.ocaml5.64 @@ -392,6 +392,132 @@ Test float >= -1e10 failed (595 shrink steps): --- Failure -------------------------------------------------------------------- +Test float is not nan failed (0 shrink steps): + +nan + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1e6 <= 10. failed (21 shrink steps): + +10.0002602984 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1e6 <= pi failed (22 shrink steps): + +3.14170206035 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1. <= 0.5 failed (11 shrink steps): + +0.500029908118 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive 1. <= min_float failed (1032 shrink steps): + +2.22520695405e-308 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive -1. >= -0.5 failed (11 shrink steps): + +-0.500029908118 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_inclusive -1e6 >= -.pi failed (22 shrink steps): + +-3.14170206035 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1e6 <= 10. failed (21 shrink steps): + +10.0002602984 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1e6 <= pi failed (22 shrink steps): + +3.14170206035 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1. <= 0.5 failed (11 shrink steps): + +0.500029908118 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive 1. <= min_float failed (1032 shrink steps): + +2.22520695405e-308 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive -1. >= -0.5 failed (11 shrink steps): + +-0.500029908118 + +--- Failure -------------------------------------------------------------------- + +Test float_bound_exclusive -1e6 >= -.pi failed (22 shrink steps): + +-3.14170206035 + +--- Failure -------------------------------------------------------------------- + +Test float_range 1. 10. <= pi failed (8 shrink steps): + +3.14165836248 + +--- Failure -------------------------------------------------------------------- + +Test (float_range -10. 10.)^2 <= 2. failed (9 shrink steps): + +1.41422528279 + +--- Failure -------------------------------------------------------------------- + +Test float_range -10. -1. >= -.pi failed (12 shrink steps): + +-3.14171246001 + +--- Failure -------------------------------------------------------------------- + +Test float_pos < Float.pi failed (630 shrink steps): + +3.1417319555 + +--- Failure -------------------------------------------------------------------- + +Test float_pos is not nan failed (0 shrink steps): + +nan + +--- Failure -------------------------------------------------------------------- + +Test float_neg > Float.pi failed (630 shrink steps): + +-3.1417319555 + +--- Failure -------------------------------------------------------------------- + +Test float_neg is not nan failed (0 shrink steps): + +-nan + +--- Failure -------------------------------------------------------------------- + +Test float_exp 10. < Float.pi failed (8 shrink steps): + +3.14167640757 + +--- Failure -------------------------------------------------------------------- + Test char never produces 'abcdef' failed (1 shrink steps): 'a' @@ -1935,7 +2061,7 @@ Collect results for test float classify: FP_subnormal: 3 cases (0.1%) ================================================================================ 1 warning(s) -failure (83 tests failed, 3 tests errored, ran 184 tests) +failure (104 tests failed, 3 tests errored, ran 208 tests) random seed: 153870556 +++ Stats for int_dist_empty_bucket ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/test/core/QCheck2_tests.ml b/test/core/QCheck2_tests.ml index 6b79f4a7..a670fbce 100644 --- a/test/core/QCheck2_tests.ml +++ b/test/core/QCheck2_tests.ml @@ -469,6 +469,102 @@ module Shrink = struct Test.make ~name:"float >= -1e10" ~count:1000 ~print:Print.float Gen.float (fun f -> f >= -1e10) + let float_not_nan = + Test.make ~name:"float is not nan" ~count:10_000 ~print:Print.float + Gen.float (fun f -> not (Float.is_nan f)) + + let float_not_infinite = + Test.make ~name:"float is not infinity" ~count:10_000 ~print:Print.float + Gen.float (fun f -> not (Float.is_infinite f)) + + let float_bound_inclusive_1e6_leq_10 = + Test.make ~name:"float_bound_inclusive 1e6 <= 10." ~count:1000 ~print:Print.float + (Gen.float_bound_inclusive 1e6) (fun f -> f <= 10.) + + let float_bound_inclusive_1e6_leq_pi = + Test.make ~name:"float_bound_inclusive 1e6 <= pi" ~count:1000 ~print:Print.float + (Gen.float_bound_inclusive 1e6) (fun f -> f <= Float.pi) + + let float_bound_inclusive_1_leq_5em1 = + Test.make ~name:"float_bound_inclusive 1. <= 0.5" ~count:1000 ~print:Print.float + (Gen.float_bound_inclusive 1.) (fun f -> f <= 0.5) + + let float_bound_inclusive_1_leq_min_float = + Test.make ~name:"float_bound_inclusive 1. <= min_float" ~count:1000 ~print:Print.float + (Gen.float_bound_inclusive 1.) (fun f -> f <= min_float) + + let float_bound_inclusive_m1_geq_m5em1 = + Test.make ~name:"float_bound_inclusive -1. >= -0.5" ~count:1000 ~print:Print.float + (Gen.float_bound_inclusive (-1.)) (fun f -> f >= -0.5) + + let float_bound_inclusive_m1e6_geq_mpi = + Test.make ~name:"float_bound_inclusive -1e6 >= -.pi" ~count:1000 ~print:Print.float + (Gen.float_bound_inclusive (-1e6)) (fun f -> f >= -.Float.pi) + + let float_bound_exclusive_1e6_leq_10 = + Test.make ~name:"float_bound_exclusive 1e6 <= 10." ~count:1000 ~print:Print.float + (Gen.float_bound_exclusive 1e6) (fun f -> f <= 10.) + + let float_bound_exclusive_1e6_leq_pi = + Test.make ~name:"float_bound_exclusive 1e6 <= pi" ~count:1000 ~print:Print.float + (Gen.float_bound_exclusive 1e6) (fun f -> f <= Float.pi) + + let float_bound_exclusive_1_leq_5em1 = + Test.make ~name:"float_bound_exclusive 1. <= 0.5" ~count:1000 ~print:Print.float + (Gen.float_bound_exclusive 1.) (fun f -> f <= 0.5) + + let float_bound_exclusive_1_leq_min_float = + Test.make ~name:"float_bound_exclusive 1. <= min_float" ~count:1000 ~print:Print.float + (Gen.float_bound_exclusive 1.) (fun f -> f <= min_float) + + let float_bound_exclusive_m1_geq_m5em1 = + Test.make ~name:"float_bound_exclusive -1. >= -0.5" ~count:1000 ~print:Print.float + (Gen.float_bound_exclusive (-1.)) (fun f -> f >= -0.5) + + let float_bound_exclusive_m1e6_geq_mpi = + Test.make ~name:"float_bound_exclusive -1e6 >= -.pi" ~count:1000 ~print:Print.float + (Gen.float_bound_exclusive (-1e6)) (fun f -> f >= -.Float.pi) + + let float_range_1_10_leq_pi = + Test.make ~name:"float_range 1. 10. <= pi" ~count:1000 ~print:Print.float + (Gen.float_range 1. 10.) (fun f -> f <= Float.pi) + + let float_range_m10_10_square_leq_2 = + Test.make ~name:"(float_range -10. 10.)^2 <= 2." ~count:1000 ~print:Print.float + (Gen.float_range (-10.) 10.) (fun f -> f *. f <= 2.) + + let float_range_m10_m1_geq_mpi = + Test.make ~name:"float_range -10. -1. >= -.pi" ~count:1000 ~print:Print.float + (Gen.float_range (-10.) (-1.)) (fun f -> f >= -.Float.pi) + + let float_pos_lt_pi = + Test.make ~name:"float_pos < Float.pi" ~count:1000 ~print:Print.float + Gen.float_pos (fun f -> f < Float.pi) + + let float_pos_not_nan = + Test.make ~name:"float_pos is not nan" ~count:10_000 ~print:Print.float + Gen.float_pos (fun f -> not (Float.is_nan f)) + + let float_pos_not_infinite = + Test.make ~name:"float_pos is not infinity" ~count:10_000 ~print:Print.float + Gen.float_pos (fun f -> not (Float.is_infinite f)) + + let float_neg_gt_mpi = + Test.make ~name:"float_neg > Float.pi" ~count:1000 ~print:Print.float + Gen.float_neg (fun f -> f > -.Float.pi) + + let float_neg_not_nan = + Test.make ~name:"float_neg is not nan" ~count:10_000 ~print:Print.float + Gen.float_neg (fun f -> not (Float.is_nan f)) + + let float_neg_not_infinite = + Test.make ~name:"float_neg is not infinity" ~count:10_000 ~print:Print.float + Gen.float_neg (fun f -> not (Float.is_infinite f)) + + let float_exp_10_lt_pi = + Test.make ~name:"float_exp 10. < Float.pi" ~count:1000 ~print:Print.float + (Gen.float_exp 10.) (fun f -> f < Float.pi) + let char_is_never_abcdef = Test.make ~name:"char never produces 'abcdef'" ~count:1000 ~print:Print.char Gen.char (fun c -> not (List.mem c ['a';'b';'c';'d';'e';'f'])) @@ -745,6 +841,30 @@ module Shrink = struct float_leq_1em10; float_geq_m1em10; float_geq_m1e10; + float_not_nan; + float_not_infinite; + float_bound_inclusive_1e6_leq_10; + float_bound_inclusive_1e6_leq_pi; + float_bound_inclusive_1_leq_5em1; + float_bound_inclusive_1_leq_min_float; + float_bound_inclusive_m1_geq_m5em1; + float_bound_inclusive_m1e6_geq_mpi; + float_bound_exclusive_1e6_leq_10; + float_bound_exclusive_1e6_leq_pi; + float_bound_exclusive_1_leq_5em1; + float_bound_exclusive_1_leq_min_float; + float_bound_exclusive_m1_geq_m5em1; + float_bound_exclusive_m1e6_geq_mpi; + float_range_1_10_leq_pi; + float_range_m10_10_square_leq_2; + float_range_m10_m1_geq_mpi; + float_pos_lt_pi; + float_pos_not_nan; + float_pos_not_infinite; + float_neg_gt_mpi; + float_neg_not_nan; + float_neg_not_infinite; + float_exp_10_lt_pi; char_is_never_abcdef; char_printable_is_never_sign; char_numeral_is_never_less_5;