diff options
Diffstat (limited to 'lib/stdlib/test/select_SUITE.erl')
-rw-r--r-- | lib/stdlib/test/select_SUITE.erl | 434 |
1 files changed, 216 insertions, 218 deletions
diff --git a/lib/stdlib/test/select_SUITE.erl b/lib/stdlib/test/select_SUITE.erl index 298026ad38..50a9ec9709 100644 --- a/lib/stdlib/test/select_SUITE.erl +++ b/lib/stdlib/test/select_SUITE.erl @@ -27,12 +27,12 @@ %% Define to run outside of test server %% %%-define(STANDALONE,1). - + %% %% Define for debug output %% %%-define(debug,1). - + -ifdef(STANDALONE). -define(config(A,B),config(A,B)). -export([config/2]). @@ -41,7 +41,7 @@ -endif. -define(fmt(A,B), io:format(A, B)). - + -ifdef(debug). -ifdef(STANDALONE). -define(line, erlang:display({?MODULE,?LINE}), ). @@ -53,7 +53,7 @@ -endif. -define(dbgformat(A,B),noop). -endif. - + -ifdef(STANDALONE). config(priv_dir,_) -> ".". @@ -121,15 +121,15 @@ create_tables(Config) -> F1 = gen_dets_filename(Config,1), (catch file:delete(F1)), {ok,DetsPlain} = dets:open_file(testdets_1, - [{file, F1}]), + [{file, F1}]), F3 = gen_dets_filename(Config,3), (catch file:delete(F3)), {ok,DetsBag} = dets:open_file(testdets_3, - [{file, F3},{type, bag}]), + [{file, F3},{type, bag}]), F4 = gen_dets_filename(Config,4), (catch file:delete(F4)), {ok,DetsDBag} = dets:open_file(testdets_4, - [{file, F4},{type, duplicate_bag}]), + [{file, F4},{type, duplicate_bag}]), [{ets,Hash}, {ets,Tree}, {ets,Bag}, {ets,DBag}, {dets, DetsPlain}, {dets, DetsBag}, {dets, DetsDBag}]. @@ -182,7 +182,7 @@ build_tables(Config,Type) -> L = create_tables(Config), ?dbgformat("Tables: ~p~n",[L]), lists:foreach(fun(TD) -> - fill_table(TD,table_size(TD),Type) + fill_table(TD,table_size(TD),Type) end, L), L. @@ -195,7 +195,7 @@ destroy_tables([{ets,Tab}|T]) -> destroy_tables([{dets,Tab}|T]) -> dets:close(Tab), destroy_tables(T). - + init_random(Config) -> WriteDir = ReadDir = ?config(priv_dir,Config), @@ -222,7 +222,7 @@ create_pb_key(N,list) -> X = rand:uniform(N), case rand:uniform(4) of 3 -> {[X, X+1, '_'], fun([Z,Z1,P1]) -> - [Z,Z1,P1] =:= [X,X+1,P1] end}; + [Z,Z1,P1] =:= [X,X+1,P1] end}; 2 -> {[X, '_', '_'], fun([Z,P1,P2]) -> [Z,P1,P2] =:= [X,P1,P2] end}; 1 -> {[X, X+1, '$1'], fun([Z,Z1,P1]) -> [Z,Z1,P1] =:= [X,X+1,P1] end}; @@ -302,7 +302,7 @@ cmp_ms_to_fun({Mod,Tab}, MS, Fun1, Fun2, ChunkSize) -> false -> ?fmt("Match_spec result differs from fun result:~n",[]), ?fmt("Parameters: ~p,~p,~p,~p~n", - [{Mod,Tab}, MS, Fun1, Fun2]), + [{Mod,Tab}, MS, Fun1, Fun2]), ?fmt("Match_spec Result: ~p~n", [MSRes]), ?fmt("Fun Result: ~p~n", [FunRes]), Info = (catch Mod:info(Tab)), @@ -344,18 +344,18 @@ do_test(Config) -> ?fmt("multi_key done for type ~w~n",[Type]), multi_mixed_key(Tabs,Type), ?fmt("multi_mixed_key done for type ~w~n", - [Type]), + [Type]), destroy_tables(Tabs) end, [tuple, list, complex]), ok. - + basic_key(Tabs,Type) -> Fun = fun() -> lists:map(fun(Tab) -> - ?line Key = + Key = create_random_key(num_els(Tab),Type), - ?line MS = + MS = [{{Key,'_','_','_','_'},[],['$_']}], MF = fun({Key0,A,B,F,Bi},Acc) -> case Key =:= Key0 of @@ -366,18 +366,18 @@ basic_key(Tabs,Type) -> Acc end end, - ?line cmp_ms_to_fun(Tab,MS,MF,[]) + cmp_ms_to_fun(Tab,MS,MF,[]) end, Tabs) end, - ?line do_n(50,Fun), + do_n(50,Fun), ok. - + basic_pb_key(Tabs,Type) -> InnerFun = fun(Tab) -> - ?line {Key,KeyFun} = + {Key,KeyFun} = create_pb_key(num_els(Tab),Type), - ?line MS = [{{Key,'_','_','_','_'},[],['$_']}], + MS = [{{Key,'_','_','_','_'},[],['$_']}], MF = fun({Key0,A,B,F,Bi},Acc) -> case KeyFun(Key0) of true -> @@ -387,27 +387,27 @@ basic_pb_key(Tabs,Type) -> Acc end end, - ?line cmp_ms_to_fun(Tab,MS,MF,[]) + cmp_ms_to_fun(Tab,MS,MF,[]) end, - ?line {Etses, Detses} = split_by_type(Tabs), - - ?line FunEts = fun() -> - ?line lists:foreach(InnerFun, - Etses) - end, - ?line FunDets = fun() -> - ?line lists:foreach(InnerFun, - Detses) - end, - ?line do_n(table_factor(hd(Etses)) div 2,FunEts), - ?line do_n(10,FunDets), + {Etses, Detses} = split_by_type(Tabs), + + FunEts = fun() -> + lists:foreach(InnerFun, + Etses) + end, + FunDets = fun() -> + lists:foreach(InnerFun, + Detses) + end, + do_n(table_factor(hd(Etses)) div 2,FunEts), + do_n(10,FunDets), ok. - + double_pb_key(Tabs,Type) -> InnerFun = fun(Tab) -> - ?line {KeyA,KeyFunA} = + {KeyA,KeyFunA} = create_pb_key(num_els(Tab),Type), - ?line {KeyB,KeyFunB} = + {KeyB,KeyFunB} = create_pb_key(num_els(Tab),Type), MS = [{{KeyA,'_','_','_','_'},[],['$_']}, {{KeyB,'_','_','_','_'},[],['$_']}], @@ -441,51 +441,51 @@ double_pb_key(Tabs,Type) -> end end end, - ?line cmp_ms_to_fun(Tab,MS,MF,[]) + cmp_ms_to_fun(Tab,MS,MF,[]) end, - ?line {Etses, Detses} = split_by_type(Tabs), - - ?line FunEts = fun() -> - ?line lists:foreach(InnerFun, - Etses) - end, - ?line FunDets = fun() -> - ?line lists:foreach(InnerFun, - Detses) - end, - ?line do_n(table_factor(hd(Etses)) div 2,FunEts), - ?line do_n(10,FunDets), + {Etses, Detses} = split_by_type(Tabs), + + FunEts = fun() -> + lists:foreach(InnerFun, + Etses) + end, + FunDets = fun() -> + lists:foreach(InnerFun, + Detses) + end, + do_n(table_factor(hd(Etses)) div 2,FunEts), + do_n(10,FunDets), ok. - - + + multi_key(Tabs,Type) -> Fun = fun() -> lists:map(fun(Tab) -> - ?line KeyA = + KeyA = create_random_key(num_els(Tab),Type), - ?line KeyB = + KeyB = create_random_key(num_els(Tab),Type), - ?line KeyC = + KeyC = create_random_key(num_els(Tab),Type), - ?line KeyD = + KeyD = create_random_key(num_els(Tab),Type), - ?line KeyE = + KeyE = create_random_key(num_els(Tab),Type), - ?line KeyF = + KeyF = create_random_key(num_els(Tab),Type), - ?line KeyG = + KeyG = create_random_key(num_els(Tab),Type), - ?line KeyH = + KeyH = create_random_key(num_els(Tab),Type), - ?line KeyI = + KeyI = create_random_key(num_els(Tab),Type), - ?line KeyJ = + KeyJ = create_random_key(num_els(Tab),Type), - ?line KeyK = + KeyK = create_random_key(num_els(Tab),Type), - ?line KeyL = + KeyL = create_random_key(num_els(Tab),Type), - + MS = [{{KeyA,'$1','_','$2','_'},[], [{{'$1','$2'}}]}, {{KeyB,'$1','_','$2','_'},[], @@ -512,7 +512,7 @@ multi_key(Tabs,Type) -> [{{'$1','$2'}}]} ], ?dbgformat("Tab: ~p, MS: ~p~n", - [Tab,MS]), + [Tab,MS]), MF = fun({Key0,A,_B,F,_Bi},Acc) -> case Key0 of KeyA -> @@ -555,40 +555,40 @@ multi_key(Tabs,Type) -> Acc end end, - ?line cmp_ms_to_fun(Tab,MS,MF,[]) + cmp_ms_to_fun(Tab,MS,MF,[]) end, Tabs) end, - ?line do_n(33,Fun), + do_n(33,Fun), ok. - + multi_mixed_key(Tabs,Type) -> InnerFun = fun(Tab) -> - ?line KeyA = + KeyA = create_random_key(num_els(Tab),Type), - ?line KeyB = + KeyB = create_random_key(num_els(Tab),Type), - ?line KeyC = + KeyC = create_random_key(num_els(Tab),Type), - ?line KeyD = + KeyD = create_random_key(num_els(Tab),Type), - ?line {KeyE, FunE} = + {KeyE, FunE} = create_pb_key(num_els(Tab),Type), - ?line KeyF = + KeyF = create_random_key(num_els(Tab),Type), - ?line {KeyG, FunG} = + {KeyG, FunG} = create_pb_key(num_els(Tab),Type), - ?line KeyH = + KeyH = create_random_key(num_els(Tab),Type), - ?line KeyI = + KeyI = create_random_key(num_els(Tab),Type), - ?line {KeyJ, FunJ} = + {KeyJ, FunJ} = create_pb_key(num_els(Tab),Type), - ?line KeyK = + KeyK = create_random_key(num_els(Tab),Type), - ?line KeyL = + KeyL = create_random_key(num_els(Tab),Type), - + MS = [{{KeyA,'$1','_','$2','_'},[], [{{'$1','$2'}}]}, {{KeyB,'$1','_','$2','_'},[], @@ -657,34 +657,34 @@ multi_mixed_key(Tabs,Type) -> end end end, - ?line cmp_ms_to_fun(Tab,MS,MF,[]), - ?line case Tab of - {ets,_} -> - ?line cmp_ms_to_fun(Tab,MS,MF,[],1), - ?line cmp_ms_to_fun(Tab,MS,MF,[],10), - ?line cmp_ms_to_fun(Tab,MS,MF,[],1000000), - ?line cmp_ms_to_fun(Tab,MS,MF,[],-1), - ?line cmp_ms_to_fun(Tab,MS,MF,[],-10), - ?line cmp_ms_to_fun(Tab,MS,MF,[],-1000000); - _ -> - ok - end + cmp_ms_to_fun(Tab,MS,MF,[]), + case Tab of + {ets,_} -> + cmp_ms_to_fun(Tab,MS,MF,[],1), + cmp_ms_to_fun(Tab,MS,MF,[],10), + cmp_ms_to_fun(Tab,MS,MF,[],1000000), + cmp_ms_to_fun(Tab,MS,MF,[],-1), + cmp_ms_to_fun(Tab,MS,MF,[],-10), + cmp_ms_to_fun(Tab,MS,MF,[],-1000000); + _ -> + ok + end end, - ?line {Etses, Detses} = split_by_type(Tabs), - - ?line FunEts = fun() -> - ?line lists:foreach(InnerFun, - Etses) - end, - ?line FunDets = fun() -> - ?line lists:foreach(InnerFun, - Detses) - end, - ?line do_n(table_factor(hd(Etses)) div 2,FunEts), - ?line do_n(table_factor(hd(Detses)) div 2,FunDets), + {Etses, Detses} = split_by_type(Tabs), + + FunEts = fun() -> + lists:foreach(InnerFun, + Etses) + end, + FunDets = fun() -> + lists:foreach(InnerFun, + Detses) + end, + do_n(table_factor(hd(Etses)) div 2,FunEts), + do_n(table_factor(hd(Detses)) div 2,FunDets), ok. - - + + split_by_type(List) -> split_by_type(List,[],[]). split_by_type([],AccEts,AccDets) -> @@ -695,121 +695,119 @@ split_by_type([{ets,Tab}|T],AccEts,AccDets) -> split_by_type(T,[{ets,Tab}|AccEts],AccDets). whitebox() -> - ?line ets:new(xxx,[named_table, ordered_set]), - ?line ets:new(yyy,[named_table]), - ?line E = fun(0,_)->ok; - (N,F) -> - ?line ets:insert(xxx,{N,N rem 10}), - ?line ets:insert(yyy,{N,N rem 10}), - F(N-1,F) - end, - ?line E(10000,E), - - ?line G = fun(F,C,A) -> - ?line case ets:select(C) of - {L,C2} -> - ?line F(F,C2,A+length(L)); - '$end_of_table' -> - ?line A - end - end, - ?line H=fun({L,C}) -> - ?line G(G,C,length(L)) - end, - - ?line 1 = H(ets:select(xxx,[{{'$1','$2'},[{'<','$1',2}],['$_']}],7)), - ?line 10000 = H(ets:select(xxx,[{{'$1','$2'},[],['$_']}],1)), - ?line 1 = H(ets:select(yyy,[{{'$1','$2'},[{'<','$1',2}],['$_']}],7)), - ?line 10000 = H(ets:select(yyy,[{{'$1','$2'},[],['$_']}],1)), - - ?line {[{5,5}],_} = ets:select(xxx,[{{5,'$2'},[],['$_']}],1), - ?line {[{5,5}],_} = ets:select(yyy,[{{5,'$2'},[],['$_']}],1), - - ?line I = fun(_,0) -> - ok; - (I,N) -> - ?line 10000 = - H(ets:select(xxx,[{{'$1','$2'},[],['$_']}],N)), - I(I,N-1) - end, - ?line I(I,2000), - ?line J = fun(F,C,A) -> - ?line case ets:select(C) of - {L,C2} -> - ?line F(F,C2,lists:reverse(L)++A); - '$end_of_table' -> - ?line lists:reverse(A) - end - end, - ?line K = fun({L,C}) -> - ?line J(J,C,lists:reverse(L)) - end, - ?line M = fun(_, _, 0) -> - ok; - (F, What, N) -> - ?line What = - K(ets:select(xxx,[{{'$1','$2'},[],['$_']}],N)), - F(F, What, N-1) - end, - ?line N = fun(HM) -> - ?line What = ets:select(xxx,[{{'$1','$2'},[],['$_']}]), - ?line What = lists:sort(What), - M(M, What, HM) - end, - ?line N(2000), - ?line ets:delete(xxx), - ?line ets:delete(yyy). + ets:new(xxx,[named_table, ordered_set]), + ets:new(yyy,[named_table]), + E = fun(0,_)->ok; + (N,F) -> + ets:insert(xxx,{N,N rem 10}), + ets:insert(yyy,{N,N rem 10}), + F(N-1,F) + end, + E(10000,E), + + G = fun(F,C,A) -> + case ets:select(C) of + {L,C2} -> + F(F,C2,A+length(L)); + '$end_of_table' -> + A + end + end, + H=fun({L,C}) -> + G(G,C,length(L)) + end, + + 1 = H(ets:select(xxx,[{{'$1','$2'},[{'<','$1',2}],['$_']}],7)), + 10000 = H(ets:select(xxx,[{{'$1','$2'},[],['$_']}],1)), + 1 = H(ets:select(yyy,[{{'$1','$2'},[{'<','$1',2}],['$_']}],7)), + 10000 = H(ets:select(yyy,[{{'$1','$2'},[],['$_']}],1)), + + {[{5,5}],_} = ets:select(xxx,[{{5,'$2'},[],['$_']}],1), + {[{5,5}],_} = ets:select(yyy,[{{5,'$2'},[],['$_']}],1), + + I = fun(_,0) -> + ok; + (I,N) -> + 10000 = + H(ets:select(xxx,[{{'$1','$2'},[],['$_']}],N)), + I(I,N-1) + end, + I(I,2000), + J = fun(F,C,A) -> + case ets:select(C) of + {L,C2} -> + F(F,C2,lists:reverse(L)++A); + '$end_of_table' -> + lists:reverse(A) + end + end, + K = fun({L,C}) -> + J(J,C,lists:reverse(L)) + end, + M = fun(_, _, 0) -> + ok; + (F, What, N) -> + What = + K(ets:select(xxx,[{{'$1','$2'},[],['$_']}],N)), + F(F, What, N-1) + end, + N = fun(HM) -> + What = ets:select(xxx,[{{'$1','$2'},[],['$_']}]), + What = lists:sort(What), + M(M, What, HM) + end, + N(2000), + ets:delete(xxx), + ets:delete(yyy). do_return_values() -> - ?line T = ets:new(xxx,[ordered_set]), - ?line U = ets:new(xxx,[]), - ?line '$end_of_table' = ets:select(T,[{'_',[],['$_']}],1), - ?line '$end_of_table' = ets:select(U,[{'_',[],['$_']}],1), - ?line ets:insert(T,{ett,1}), - ?line ets:insert(U,{ett,1}), - ?line {[{ett,1}],C1} = ets:select(T,[{'_',[],['$_']}],1), - ?line '$end_of_table' = ets:select(C1), - ?line {[{ett,1}],C2} = ets:select(U,[{'_',[],['$_']}],1), - ?line '$end_of_table' = ets:select(C2), - ?line {[{ett,1}],C3} = ets:select(T,[{'_',[],['$_']}],2), - ?line '$end_of_table' = ets:select(C3), - ?line {[{ett,1}],C4} = ets:select(U,[{'_',[],['$_']}],2), - ?line '$end_of_table' = ets:select(C4), - ?line E = fun(0,_)->ok; - (N,F) -> - ?line ets:insert(T,{N,N rem 10}), - ?line ets:insert(U,{N,N rem 10}), - F(N-1,F) - end, - ?line E(10000,E), - ?line '$end_of_table' = ets:select(T,[{{hej, hopp},[],['$_']}],1), - ?line '$end_of_table' = ets:select(U,[{{hej,hopp},[],['$_']}],1), - ?line {[{ett,1}],CC1} = ets:select(T,[{{'$1','_'},[{is_atom, '$1'}], - ['$_']}],1), - ?line '$end_of_table' = ets:select(CC1), - ?line {[{ett,1}],CC2} = ets:select(U,[{{'$1','_'},[{is_atom, '$1'}], - ['$_']}],1), - ?line '$end_of_table' = ets:select(CC2), - ?line {[{ett,1}],CC3} = ets:select(T,[{{'$1','_'},[{is_atom, '$1'}], - ['$_']}],2), - ?line '$end_of_table' = ets:select(CC3), - ?line {[{ett,1}],CC4} = ets:select(U,[{{'$1','_'},[{is_atom, '$1'}], - ['$_']}],2), - ?line '$end_of_table' = ets:select(CC4), - ?line ets:delete(T), - ?line ets:delete(U), - ?line V = ets:new(xxx,[{keypos, 4}]), - ?line X = ets:new(xxx,[ordered_set, {keypos, 4}]), - ?line ets:insert(V,{1,1,1,ett}), - ?line ets:insert(X,{1,1,1,ett}), - ?line '$end_of_table' = ets:select(V,[{{1,1,1},[],['$_']}],1), - ?line '$end_of_table' = ets:select(X,[{{1,1,1},[],['$_']}],1), - ?line ets:delete(V), - ?line ets:delete(X), + T = ets:new(xxx,[ordered_set]), + U = ets:new(xxx,[]), + '$end_of_table' = ets:select(T,[{'_',[],['$_']}],1), + '$end_of_table' = ets:select(U,[{'_',[],['$_']}],1), + ets:insert(T,{ett,1}), + ets:insert(U,{ett,1}), + {[{ett,1}],C1} = ets:select(T,[{'_',[],['$_']}],1), + '$end_of_table' = ets:select(C1), + {[{ett,1}],C2} = ets:select(U,[{'_',[],['$_']}],1), + '$end_of_table' = ets:select(C2), + {[{ett,1}],C3} = ets:select(T,[{'_',[],['$_']}],2), + '$end_of_table' = ets:select(C3), + {[{ett,1}],C4} = ets:select(U,[{'_',[],['$_']}],2), + '$end_of_table' = ets:select(C4), + E = fun(0,_)->ok; + (N,F) -> + ets:insert(T,{N,N rem 10}), + ets:insert(U,{N,N rem 10}), + F(N-1,F) + end, + E(10000,E), + '$end_of_table' = ets:select(T,[{{hej, hopp},[],['$_']}],1), + '$end_of_table' = ets:select(U,[{{hej,hopp},[],['$_']}],1), + {[{ett,1}],CC1} = ets:select(T,[{{'$1','_'},[{is_atom, '$1'}], + ['$_']}],1), + '$end_of_table' = ets:select(CC1), + {[{ett,1}],CC2} = ets:select(U,[{{'$1','_'},[{is_atom, '$1'}], + ['$_']}],1), + '$end_of_table' = ets:select(CC2), + {[{ett,1}],CC3} = ets:select(T,[{{'$1','_'},[{is_atom, '$1'}], + ['$_']}],2), + '$end_of_table' = ets:select(CC3), + {[{ett,1}],CC4} = ets:select(U,[{{'$1','_'},[{is_atom, '$1'}], + ['$_']}],2), + '$end_of_table' = ets:select(CC4), + ets:delete(T), + ets:delete(U), + V = ets:new(xxx,[{keypos, 4}]), + X = ets:new(xxx,[ordered_set, {keypos, 4}]), + ets:insert(V,{1,1,1,ett}), + ets:insert(X,{1,1,1,ett}), + '$end_of_table' = ets:select(V,[{{1,1,1},[],['$_']}],1), + '$end_of_table' = ets:select(X,[{{1,1,1},[],['$_']}],1), + ets:delete(V), + ets:delete(X), ok. - - |