From fd4ce7d2e994d92c98f243e4e73515abfb5ede87 Mon Sep 17 00:00:00 2001 From: Jan Uhlig Date: Mon, 13 Nov 2023 14:10:45 +0100 Subject: [PATCH] Tests for ets:update_element/4 --- lib/stdlib/src/erl_stdlib_errors.erl | 22 ++++++++++++++++++++++ lib/stdlib/test/ets_SUITE.erl | 19 +++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/lib/stdlib/src/erl_stdlib_errors.erl b/lib/stdlib/src/erl_stdlib_errors.erl index a90d6477a7ca..cf301c866ae8 100644 --- a/lib/stdlib/src/erl_stdlib_errors.erl +++ b/lib/stdlib/src/erl_stdlib_errors.erl @@ -772,6 +772,8 @@ format_ets_error(update_element, [_,_,ElementSpec]=Args, Cause) -> case Cause of keypos -> [same_as_keypos]; + position -> + [update_op_range]; _ -> case is_element_spec_top(ElementSpec) of true -> @@ -785,6 +787,26 @@ format_ets_error(update_element, [_,_,ElementSpec]=Args, Cause) -> [<<"is not a valid element specification">>] end end]; +format_ets_error(update_element, [_, _, ElementSpec, Default]=Args, Cause) -> + TabCause = format_cause(Args, Cause), + ArgsCause = case Cause of + keypos -> + [same_as_keypos]; + position -> + [update_op_range]; + _ -> + case {is_element_spec_top(ElementSpec), format_tuple(Default)} of + {true, [""]} -> + [range]; + {true, TupleCause} -> + ["" | TupleCause]; + {false, [""]} -> + [<<"is not a valid element specification">>]; + {false, TupleCause} -> + ["" | TupleCause] + end + end, + [TabCause, "" | ArgsCause]; format_ets_error(whereis, _Args, _Cause) -> [bad_table_name]; format_ets_error(_, Args, Cause) -> diff --git a/lib/stdlib/test/ets_SUITE.erl b/lib/stdlib/test/ets_SUITE.erl index 73fd3df43a08..64c0ebbc7340 100644 --- a/lib/stdlib/test/ets_SUITE.erl +++ b/lib/stdlib/test/ets_SUITE.erl @@ -2568,6 +2568,8 @@ update_element_do(Tab,Tuple,Key,UpdPos) -> %%io:format("update_element(~p)~n",[PosValArg]), ArgHash = erlang:phash2({Tab,Key,PosValArg}), true = ets:update_element(Tab, Key, PosValArg), + [DefaultObj] = ets:lookup(Tab, Key), + true = ets:update_element(Tab, make_ref(), PosValArg, DefaultObj), ArgHash = erlang:phash2({Tab,Key,PosValArg}), NewTuple = update_tuple(PosValArg,Tuple), [NewTuple] = ets:lookup(Tab,Key), @@ -2629,7 +2631,9 @@ update_element_neg(Opts) -> Bag = ets_new(bag,[bag | Opts]), DBag = ets_new(duplicate_bag,[duplicate_bag | Opts]), {'EXIT',{badarg,_}} = (catch ets:update_element(Bag,key,{2,1})), + {'EXIT',{badarg,_}} = (catch ets:update_element(Bag,key,{2,1},{key,0})), {'EXIT',{badarg,_}} = (catch ets:update_element(DBag,key,{2,1})), + {'EXIT',{badarg,_}} = (catch ets:update_element(DBag,key,{2,1},{key,0})), true = ets:delete(Bag), true = ets:delete(DBag), ok. @@ -9515,9 +9519,20 @@ error_info(_Config) -> {update_element, ['$Tab', no_key, {2, new}], [no_fail]}, {update_element, [BagTab, no_key, {2, bagged}]}, {update_element, [OneKeyTab, one, not_tuple]}, - {update_element, [OneKeyTab, one, {0, new}]}, + {update_element, [OneKeyTab, one, {0, new}], [{error_term, position}]}, {update_element, [OneKeyTab, one, {1, new}], [{error_term,keypos}]}, - {update_element, [OneKeyTab, one, {4, new}]}, + {update_element, [OneKeyTab, one, {4, new}], [{error_term, position}]}, + + {update_element, ['$Tab', no_key, {2, new}, {no_key, old}], [no_fail]}, + {update_element, ['$Tab', no_key, {0, new}, {no_key, old}], [{error_term, position}]}, + {update_element, ['$Tab', no_key, {1, new}, {no_key, old}], [{error_term, keypos}]}, + {update_element, ['$Tab', no_key, {4, new}, {no_key, old}], [{error_term, position}]}, + {update_element, ['$Tab', no_key, {4, new}, not_tuple]}, + {update_element, [BagTab, no_key, {1, bagged}, {no_key, old}], []}, + {update_element, [OneKeyTab, no_key, {0, new}, {no_key, old}], [{error_term, position}]}, + {update_element, [OneKeyTab, no_key, {1, new}, {no_key, old}], [{error_term, keypos}]}, + {update_element, [OneKeyTab, no_key, {4, new}, {no_key, old}], [{error_term, position}]}, + {update_element, [OneKeyTab, no_key, {4, new}, not_tuple]}, {whereis, [{bad,name}], [no_table]} ],