diff options
Diffstat (limited to 'lib/stdlib/test/random_iolist.erl')
-rw-r--r-- | lib/stdlib/test/random_iolist.erl | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/lib/stdlib/test/random_iolist.erl b/lib/stdlib/test/random_iolist.erl new file mode 100644 index 0000000000..4bce347d9a --- /dev/null +++ b/lib/stdlib/test/random_iolist.erl @@ -0,0 +1,195 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% +%% Generate random iolists to be used by crypto_SUITE.erl +%% + +-module(random_iolist). + +-export([run/3, run2/3, standard_seed/0, compare/3, compare2/3, + random_iolist/1]). + +run(Iter,Fun1,Fun2) -> + standard_seed(), + compare(Iter,Fun1,Fun2). + +run2(Iter,Fun1,Fun2) -> + standard_seed(), + compare2(Iter,Fun1,Fun2). + +random_byte() -> + random:uniform(256) - 1. + +random_list(0,Acc) -> + Acc; +random_list(N,Acc) -> + random_list(N-1,[random_byte() | Acc]). + +random_binary(N) -> + B = list_to_binary(random_list(N,[])), + case {random:uniform(2),size(B)} of + {2,M} when M > 1 -> + S = M-1, + <<_:3,C:S/binary,_:5>> = B, + C; + _ -> + B + end. +random_list(N) -> + random_list(N,[]). + +front() -> + case random:uniform(10) of + 10 -> + false; + _ -> + true + end. + +any_type() -> + case random:uniform(10) of + 1 -> + list; + 2 -> + binary; + 3 -> + iolist; + _ -> + byte + end. + +tail_type() -> + case random:uniform(5) of + 1 -> + list; + 2 -> + iolist; + _ -> + binary + end. + +random_length(N) -> + UpperLimit = 255, + case N of + M when M > UpperLimit -> + random:uniform(UpperLimit+1) - 1; + _ -> + random:uniform(N+1) - 1 + end. + +random_iolist(0,Acc) -> + Acc; +random_iolist(N,Acc) -> + case front() of + true -> + case any_type() of + list -> + X = random_length(N), + L = random_list(X), + random_iolist(N-X,[L|Acc]); + binary -> + X = random_length(N), + B = random_binary(X), + random_iolist(N-X,[B|Acc]); + iolist -> + X = random_length(N), + B = random_iolist(X), + random_iolist(N-X,[B|Acc]); + byte -> + C = random_byte(), + random_iolist(N-1,[C|Acc]) + end; + false -> + case tail_type() of + list -> + X = random_length(N), + L = random_list(X), + random_iolist(N-X,[Acc|L]); + binary -> + X = random_length(N), + B = random_binary(X), + random_iolist(N-X,[Acc|B]); + iolist -> + X = random_length(N), + B = random_iolist(X), + random_iolist(N-X,[Acc|B]) + end + end. + +random_iolist(N) -> + random_iolist(N,[]). + + +standard_seed() -> + random:seed(1201,855653,380975). + +do_comp(List,F1,F2) -> + X = F1(List), + Y = F2(List), + case X =:= Y of + false -> + exit({not_matching,List,X,Y}); + _ -> + true + end. + +do_comp(List,List2,F1,F2) -> + X = F1(List,List2), + Y = F2(List,List2), + case X =:= Y of + false -> + exit({not_matching,List,List2,X,Y}); + _ -> + true + end. + +compare(0,Fun1,Fun2) -> + do_comp(<<>>,Fun1,Fun2), + do_comp([],Fun1,Fun2), + do_comp([[]|<<>>],Fun1,Fun2), + do_comp([<<>>,[]|<<>>],Fun1,Fun2), + true; + +compare(N,Fun1,Fun2) -> + L = random_iolist(N), + do_comp(L,Fun1,Fun2), + compare(N-1,Fun1,Fun2). + +compare2(0,Fun1,Fun2) -> + L = random_iolist(100), + do_comp(<<>>,L,Fun1,Fun2), + do_comp(L,<<>>,Fun1,Fun2), + do_comp(<<>>,<<>>,Fun1,Fun2), + do_comp([],L,Fun1,Fun2), + do_comp(L,[],Fun1,Fun2), + do_comp([],[],Fun1,Fun2), + do_comp([[]|<<>>],L,Fun1,Fun2), + do_comp(L,[[]|<<>>],Fun1,Fun2), + do_comp([[]|<<>>],[[]|<<>>],Fun1,Fun2), + do_comp([<<>>,[]|<<>>],L,Fun1,Fun2), + do_comp(L,[<<>>,[]|<<>>],Fun1,Fun2), + do_comp([<<>>,[]|<<>>],[<<>>,[]|<<>>],Fun1,Fun2), + true; + +compare2(N,Fun1,Fun2) -> + L = random_iolist(N), + L2 = random_iolist(N), + do_comp(L,L2,Fun1,Fun2), + compare2(N-1,Fun1,Fun2). |