diff options
Diffstat (limited to 'lib/stdlib/test/select_SUITE.erl')
-rw-r--r-- | lib/stdlib/test/select_SUITE.erl | 531 |
1 files changed, 250 insertions, 281 deletions
diff --git a/lib/stdlib/test/select_SUITE.erl b/lib/stdlib/test/select_SUITE.erl index 546c25f954..22b6d37e5d 100644 --- a/lib/stdlib/test/select_SUITE.erl +++ b/lib/stdlib/test/select_SUITE.erl @@ -1,18 +1,19 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2000-2011. All Rights Reserved. +%% Copyright Ericsson AB 2000-2016. 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/. +%% 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 %% -%% 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. +%% 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% %% @@ -26,21 +27,21 @@ %% 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]). --define(fmt(A,B),io:format(A,B)). -else. --include_lib("test_server/include/test_server.hrl"). --define(fmt(A,B),test_server:format(A,B)). +-include_lib("common_test/include/ct.hrl"). -endif. - + +-define(fmt(A,B), io:format(A, B)). + -ifdef(debug). -ifdef(STANDALONE). -define(line, erlang:display({?MODULE,?LINE}), ). @@ -52,58 +53,29 @@ -endif. -define(dbgformat(A,B),noop). -endif. - + -ifdef(STANDALONE). config(priv_dir,_) -> ".". -else. %% When run in test server. --export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, - init_per_group/2,end_per_group/2,select_test/1, - init_per_testcase/2, end_per_testcase/2, - return_values/1]). - -init_per_testcase(_Case, Config) when is_list(Config) -> - ?line Dog=test_server:timetrap(test_server:seconds(1200)), - [{watchdog, Dog}|Config]. - -end_per_testcase(_Case, Config) -> - Dog=?config(watchdog, Config), - test_server:timetrap_cancel(Dog), - ok. +-export([all/0, suite/0, + select_test/1, return_values/1]). -suite() -> [{ct_hooks,[ts_install_cth]}]. +suite() -> + [{ct_hooks,[ts_install_cth]}, + {timetrap,{minutes,1}}]. all() -> [return_values, select_test]. -groups() -> - []. - -init_per_suite(Config) -> - Config. - -end_per_suite(_Config) -> - ok. - -init_per_group(_GroupName, Config) -> - Config. -end_per_group(_GroupName, Config) -> - Config. - - -select_test(suite) -> - []; -select_test(doc) -> - ["Tests select in numerous ways"]; +%% Test select in numerous ways. select_test(Config) when is_list(Config) -> + ct:timetrap({minutes,40}), %% valgrinds needs a lot of time do_test(Config). -return_values(suite) -> - []; -return_values(doc) -> - ["Tests return values in specific situations for select/3 and select/1"]; +%% Test return values in specific situations for select/3 and select/1. return_values(Config) when is_list(Config) -> do_return_values(). @@ -116,7 +88,7 @@ table_factor({ets,_}) -> 100. gen_dets_filename(Config,N) -> - filename:join(?config(priv_dir,Config), + filename:join(proplists:get_value(priv_dir,Config), "testdets_" ++ integer_to_list(N) ++ ".dets"). create_tables(Config) -> @@ -127,15 +99,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}]. @@ -188,7 +160,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. @@ -201,21 +173,20 @@ 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), + WriteDir = ReadDir = proplists:get_value(priv_dir,Config), (catch file:make_dir(WriteDir)), Seed = case file:consult(filename:join([ReadDir, "preset_random_seed2.txt"])) of {ok,[X]} -> X; _ -> - {A,B,C} = erlang:now(), - random:seed(A,B,C), - get(random_seed) + rand:seed(exsplus), + rand:export_seed() end, - put(random_seed,Seed), + rand:seed(Seed), {ok, F} = file:open(filename:join([WriteDir, "last_random_seed2.txt"]), [write]), io:format(F,"~p. ~n",[Seed]), @@ -223,27 +194,27 @@ init_random(Config) -> ok. create_random_key(N,Type) -> - gen_key(random:uniform(N),Type). + gen_key(rand:uniform(N),Type). create_pb_key(N,list) -> - X = random:uniform(N), - case random:uniform(4) of + 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}; _ -> {[X, '$1', '$2'], fun([Z,P1,P2]) -> [Z,P1,P2] =:= [X,P1,P2] end} end; create_pb_key(N, tuple) -> - X = random:uniform(N), - case random:uniform(2) of + X = rand:uniform(N), + case rand:uniform(2) of 1 -> {{X, X+1, '$1'},fun({Z,Z1,P1}) -> {Z,Z1,P1} =:= {X,X+1,P1} end}; _ -> {{X, '$1', '$2'},fun({Z,P1,P2}) -> {Z,P1,P2} =:= {X,P1,P2} end} end; create_pb_key(N, complex) -> - X = random:uniform(N), - case random:uniform(2) of + X = rand:uniform(N), + case rand:uniform(2) of 1 -> {{[X, X+1], '$1'}, fun({[Z,Z1],P1}) -> {[Z,Z1],P1} =:= {[X,X+1],P1} end}; _ -> {{[X, '$1'], '$2'},fun({[Z,P1],P2}) -> @@ -309,7 +280,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)), @@ -351,18 +322,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 @@ -373,18 +344,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 -> @@ -394,27 +365,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,'_','_','_','_'},[],['$_']}], @@ -448,51 +419,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','_'},[], @@ -519,7 +490,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 -> @@ -562,40 +533,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','_'},[], @@ -664,34 +635,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) -> @@ -702,121 +673,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. - - |