%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2000-2011. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
-module(random_SUITE).
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_testcase/2, end_per_testcase/2,
init_per_group/2,end_per_group/2]).
-export([interval_1/1, seed0/1, seed/1]).
-include_lib("common_test/include/ct.hrl").
init_per_testcase(_Case, Config) ->
Config.
end_per_testcase(_Case, _Config) ->
ok.
suite() ->
[{ct_hooks,[ts_install_cth]},
{timetrap,{minutes,1}}].
all() ->
[interval_1, seed0, seed].
groups() ->
[].
init_per_suite(Config) ->
Config.
end_per_suite(_Config) ->
ok.
init_per_group(_GroupName, Config) ->
Config.
end_per_group(_GroupName, Config) ->
Config.
%% Test that seed is set implicitly, and always the same.
seed0(Config) when is_list(Config) ->
?line Self = self(),
?line _ = spawn(fun() -> Self ! random:uniform() end),
?line F1 = receive
Fa -> Fa
end,
?line _ = spawn(fun() -> random:seed(),
Self ! random:uniform() end),
?line F2 = receive
Fb -> Fb
end,
?line F1 = F2,
ok.
%% Test that seed/1 and seed/3 are equivalent.
seed(Config) when is_list(Config) ->
?line Self = self(),
Seed = {S1, S2, S3} = erlang:timestamp(),
?line _ = spawn(fun() ->
random:seed(S1,S2,S3),
Rands = lists:foldl(fun
(_, Out) -> [random:uniform(10000)|Out]
end, [], lists:seq(1,100)),
Self ! {seed_test, Rands}
end),
?line Rands1 = receive {seed_test, R1s} -> R1s end,
?line _ = spawn(fun() ->
random:seed(Seed),
Rands = lists:foldl(fun
(_, Out) -> [random:uniform(10000)|Out]
end, [], lists:seq(1,100)),
Self ! {seed_test, Rands}
end),
?line Rands2 = receive {seed_test, R2s} -> R2s end,
?line Rands1 = Rands2,
ok.
%% Check that uniform/1 returns values within the proper interval.
interval_1(Config) when is_list(Config) ->
?line Top = 7,
?line N = 10,
?line check_interval(N, Top),
ok.
check_interval(0, _) -> ok;
check_interval(N, Top) ->
X = random:uniform(Top),
if
X < 1 ->
ct:fail(too_small);
X > Top ->
ct:fail(too_large);
true ->
ok
end,
check_interval(N-1, Top).