diff options
Diffstat (limited to 'lib/stdlib/test/ets_SUITE.erl')
-rw-r--r-- | lib/stdlib/test/ets_SUITE.erl | 63 |
1 files changed, 56 insertions, 7 deletions
diff --git a/lib/stdlib/test/ets_SUITE.erl b/lib/stdlib/test/ets_SUITE.erl index ffa088543d..52cf5b9e69 100644 --- a/lib/stdlib/test/ets_SUITE.erl +++ b/lib/stdlib/test/ets_SUITE.erl @@ -40,7 +40,7 @@ -export([tab2file/1, tab2file2/1, tabfile_ext1/1, tabfile_ext2/1, tabfile_ext3/1, tabfile_ext4/1, badfile/1]). -export([heavy_lookup/1, heavy_lookup_element/1, heavy_concurrent/1]). --export([lookup_element_mult/1]). +-export([lookup_element_mult/1, lookup_element_default/1]). -export([foldl_ordered/1, foldr_ordered/1, foldl/1, foldr/1, fold_empty/1]). -export([t_delete_object/1, t_init_table/1, t_whitebox/1, select_bound_chunk/1, t_delete_all_objects/1, t_test_ms/1, @@ -195,7 +195,7 @@ groups() -> privacy]}, {insert, [], [empty, badinsert]}, {lookup, [], [badlookup, lookup_order]}, - {lookup_element, [], [lookup_element_mult]}, + {lookup_element, [], [lookup_element_mult, lookup_element_default]}, {delete, [], [delete_elem, delete_tab, delete_large_tab, delete_large_named_table, evil_delete, table_leak, @@ -2407,13 +2407,19 @@ update_element_do(Tab,Tuple,Key,UpdPos) -> Big32 = 16#12345678, Big64 = 16#123456789abcdef0, - Values = { 623, -27, 0, Big32, -Big32, Big64, -Big64, Big32*Big32, + RefcBin = list_to_binary(lists:seq(1,100)), + BigMap1 = maps:from_list([{N,N} || N <- lists:seq(1,33)]), + BigMap2 = BigMap1#{key => RefcBin, RefcBin => value}, + Values = { 623, -27, Big32, -Big32, Big64, -Big64, Big32*Big32, -Big32*Big32, Big32*Big64, -Big32*Big64, Big64*Big64, -Big64*Big64, "A", "Sverker", [], {12,-132}, {}, - <<45,232,0,12,133>>, <<234,12,23>>, list_to_binary(lists:seq(1,100)), + <<45,232,0,12,133>>, <<234,12,23>>, RefcBin, (fun(X) -> X*Big32 end), - make_ref(), make_ref(), self(), ok, update_element, 28, 29 }, - Length = size(Values), + make_ref(), make_ref(), self(), ok, update_element, + #{a => value, "hello" => "world", 1.0 => RefcBin }, + BigMap1, BigMap2}, + Length = tuple_size(Values), + 29 = Length, PosValArgF = fun(ToIx, ResList, [Pos | PosTail], Rand, MeF) -> NextIx = (ToIx+Rand) rem Length, @@ -2433,7 +2439,12 @@ update_element_do(Tab,Tuple,Key,UpdPos) -> true = ets:update_element(Tab, Key, PosValArg), ArgHash = erlang:phash2({Tab,Key,PosValArg}), NewTuple = update_tuple(PosValArg,Tuple), - [NewTuple] = ets:lookup(Tab,Key) + [NewTuple] = ets:lookup(Tab,Key), + [begin + Elem = element(I, NewTuple), + Elem = ets:lookup_element(Tab, Key, I) + end + || I <- lists:seq(1, tuple_size(NewTuple))] end, LoopF = fun(_FromIx, Incr, _Times, Checksum, _MeF) when Incr >= Length -> @@ -4142,6 +4153,41 @@ fill_tab(Tab,Val) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +lookup_element_default(Config) when is_list(Config) -> + EtsMem = etsmem(), + + TabSet = ets_new(foo, [set]), + ets:insert(TabSet, {key, 42}), + 42 = ets:lookup_element(TabSet, key, 2, 13), + 13 = ets:lookup_element(TabSet, not_key, 2, 13), + {'EXIT',{badarg,_}} = catch ets:lookup_element(TabSet, key, 3, 13), + true = ets:delete(TabSet), + + TabOrderedSet = ets_new(foo, [ordered_set]), + ets:insert(TabOrderedSet, {key, 42}), + 42 = ets:lookup_element(TabOrderedSet, key, 2, 13), + 13 = ets:lookup_element(TabOrderedSet, not_key, 2, 13), + {'EXIT',{badarg,_}} = catch ets:lookup_element(TabOrderedSet, key, 3, 13), + true = ets:delete(TabOrderedSet), + + TabBag = ets_new(foo, [bag]), + ets:insert(TabBag, {key, 42}), + ets:insert(TabBag, {key, 43, 44}), + [42, 43] = ets:lookup_element(TabBag, key, 2, 13), + 13 = ets:lookup_element(TabBag, not_key, 2, 13), + {'EXIT',{badarg,_}} = catch ets:lookup_element(TabBag, key, 3, 13), + true = ets:delete(TabBag), + + TabDuplicateBag = ets_new(foo, [duplicate_bag]), + ets:insert(TabDuplicateBag, {key, 42}), + ets:insert(TabDuplicateBag, {key, 42}), + ets:insert(TabDuplicateBag, {key, 43, 44}), + [42, 42, 43] = ets:lookup_element(TabDuplicateBag, key, 2, 13), + 13 = ets:lookup_element(TabDuplicateBag, not_key, 2, 13), + {'EXIT',{badarg,_}} = catch ets:lookup_element(TabDuplicateBag, key, 3, 13), + true = ets:delete(TabDuplicateBag), + + verify_etsmem(EtsMem). %% OTP-2386. Multiple return elements. lookup_element_mult(Config) when is_list(Config) -> @@ -9187,6 +9233,9 @@ error_info(_Config) -> {lookup_element, [OneKeyTab, one, 4]}, + {lookup_element, ['$Tab', no_key, 1, default_value], [no_fail]}, + {lookup_element, [OneKeyTab, one, 4, default_value]}, + {match, [bad_continuation], [no_table]}, {match, ['$Tab', <<1,2,3>>], [no_fail]}, |