File 4561-Use-ct_proper_ext-generators-for-lists-property-test.patch of Package erlang
From 60118d88da8b6f40a5f7d1d50c7c8f34514a381a Mon Sep 17 00:00:00 2001
From: Maria Scott <maria-12648430@hnc-agency.org>
Date: Thu, 29 Jun 2023 15:26:51 +0200
Subject: [PATCH] Use ct_proper_ext generators for lists property tests
---
lib/stdlib/test/lists_property_test_SUITE.erl | 1 -
lib/stdlib/test/property_test/lists_prop.erl | 425 ++++++++----------
2 files changed, 192 insertions(+), 234 deletions(-)
diff --git a/lib/stdlib/test/lists_property_test_SUITE.erl b/lib/stdlib/test/lists_property_test_SUITE.erl
index ecbf14309e..71f7a0c8b9 100644
--- a/lib/stdlib/test/lists_property_test_SUITE.erl
+++ b/lib/stdlib/test/lists_property_test_SUITE.erl
@@ -112,7 +112,6 @@ init_per_suite(Config) ->
ct_property_test:init_per_suite(Config).
end_per_suite(Config) ->
- persistent_term:erase({lists_prop, random_atoms}),
Config.
do_proptest(Prop, Config) ->
diff --git a/lib/stdlib/test/property_test/lists_prop.erl b/lib/stdlib/test/property_test/lists_prop.erl
index 68c087b76d..2522a9b38b 100644
--- a/lib/stdlib/test/property_test/lists_prop.erl
+++ b/lib/stdlib/test/property_test/lists_prop.erl
@@ -19,38 +19,7 @@
%%
-module(lists_prop).
--compile([export_all, nowarn_export_all]).
-
--proptest(eqc).
--proptest([triq, proper]).
-
--ifndef(EQC).
--ifndef(PROPER).
--ifndef(TRIQ).
--define(EQC, true).
--endif.
--endif.
--endif.
-
--ifdef(EQC).
--include_lib("eqc/include/eqc.hrl").
--define(MOD_eqc,eqc).
-
--else.
--ifdef(PROPER).
--include_lib("proper/include/proper.hrl").
--define(MOD_eqc,proper).
-
--else.
--ifdef(TRIQ).
--define(MOD_eqc,triq).
--include_lib("triq/include/triq.hrl").
-
--endif.
--endif.
--endif.
-
--define(RANDOM_ATOMS, 1000).
+-include_lib("common_test/include/ct_property_test.hrl").
%%%%%%%%%%%%%%%%%%
%%% Properties %%%
@@ -60,7 +29,7 @@
prop_all_true() ->
?FORALL(
InList,
- gen_list(),
+ ct_proper_ext:safe_list(),
lists:all(fun(_) -> true end, InList)
).
@@ -69,7 +38,9 @@ prop_all_false() ->
{InList, Elem},
?LET(
{F, R, E},
- {gen_list(), gen_list(), make_ref()},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ make_ref()},
{F ++ [E|R], E}
),
not lists:all(fun(T) -> T =/= Elem end, InList)
@@ -81,7 +52,9 @@ prop_any_true() ->
{InList, Elem},
?LET(
{F, R, E},
- {gen_list(), gen_list(), make_ref()},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ make_ref()},
{F ++ [E|R], E}
),
lists:any(fun(T) -> T =:= Elem end, InList)
@@ -90,7 +63,7 @@ prop_any_true() ->
prop_any_false() ->
?FORALL(
InList,
- gen_list(),
+ ct_proper_ext:safe_list(),
not lists:any(fun(_) -> false end, InList)
).
@@ -98,7 +71,7 @@ prop_any_false() ->
prop_append_1() ->
?FORALL(
InLists,
- list(gen_list()),
+ list(ct_proper_ext:safe_list()),
check_appended(InLists, lists:append(InLists))
).
@@ -106,7 +79,7 @@ prop_append_1() ->
prop_append_2() ->
?FORALL(
{InList1, InList2},
- {gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(), ct_proper_ext:safe_list()},
lists:append(InList1, InList2) =:= InList1 ++ InList2
).
@@ -115,7 +88,7 @@ prop_concat() ->
?FORALL(
{InList, ExpString},
gen_list_fold(
- oneof([gen_atom(), number(), string()]),
+ oneof([ct_proper_ext:safe_atom(), number(), string()]),
fun
(A, Acc) when is_atom(A) -> Acc ++ atom_to_list(A);
(I, Acc) when is_integer(I) -> Acc ++ integer_to_list(I);
@@ -133,7 +106,9 @@ prop_delete() ->
{InList, DelElem},
?LET(
{F, R, E},
- {gen_list(), gen_list(), gen_any()},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_any()},
{F ++ [E|R], E}
),
begin
@@ -146,7 +121,7 @@ prop_delete() ->
prop_delete_absent() ->
?FORALL(
InList,
- gen_list(),
+ ct_proper_ext:safe_list(),
lists:delete(make_ref(), InList) =:= InList
).
@@ -154,7 +129,7 @@ prop_delete_absent() ->
prop_droplast() ->
?FORALL(
InList,
- gen_list(),
+ ct_proper_ext:safe_list(),
try
lists:droplast(InList) =:= lists:reverse(tl(lists:reverse(InList)))
catch
@@ -173,7 +148,7 @@ prop_dropwhile() ->
?LET(
{L, {_, DL}},
gen_list_fold(
- gen_any(),
+ ct_proper_ext:safe_any(),
fun(E, {Drop, Acc}) ->
case Drop andalso Fn(E) of
true -> {true, Acc};
@@ -194,7 +169,7 @@ prop_duplicate() ->
{N, Term, ExpList},
?LET(
T,
- gen_any(),
+ ct_proper_ext:safe_any(),
?LET(L, list(T), {length(L), T, L})
),
lists:duplicate(N, Term) =:= ExpList
@@ -207,7 +182,7 @@ prop_enumerate_1() ->
?LET(
{L, {_, EL}},
gen_list_fold(
- gen_any(),
+ ct_proper_ext:safe_any(),
fun(T, {I, Acc}) ->
{I + 1, Acc ++ [{I, T}]}
end,
@@ -228,7 +203,7 @@ prop_enumerate_2() ->
?LET(
{L, {_, EL}},
gen_list_fold(
- gen_any(),
+ ct_proper_ext:safe_any(),
fun(T, {I, Acc}) ->
{I + 1, Acc ++ [{I, T}]}
end,
@@ -250,7 +225,7 @@ prop_enumerate_3() ->
?LET(
{L, {_, EL}},
gen_list_fold(
- gen_any(),
+ ct_proper_ext:safe_any(),
fun(T, {I, Acc}) ->
{I + S, Acc ++ [{I, T}]}
end,
@@ -272,7 +247,7 @@ prop_filter() ->
?LET(
{L, F},
gen_list_fold(
- gen_any(),
+ ct_proper_ext:safe_any(),
fun(T, Acc) ->
case P(T) of
true -> Acc ++ [T];
@@ -293,11 +268,11 @@ prop_filtermap() ->
{FilterMapFn, InList, ExpList},
?LET(
Fn,
- function1(oneof([true, false, {true, gen_any()}])),
+ function1(oneof([true, false, {true, ct_proper_ext:safe_any()}])),
?LET(
{L, FM},
gen_list_fold(
- gen_any(),
+ ct_proper_ext:safe_any(),
fun(T, Acc) ->
case Fn(T) of
false -> Acc;
@@ -327,11 +302,11 @@ prop_flatmap() ->
{MapFn, InList, ExpList},
?LET(
Fn,
- function1(gen_list()),
+ function1(ct_proper_ext:safe_list()),
?LET(
{L, FlatMapped},
gen_list_fold(
- gen_any(),
+ ct_proper_ext:safe_any(),
fun(T, Acc) ->
Acc ++ Fn(T)
end,
@@ -355,7 +330,8 @@ prop_flatten_1() ->
prop_flatten_2() ->
?FORALL(
{{DeepList, FlatList}, Tail},
- {gen_list_deepfold(fun(_, E, Acc) -> Acc ++ [E] end, []), gen_list()},
+ {gen_list_deepfold(fun(_, E, Acc) -> Acc ++ [E] end, []),
+ ct_proper_ext:safe_list()},
lists:flatten(DeepList, Tail) =:= FlatList ++ Tail
).
@@ -365,10 +341,10 @@ prop_foldl() ->
{FoldFn, InList, Acc0, Exp},
?LET(
{Fn, Acc0},
- {function2(gen_any()), gen_any()},
+ {function2(ct_proper_ext:safe_any()), ct_proper_ext:safe_any()},
?LET(
{L, V},
- gen_list_fold(gen_any(), Fn, Acc0),
+ gen_list_fold(ct_proper_ext:safe_any(), Fn, Acc0),
{Fn, L, Acc0, V}
)
),
@@ -381,10 +357,10 @@ prop_foldr() ->
{FoldFn, InList, Acc0, Exp},
?LET(
{Fn, Acc0},
- {function2(gen_any()), gen_any()},
+ {function2(ct_proper_ext:safe_any()), ct_proper_ext:safe_any()},
?LET(
{L, V},
- gen_list_fold(gen_any(), Fn, Acc0),
+ gen_list_fold(ct_proper_ext:safe_any(), Fn, Acc0),
{Fn, lists:reverse(L), Acc0, V}
)
),
@@ -395,7 +371,7 @@ prop_foldr() ->
prop_foreach() ->
?FORALL(
InList,
- gen_list(),
+ ct_proper_ext:safe_list(),
begin
Tag = make_ref(),
lists:foreach(fun(E) -> self() ! {Tag, E} end, InList),
@@ -407,7 +383,7 @@ prop_foreach() ->
prop_join() ->
?FORALL(
{Sep, InList},
- {gen_any(), gen_list()},
+ {ct_proper_ext:safe_any(), ct_proper_ext:safe_list()},
check_joined(Sep, InList, lists:join(Sep, InList))
).
@@ -417,10 +393,12 @@ prop_keydelete() ->
{Key, N, InList},
?LET(
{K, N},
- {gen_any(), range(1, 5)},
+ {ct_proper_ext:safe_any(), range(1, 5)},
?LET(
{F, R, E},
- {gen_list(), gen_list(), gen_keytuple(K, N, N + 3)},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ gen_keytuple(K, N, N + 3)},
{K, N, F ++ [E|R]}
)
),
@@ -434,7 +412,7 @@ prop_keydelete() ->
prop_keydelete_absent() ->
?FORALL(
{N, InList},
- {pos_integer(), gen_list()},
+ {pos_integer(), ct_proper_ext:safe_list()},
lists:keydelete(make_ref(), N, InList) =:= InList
).
@@ -444,10 +422,12 @@ prop_keyfind() ->
{Key, N, InList},
?LET(
{K, N},
- {gen_any(), range(1, 5)},
+ {ct_proper_ext:safe_any(), range(1, 5)},
?LET(
{F, R, E},
- {gen_list(), gen_list(), gen_keytuple(K, N, N + 3)},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ gen_keytuple(K, N, N + 3)},
{K, N, F ++ [E|R]}
)
),
@@ -462,7 +442,7 @@ prop_keyfind() ->
prop_keyfind_absent() ->
?FORALL(
{N, InList},
- {pos_integer(), gen_list()},
+ {pos_integer(), ct_proper_ext:safe_list()},
not lists:keyfind(make_ref(), N, InList)
).
@@ -472,7 +452,7 @@ prop_keymap() ->
{MapFn, N, InList, ExpList},
?LET(
Fn,
- function([gen_any()], gen_any()),
+ function([ct_proper_ext:safe_any()], ct_proper_ext:safe_any()),
?LET(
N,
range(1, 5),
@@ -498,10 +478,12 @@ prop_keymember() ->
{Key, N, InList},
?LET(
{K, N},
- {gen_any(), range(1, 5)},
+ {ct_proper_ext:safe_any(), range(1, 5)},
?LET(
{F, R, E},
- {gen_list(), gen_list(), gen_keytuple(K, N, N + 3)},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ gen_keytuple(K, N, N + 3)},
{K, N, F ++ [E|R]}
)
),
@@ -511,7 +493,7 @@ prop_keymember() ->
prop_keymember_absent() ->
?FORALL(
{N, InList},
- {pos_integer(), gen_list()},
+ {pos_integer(), ct_proper_ext:safe_list()},
not lists:keymember(make_ref(), N, InList)
).
@@ -558,10 +540,13 @@ prop_keyreplace() ->
{Key, N, InList, Replacement},
?LET(
{K, N},
- {gen_any(), range(1, 5)},
+ {ct_proper_ext:safe_any(), range(1, 5)},
?LET(
{F, R, E0, E1},
- {gen_list(), gen_list(), gen_keytuple(K, N, N + 3), gen_tuple()},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ gen_keytuple(K, N, N + 3),
+ gen_tuple()},
{K, N, F ++ [E0|R], E1}
)
),
@@ -571,7 +556,7 @@ prop_keyreplace() ->
prop_keyreplace_absent() ->
?FORALL(
{N, InList, Replacement},
- {pos_integer(), gen_list(), gen_tuple()},
+ {pos_integer(), ct_proper_ext:safe_list(), gen_tuple()},
lists:keyreplace(make_ref(), N, InList, Replacement) =:= InList
).
@@ -581,10 +566,12 @@ prop_keysearch() ->
{Key, N, InList},
?LET(
{K, N},
- {gen_any(), range(1, 5)},
+ {ct_proper_ext:safe_any(), range(1, 5)},
?LET(
{F, R, E},
- {gen_list(), gen_list(), gen_keytuple(K, N, N + 3)},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ gen_keytuple(K, N, N + 3)},
{K, N, F ++ [E|R]}
)
),
@@ -599,7 +586,7 @@ prop_keysearch() ->
prop_keysearch_absent() ->
?FORALL(
{N, InList},
- {pos_integer(), gen_list()},
+ {pos_integer(), ct_proper_ext:safe_list()},
not lists:keysearch(make_ref(), N, InList)
).
@@ -625,10 +612,13 @@ prop_keystore() ->
{Key, N, InList, ToStore},
?LET(
{K, N},
- {gen_any(), range(1, 5)},
+ {ct_proper_ext:safe_any(), range(1, 5)},
?LET(
{F, R, E0, E1},
- {gen_list(), gen_list(), gen_keytuple(K, N, N + 3), gen_tuple()},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ gen_keytuple(K, N, N + 3),
+ gen_tuple()},
{K, N, F ++ [E0|R], E1}
)
),
@@ -638,7 +628,7 @@ prop_keystore() ->
prop_keystore_absent() ->
?FORALL(
{N, InList, ToStore},
- {pos_integer(), gen_list(), gen_tuple()},
+ {pos_integer(), ct_proper_ext:safe_list(), gen_tuple()},
lists:keystore(make_ref(), N, InList, ToStore) =:= InList ++ [ToStore]
).
@@ -651,7 +641,9 @@ prop_keytake() ->
{make_ref(), range(1, 5)},
?LET(
{F, R, E},
- {gen_list(), gen_list(), gen_keytuple(K, N, N + 3)},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ gen_keytuple(K, N, N + 3)},
{K, N, F ++ [E|R], F ++ R, E}
)
),
@@ -661,7 +653,7 @@ prop_keytake() ->
prop_keytake_absent() ->
?FORALL(
{N, InList},
- {pos_integer(), gen_list()},
+ {pos_integer(), ct_proper_ext:safe_list()},
lists:keytake(make_ref(), N, InList) =:= false
).
@@ -669,7 +661,7 @@ prop_keytake_absent() ->
prop_last() ->
?FORALL(
InList,
- gen_list(),
+ ct_proper_ext:safe_list(),
try
lists:last(InList) =:= hd(lists:reverse(InList))
catch
@@ -684,11 +676,11 @@ prop_map() ->
{MapFn, InList, ExpList},
?LET(
Fn,
- function1(gen_any()),
+ function1(ct_proper_ext:safe_any()),
?LET(
{L, M},
gen_list_fold(
- gen_any(),
+ ct_proper_ext:safe_any(),
fun(T, Acc) ->
Acc ++ [Fn(T)]
end,
@@ -706,11 +698,13 @@ prop_mapfoldl() ->
{MapFoldFn, InList, Acc0, Exp},
?LET(
{MapFn, FoldFn, Acc0},
- {function1(gen_any()), function2(gen_any()), gen_any()},
+ {function1(ct_proper_ext:safe_any()),
+ function2(ct_proper_ext:safe_any()),
+ ct_proper_ext:safe_any()},
?LET(
{L, MV},
gen_list_fold(
- gen_any(),
+ ct_proper_ext:safe_any(),
fun(T, {AccM, AccF}) ->
{AccM ++ [MapFn(T)], FoldFn(T, AccF)}
end,
@@ -728,11 +722,13 @@ prop_mapfoldr() ->
{MapFoldFn, InList, Acc0, Exp},
?LET(
{MapFn, FoldFn, Acc0},
- {function1(gen_any()), function2(gen_any()), gen_any()},
+ {function1(ct_proper_ext:safe_any()),
+ function2(ct_proper_ext:safe_any()),
+ ct_proper_ext:safe_any()},
?LET(
{L, MV},
gen_list_fold(
- gen_any(),
+ ct_proper_ext:safe_any(),
fun(T, {AccM, AccF}) ->
{[MapFn(T)|AccM], FoldFn(T, AccF)}
end,
@@ -748,7 +744,7 @@ prop_mapfoldr() ->
prop_max() ->
?FORALL(
{InList, ExpMax},
- gen_list_fold(gen_any(), fun erlang:max/2),
+ gen_list_fold(ct_proper_ext:safe_any(), fun erlang:max/2),
try
lists:max(InList) == ExpMax
catch
@@ -763,7 +759,9 @@ prop_member() ->
{InList, Member},
?LET(
{F, R, E},
- {gen_list(), gen_list(), gen_any()},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_any()},
{F ++ [E|R], E}
),
lists:member(Member, InList)
@@ -772,7 +770,7 @@ prop_member() ->
prop_member_absent() ->
?FORALL(
InList,
- gen_list(),
+ ct_proper_ext:safe_list(),
not lists:member(make_ref(), InList)
).
@@ -780,7 +778,7 @@ prop_member_absent() ->
prop_merge_1() ->
?FORALL(
InLists,
- list(?LET(L, gen_list(), lists:sort(L))),
+ list(?LET(L, ct_proper_ext:safe_list(), lists:sort(L))),
check_merged(fun erlang:'=<'/2, InLists, lists:merge(InLists))
).
@@ -789,7 +787,9 @@ prop_merge_1_invalid() ->
InLists,
?LET(
{L1, X, L2},
- {list(oneof([non_list(), gen_list()])), non_list(), list(oneof([non_list(), gen_list()]))},
+ {list(oneof([non_list(), ct_proper_ext:safe_list()])),
+ non_list(),
+ list(oneof([non_list(), ct_proper_ext:safe_list()]))},
L1 ++ [X|L2]
),
expect_error(fun lists:merge/1, [InLists])
@@ -801,7 +801,7 @@ prop_merge_2() ->
{InList1, InList2},
?LET(
{L1, L2},
- {gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(), ct_proper_ext:safe_list()},
{lists:sort(L1), lists:sort(L2)}
),
check_merged(fun erlang:'=<'/2, [InList1, InList2], lists:merge(InList1, InList2))
@@ -810,7 +810,7 @@ prop_merge_2() ->
prop_merge_2_invalid() ->
?FORALL(
{InList, X, Y},
- {gen_list(), non_list(), non_list()},
+ {ct_proper_ext:safe_list(), non_list(), non_list()},
expect_error(fun lists:merge/2, [InList, X]) andalso
expect_error(fun lists:merge/2, [X, InList]) andalso
expect_error(fun lists:merge/2, [X, Y])
@@ -822,7 +822,9 @@ prop_merge_3() ->
{SortFn, InList1, InList2},
?LET(
{Fn, L1, L2},
- {gen_ordering_fun(), gen_list(), gen_list()},
+ {gen_ordering_fun(),
+ ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list()},
{Fn, lists:sort(Fn, L1), lists:sort(Fn, L2)}
),
check_merged(SortFn, [InList1, InList2], lists:merge(SortFn, InList1, InList2))
@@ -831,7 +833,10 @@ prop_merge_3() ->
prop_merge_3_invalid() ->
?FORALL(
{SortFn, InList, X, Y},
- {gen_ordering_fun(), gen_list(), non_list(), non_list()},
+ {gen_ordering_fun(),
+ ct_proper_ext:safe_list(),
+ non_list(),
+ non_list()},
expect_error(fun lists:merge/3, [SortFn, InList, Y]) andalso
expect_error(fun lists:merge/3, [SortFn, X, InList]) andalso
expect_error(fun lists:merge/3, [SortFn, X, Y])
@@ -843,7 +848,9 @@ prop_merge3() ->
{InList1, InList2, InList3},
?LET(
{L1, L2, L3},
- {gen_list(), gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list()},
{lists:sort(L1), lists:sort(L2), lists:sort(L3)}
),
check_merged(fun erlang:'=<'/2, [InList1, InList2, InList3], lists:merge3(InList1, InList2, InList3))
@@ -852,7 +859,7 @@ prop_merge3() ->
prop_merge3_invalid() ->
?FORALL(
{InList, X, Y, Z},
- {gen_list(), non_list(), non_list(), non_list()},
+ {ct_proper_ext:safe_list(), non_list(), non_list(), non_list()},
expect_error(fun lists:merge/3, [InList, InList, Z]) andalso
expect_error(fun lists:merge/3, [InList, Y, InList]) andalso
expect_error(fun lists:merge/3, [InList, Y, Z]) andalso
@@ -865,7 +872,7 @@ prop_merge3_invalid() ->
prop_min() ->
?FORALL(
{InList, ExpMin},
- gen_list_fold(gen_any(), fun erlang:min/2),
+ gen_list_fold(ct_proper_ext:safe_any(), fun erlang:min/2),
try
lists:min(InList) == ExpMin
catch
@@ -880,7 +887,9 @@ prop_nth() ->
{InList, N, ExpElem},
?LET(
{F, R, E},
- {gen_list(), gen_list(), gen_any()},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_any()},
{F ++ [E|R], length(F)+1, E}
),
lists:nth(N, InList) =:= ExpElem
@@ -891,7 +900,7 @@ prop_nth_outofrange() ->
{N, InList},
?LET(
{L, Offset},
- {gen_list(), pos_integer()},
+ {ct_proper_ext:safe_list(), pos_integer()},
{length(L) + Offset, L}
),
try
@@ -911,7 +920,7 @@ prop_nthtail() ->
{InList, N, ExpTail},
?LET(
{F, R},
- {gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(), ct_proper_ext:safe_list()},
{F ++ R, length(F), R}
),
lists:nthtail(N, InList) =:= ExpTail
@@ -922,7 +931,7 @@ prop_nthtail_outofrange() ->
{N, InList},
?LET(
{L, Offset},
- {gen_list(), pos_integer()},
+ {ct_proper_ext:safe_list(), pos_integer()},
{length(L) + Offset, L}
),
try
@@ -940,7 +949,7 @@ prop_nthtail_outofrange() ->
prop_partition() ->
?FORALL(
{Pred, InList},
- {function1(boolean()), gen_list()},
+ {function1(boolean()), ct_proper_ext:safe_list()},
begin
{Group1, Group2} = lists:partition(Pred, InList),
check_partitioned(Pred, InList, Group1, Group2)
@@ -953,7 +962,7 @@ prop_prefix() ->
{InList, Prefix},
?LET(
{F, R},
- {gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(), ct_proper_ext:safe_list()},
{F ++ R, F}
),
lists:prefix(Prefix, InList) andalso
@@ -966,7 +975,7 @@ prop_prefix() ->
prop_reverse_1() ->
?FORALL(
InList,
- gen_list(),
+ ct_proper_ext:safe_list(),
check_reversed(InList, lists:reverse(InList)) andalso
lists:reverse(lists:reverse(InList)) =:= InList
).
@@ -975,7 +984,7 @@ prop_reverse_1() ->
prop_reverse_2() ->
?FORALL(
{InList, InTail},
- {gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(), ct_proper_ext:safe_list()},
check_reversed(InList, lists:reverse(InList, InTail), InTail)
).
@@ -985,7 +994,9 @@ prop_search() ->
{Pred, InList, ExpElem},
?LET(
{F, R, E},
- {gen_list(), gen_list(), make_ref()},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ make_ref()},
{fun(T) -> T =:= E end, F ++ [E|R], E}
),
lists:search(Pred, InList) =:= {value, ExpElem}
@@ -994,7 +1005,7 @@ prop_search() ->
prop_search_absent() ->
?FORALL(
InList,
- gen_list(),
+ ct_proper_ext:safe_list(),
lists:search(fun(_) -> false end, InList) =:= false
).
@@ -1046,7 +1057,7 @@ prop_seq3() ->
prop_sort_1() ->
?FORALL(
InList,
- gen_list(),
+ ct_proper_ext:safe_list(),
begin
Sorted = lists:sort(InList),
length(Sorted) =:= length(InList) andalso
@@ -1058,7 +1069,7 @@ prop_sort_1() ->
prop_sort_2() ->
?FORALL(
{SortFn, InList},
- {gen_ordering_fun(), gen_list()},
+ {gen_ordering_fun(), ct_proper_ext:safe_list()},
begin
Sorted = lists:sort(SortFn, InList),
length(Sorted) =:= length(InList) andalso
@@ -1072,7 +1083,7 @@ prop_split() ->
{N, InList, ExpList1, ExpList2},
?LET(
{F, R},
- {gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(), ct_proper_ext:safe_list()},
{length(F), F ++ R, F, R}
),
lists:split(N, InList) =:= {ExpList1, ExpList2}
@@ -1083,7 +1094,7 @@ prop_split_outofrange() ->
{N, InList},
?LET(
{L, Offset},
- {gen_list(), pos_integer()},
+ {ct_proper_ext:safe_list(), pos_integer()},
{length(L) + Offset, L}
),
try
@@ -1101,7 +1112,7 @@ prop_split_outofrange() ->
prop_splitwith() ->
?FORALL(
{Pred, InList},
- {function1(boolean()), gen_list()},
+ {function1(boolean()), ct_proper_ext:safe_list()},
begin
{Part1, Part2} = lists:splitwith(Pred, InList),
check_splitwithed(Pred, InList, Part1, Part2)
@@ -1114,7 +1125,7 @@ prop_sublist_2() ->
{Len, InList, ExpList},
?LET(
{F, R},
- {gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(), ct_proper_ext:safe_list()},
{length(F), F ++ R, F}
),
lists:sublist(InList, Len) =:= ExpList
@@ -1126,7 +1137,9 @@ prop_sublist_3() ->
{Start, Len, InList, ExpList},
?LET(
{F, M, R},
- {gen_list(), gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list()},
{length(F)+1, length(M), F ++ M ++ R, M}
),
lists:sublist(InList, Start, Len) =:= ExpList
@@ -1138,7 +1151,9 @@ prop_subtract() ->
{InList, SubtractList},
?LET(
{L, B, S},
- {gen_list(), gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list()},
{L ++ B, S ++ B}
),
lists:subtract(InList, SubtractList) =:= InList -- SubtractList
@@ -1150,7 +1165,7 @@ prop_suffix() ->
{InList, Suffix},
?LET(
{F, R},
- {gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(), ct_proper_ext:safe_list()},
{F ++ R, R}
),
lists:suffix(Suffix, InList) andalso
@@ -1177,7 +1192,7 @@ prop_takewhile() ->
?LET(
{L, {_, TL}},
gen_list_fold(
- gen_any(),
+ ct_proper_ext:safe_any(),
fun(E, {Take, Acc}) ->
case Take andalso Fn(E) of
true -> {true, Acc ++ [E]};
@@ -1249,7 +1264,7 @@ prop_ukeysort() ->
prop_umerge_1() ->
?FORALL(
InLists,
- list(?LET(L, gen_list(), lists:usort(L))),
+ list(?LET(L, ct_proper_ext:safe_list(), lists:usort(L))),
check_umerged(InLists, lists:umerge(InLists))
).
@@ -1258,7 +1273,9 @@ prop_umerge_1_invalid() ->
InList,
?LET(
{L1, X, L2},
- {list(oneof([non_list(), gen_list()])), non_list(), list(oneof([non_list(), gen_list()]))},
+ {list(oneof([non_list(), ct_proper_ext:safe_list()])),
+ non_list(),
+ list(oneof([non_list(), ct_proper_ext:safe_list()]))},
L1 ++ [X|L2]
),
expect_error(fun lists:umerge/1, [InList])
@@ -1270,7 +1287,7 @@ prop_umerge_2() ->
{InList1, InList2},
?LET(
{L1, L2},
- {gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(), ct_proper_ext:safe_list()},
{lists:usort(L1), lists:usort(L2)}
),
check_umerged([InList1, InList2], lists:umerge(InList1, InList2))
@@ -1279,7 +1296,7 @@ prop_umerge_2() ->
prop_umerge_2_invalid() ->
?FORALL(
{InList, X, Y},
- {gen_list(), non_list(), non_list()},
+ {ct_proper_ext:safe_list(), non_list(), non_list()},
expect_error(fun lists:umerge/2, [InList, Y]) andalso
expect_error(fun lists:umerge/2, [X, InList]) andalso
expect_error(fun lists:umerge/2, [X, Y])
@@ -1291,7 +1308,9 @@ prop_umerge_3() ->
{SortFn, InList1, InList2},
?LET(
{Fn, L1, L2},
- {gen_ordering_fun(), gen_list(), gen_list()},
+ {gen_ordering_fun(),
+ ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list()},
{Fn, lists:usort(Fn, L1), lists:usort(Fn, L2)}
),
check_umerged(SortFn, [InList1, InList2], lists:umerge(SortFn, InList1, InList2))
@@ -1300,7 +1319,10 @@ prop_umerge_3() ->
prop_umerge_3_invalid() ->
?FORALL(
{SortFn, InList, X, Y},
- {gen_ordering_fun(), gen_list(), non_list(), non_list()},
+ {gen_ordering_fun(),
+ ct_proper_ext:safe_list(),
+ non_list(),
+ non_list()},
expect_error(fun lists:umerge/3, [SortFn, InList, Y]) andalso
expect_error(fun lists:umerge/3, [SortFn, X, InList]) andalso
expect_error(fun lists:umerge/3, [SortFn, X, Y])
@@ -1312,7 +1334,9 @@ prop_umerge3() ->
{InList1, InList2, InList3},
?LET(
{L1, L2, L3},
- {gen_list(), gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list(),
+ ct_proper_ext:safe_list()},
{lists:usort(L1), lists:usort(L2), lists:usort(L3)}
),
check_umerged([InList1, InList2, InList3], lists:umerge3(InList1, InList2, InList3))
@@ -1321,7 +1345,7 @@ prop_umerge3() ->
prop_umerge3_invalid() ->
?FORALL(
{InList, X, Y, Z},
- {gen_list(), non_list(), non_list(), non_list()},
+ {ct_proper_ext:safe_list(), non_list(), non_list(), non_list()},
expect_error(fun lists:umerge3/3, [InList, InList, Z]) andalso
expect_error(fun lists:umerge3/3, [InList, Y, InList]) andalso
expect_error(fun lists:umerge3/3, [InList, Y, Z]) andalso
@@ -1337,7 +1361,7 @@ prop_uniq_1() ->
InList,
?LET(
{L, M},
- {gen_list(), gen_list()},
+ {ct_proper_ext:safe_list(), ct_proper_ext:safe_list()},
?LET(
S,
vector(length(L) + 2 * length(M), integer()),
@@ -1351,7 +1375,7 @@ prop_uniq_1() ->
prop_uniq_2() ->
?FORALL(
{UniqFn, InList},
- {function1(oneof([a, b, c])), gen_list()},
+ {function1(oneof([a, b, c])), ct_proper_ext:safe_list()},
check_uniqed(UniqFn, InList, lists:uniq(UniqFn, InList))
).
@@ -1360,7 +1384,7 @@ prop_unzip() ->
?FORALL(
{InList, {ExpList1, ExpList2}},
gen_list_fold(
- {gen_any(), gen_any()},
+ {ct_proper_ext:safe_any(), ct_proper_ext:safe_any()},
fun({T1, T2}, {L1, L2}) ->
{L1 ++ [T1], L2 ++ [T2]}
end,
@@ -1374,7 +1398,9 @@ prop_unzip3() ->
?FORALL(
{InList, {ExpList1, ExpList2, ExpList3}},
gen_list_fold(
- {gen_any(), gen_any(), gen_any()},
+ {ct_proper_ext:safe_any(),
+ ct_proper_ext:safe_any(),
+ ct_proper_ext:safe_any()},
fun({T1, T2, T3}, {L1, L2, L3}) ->
{L1 ++ [T1], L2 ++ [T2], L3 ++ [T3]}
end,
@@ -1387,7 +1413,7 @@ prop_unzip3() ->
prop_usort_1() ->
?FORALL(
InList,
- gen_list(),
+ ct_proper_ext:safe_list(),
begin
Sorted = lists:usort(InList),
length(Sorted) =< length(InList) andalso
@@ -1399,7 +1425,7 @@ prop_usort_1() ->
prop_usort_2() ->
?FORALL(
{SortFn, InList},
- {gen_ordering_fun(), gen_list()},
+ {gen_ordering_fun(), ct_proper_ext:safe_list()},
begin
Sorted = lists:usort(SortFn, InList),
length(Sorted) =< length(InList) andalso
@@ -1412,7 +1438,7 @@ prop_zip_2() ->
?FORALL(
{ExpList, {InList1, InList2}},
gen_list_fold(
- {gen_any(), gen_any()},
+ {ct_proper_ext:safe_any(), ct_proper_ext:safe_any()},
fun({T1, T2}, {L1, L2}) ->
{L1 ++ [T1], L2 ++ [T2]}
end,
@@ -1427,13 +1453,13 @@ prop_zip_3() ->
{{ExpList, {InList1, InList2}}, ExtraList},
{
gen_list_fold(
- {gen_any(), gen_any()},
+ {ct_proper_ext:safe_any(), ct_proper_ext:safe_any()},
fun({T1, T2}, {L1, L2}) ->
{L1 ++ [T1], L2 ++ [T2]}
end,
{[], []}
),
- non_empty(gen_list())
+ non_empty(ct_proper_ext:safe_list())
},
begin
Tag = make_ref(),
@@ -1462,7 +1488,9 @@ prop_zip3_3() ->
?FORALL(
{ExpList, {InList1, InList2, InList3}},
gen_list_fold(
- {gen_any(), gen_any(), gen_any()},
+ {ct_proper_ext:safe_any(),
+ ct_proper_ext:safe_any(),
+ ct_proper_ext:safe_any()},
fun({T1, T2, T3}, {L1, L2, L3}) ->
{L1 ++ [T1], L2 ++ [T2], L3 ++ [T3]}
end,
@@ -1477,13 +1505,15 @@ prop_zip3_4() ->
{{ExpList, {InList1, InList2, InList3}}, ExtraList},
{
gen_list_fold(
- {gen_any(), gen_any(), gen_any()},
+ {ct_proper_ext:safe_any(),
+ ct_proper_ext:safe_any(),
+ ct_proper_ext:safe_any()},
fun({T1, T2, T3}, {L1, L2, L3}) ->
{L1 ++ [T1], L2 ++ [T2], L3 ++ [T3]}
end,
{[], [], []}
),
- non_empty(gen_list())
+ non_empty(ct_proper_ext:safe_list())
},
begin
Tag = make_ref(),
@@ -1529,11 +1559,11 @@ prop_zipwith_3() ->
{ZipFn, InList1, InList2, ExpList},
?LET(
Fn,
- function2(gen_any()),
+ function2(ct_proper_ext:safe_any()),
?LET(
{_, {L1, L2, Z}},
gen_list_fold(
- {gen_any(), gen_any()},
+ {ct_proper_ext:safe_any(), ct_proper_ext:safe_any()},
fun({T1, T2}, {L1, L2, Z}) ->
{L1 ++ [T1], L2 ++ [T2], Z ++ [Fn(T1, T2)]}
end,
@@ -1551,11 +1581,12 @@ prop_zipwith_4() ->
{ZipFn, InList1, InList2, ExpList, ExtraList},
?LET(
{Extra, Fn},
- {non_empty(gen_list()), function2(gen_any())},
+ {non_empty(ct_proper_ext:safe_list()),
+ function2(ct_proper_ext:safe_any())},
?LET(
{_, {L1, L2, Z}},
gen_list_fold(
- {gen_any(), gen_any()},
+ {ct_proper_ext:safe_any(), ct_proper_ext:safe_any()},
fun({T1, T2}, {L1, L2, Z}) ->
{L1 ++ [T1], L2 ++ [T2], Z ++ [Fn(T1, T2)]}
end,
@@ -1592,11 +1623,13 @@ prop_zipwith3_4() ->
{ZipFn, InList1, InList2, InList3, ExpList},
?LET(
Fn,
- function3(gen_any()),
+ function3(ct_proper_ext:safe_any()),
?LET(
{_, {L1, L2, L3, Z}},
gen_list_fold(
- {gen_any(), gen_any(), gen_any()},
+ {ct_proper_ext:safe_any(),
+ ct_proper_ext:safe_any(),
+ ct_proper_ext:safe_any()},
fun({T1, T2, T3}, {L1, L2, L3, Z}) ->
{L1 ++ [T1], L2 ++ [T2], L3 ++ [T3], Z ++ [Fn(T1, T2, T3)]}
end,
@@ -1614,11 +1647,14 @@ prop_zipwith3_5() ->
{ZipFn, InList1, InList2, InList3, ExpList, ExtraList},
?LET(
{Extra, Fn},
- {non_empty(gen_list()), function3(gen_any())},
+ {non_empty(ct_proper_ext:safe_list()),
+ function3(ct_proper_ext:safe_any())},
?LET(
{_, {L1, L2, L3, Z}},
gen_list_fold(
- {gen_any(), gen_any(), gen_any()},
+ {ct_proper_ext:safe_any(),
+ ct_proper_ext:safe_any(),
+ ct_proper_ext:safe_any()},
fun({T1, T2, T3}, {L1, L2, L3, Z}) ->
{L1 ++ [T1], L2 ++ [T2], L3 ++ [T3], Z ++ [Fn(T1, T2, T3)]}
end,
@@ -1670,7 +1706,7 @@ prop_zipwith3_5() ->
%%%%%%%%%%%%%%%%%%
non_list() ->
- ?SUCHTHAT(NonList, gen_any(), not is_list(NonList)).
+ ?SUCHTHAT(NonList, ct_proper_ext:safe_any(), not is_list(NonList)).
%% Generator for lists of the given type, folding the given function
%% over values on the top level as they are generated. The first generated
@@ -1723,17 +1759,13 @@ gen_keytuple(Key, MinSize, MaxSize) ->
%% Generator for tuples of random size.
gen_tuple() ->
- ?LET(
- N,
- non_neg_integer(),
- gen_tuple(N)
- ).
+ ct_proper_ext:safe_tuple().
%% Generator for tuples of the given size.
gen_tuple(Size) ->
?LET(
V,
- vector(Size, gen_any()),
+ vector(Size, ct_proper_ext:safe_any()),
list_to_tuple(V)
).
@@ -1745,15 +1777,11 @@ gen_tuple(MinSize, MaxSize) ->
range(MinSize, MaxSize),
?LET(
V,
- vector(N, gen_any()),
+ vector(N, ct_proper_ext:safe_any()),
list_to_tuple(V)
)
).
-%% Generator for lists of anything.
-gen_list() ->
- list(gen_any()).
-
%% Generator for lists of anything, folding the given function
%% over values on all levels of list-nesting as they are generated.
gen_list_deepfold(FoldFn, Acc0) ->
@@ -1772,9 +1800,12 @@ gen_list_deepfold(N, Level, L, FoldFn, Acc) ->
?LET(
X,
frequency([
- {4, {term, gen_any_simple()}},
+ {5, {term, oneof([ct_proper_ext:safe_atom(),
+ ct_proper_ext:safe_tuple(),
+ integer(),
+ float(),
+ bitstring()])}},
{1, deeplist},
- {1, tuple},
{2, stop}
]),
case X of
@@ -1784,15 +1815,6 @@ gen_list_deepfold(N, Level, L, FoldFn, Acc) ->
gen_list_deepfold(N, Level + 1, [], FoldFn, Acc),
gen_list_deepfold(N1, Level, [L1|L], FoldFn, Acc1)
);
- tuple ->
- ?LET(
- {N1, L1, _},
- gen_list_deepfold(N, Level + 1, [], fun(_, _, _) -> undefined end, undefined),
- begin
- E = list_to_tuple(L1),
- gen_list_deepfold(N1, Level, [E|L], FoldFn, FoldFn(Level, E, Acc))
- end
- );
stop ->
{N, lists:reverse(L), Acc};
{term, E} ->
@@ -1800,69 +1822,6 @@ gen_list_deepfold(N, Level, L, FoldFn, Acc) ->
end
).
-%% Generator for simple and composite (lists and tuples) types.
-gen_any() ->
- frequency(
- [
- {4, gen_any_simple()},
- {1, ?LET({L, _}, gen_list_deepfold(fun(_, _, Acc) -> Acc end, undefined), L)},
- {1, ?LET({L, _}, gen_list_deepfold(fun(_, _, Acc) -> Acc end, undefined), list_to_tuple(L))}
- ]
- ).
-
-%% Generator for simple types:
-%% - atoms
-%% - integers
-%% - floats
-%% - bitstrings
-gen_any_simple() ->
- oneof([gen_atom(), integer(), float(), bitstring()]).
-
-%% Generator for interesting atoms:
-%% - well-known atoms like `ok', `undefined', `infinity'...
-%% - randomly generated "weird" atoms
-gen_atom() ->
- oneof(
- [
- oneof([ok, error, true, false, undefined, infinity]),
- oneof(['', '"', '\'', '(', ')', '()', '[', '[', '[]', '{', '}', '{}']),
- gen_random_atom()
- ]
- ).
-
-%% Generator for a limited set of random atoms. The number of
-%% atoms that will be generated is set in `?RANDOM_ATOMS'.
-gen_random_atom() ->
- ?LAZY(
- ?LET(
- N,
- range(1, ?RANDOM_ATOMS),
- try
- persistent_term:get({?MODULE, random_atoms})
- of
- Atoms ->
- maps:get(N, Atoms)
- catch
- error:badarg ->
- ?LET(
- AtomsList,
- vector(?RANDOM_ATOMS, ?SIZED(Size, resize(Size * 100, atom()))),
- begin
- Fn = fun
- F(_, [], Acc) ->
- Acc;
- F(Index, [A|As], Acc) ->
- F(Index + 1, As, Acc#{Index => A})
- end,
- Atoms = Fn(1, AtomsList, #{}),
- persistent_term:put({?MODULE, random_atoms}, Atoms),
- maps:get(N, Atoms)
- end
- )
- end
- )
- ).
-
%% Generator for ordering functions, to be used for sorting and merging.
%% The generated ordering functions are designed to fulfill the requirements given
%% at the top of the `lists' documentation, namely to be antisymmetric, transitive,
--
2.35.3