Implement & test hope_kv_list:validate_unique_presence/(2|3) 1.0.0
authorSiraaj Khandkar <siraaj@khandkar.net>
Sat, 6 Sep 2014 19:42:03 +0000 (21:42 +0200)
committerSiraaj Khandkar <siraaj@khandkar.net>
Sat, 6 Sep 2014 19:42:03 +0000 (21:42 +0200)
src/hope_kv_list.erl
test/hope_kv_list_SUITE.erl [new file with mode: 0644]

index fb061b5..f4ee72e 100644 (file)
     , fold/3
     , of_kv_list/1
     , to_kv_list/1
+    , validate_unique_presence/2  % Assume default optional parameter(s)
+    , validate_unique_presence/3  % Specify optional parameter(s)
     ]).
 
 
 -type t(K, V) ::
     [{K, V}].
 
+-type presence_error(A) ::
+      {keys_missing     , [A]}
+    | {keys_duplicated  , [A]}
+    | {keys_unsupported , [A]}
+    .
+
 
 %% ============================================================================
 %% API
@@ -101,6 +109,44 @@ of_kv_list(List) ->
     % TODO: Decide if validation is to be done here. Do so if yes.
     List.
 
+-spec validate_unique_presence(t(K, _V), [K]) ->
+    hope_result:t(ok, [presence_error(K)]).
+validate_unique_presence(T, KeysRequired) ->
+    KeysOptional = [],
+    validate_unique_presence(T, KeysRequired, KeysOptional).
+
+-spec validate_unique_presence(t(K, _V), [K], [K]) ->
+    hope_result:t(ok, [presence_error(K)]).
+validate_unique_presence(T, KeysRequired, KeysOptional) ->
+    KeysSupported   = KeysRequired ++ KeysOptional,
+    KeysGiven       = [K || {K, _V} <- T],
+    KeysGivenUnique = lists:usort(KeysGiven),
+    KeysDups        = lists:usort(KeysGiven -- KeysGivenUnique),
+    KeysMissing     = KeysRequired -- KeysGivenUnique,
+    KeysUnsupported = KeysGivenUnique -- KeysSupported,
+    case {KeysDups, KeysMissing, KeysUnsupported}
+    of  {[], [], []} ->
+            {ok, ok}
+    ;   {Dups, Missing, Unsupported} ->
+            ErrorDups =
+                case Dups
+                of  []    -> []
+                ;   [_|_] -> [{keys_duplicated, Dups}]
+                end,
+            ErrorMissing =
+                case Missing
+                of  []    -> []
+                ;   [_|_] -> [{keys_missing, Missing}]
+                end,
+            ErrorUnsupported =
+                case Unsupported
+                of  []    -> []
+                ;   [_|_] -> [{keys_unsupported, Unsupported}]
+                end,
+            Errors = ErrorDups ++ ErrorMissing ++ ErrorUnsupported,
+            {error, Errors}
+    end.
+
 
 %% ============================================================================
 %% Helpers
diff --git a/test/hope_kv_list_SUITE.erl b/test/hope_kv_list_SUITE.erl
new file mode 100644 (file)
index 0000000..511fc32
--- /dev/null
@@ -0,0 +1,50 @@
+-module(hope_kv_list_SUITE).
+
+%% Callbacks
+-export(
+    [ all/0
+    , groups/0
+    ]).
+
+%% Test cases
+-export(
+    [ t_validate_unique_presence/1
+    ]).
+
+
+-define(GROUP , hope_kv_list).
+
+
+%% ============================================================================
+%% Common Test callbacks
+%% ============================================================================
+
+all() ->
+    [{group, ?GROUP}].
+
+groups() ->
+    Tests =
+        [ t_validate_unique_presence
+        ],
+    Properties = [],
+    [{?GROUP, Properties, Tests}].
+
+
+%% =============================================================================
+%%  Test cases
+%% =============================================================================
+
+t_validate_unique_presence(_Cfg) ->
+    KeysRequired = [a, b, c],
+    DictOk      = [{a, 1}, {b, 2}, {c, 3}],
+    DictUnsup   = [{a, 1}, {b, 2}, {c, 3}, {d, 4}],
+    DictDups    = [{a, 1}, {b, 2}, {c, 3}, {a, 4}],
+    DictMissing = [{a, 1}, {b, 2}],
+    {ok, ok} =
+        hope_kv_list:validate_unique_presence(DictOk, KeysRequired),
+    {error, [{keys_unsupported, [d]}]} =
+        hope_kv_list:validate_unique_presence(DictUnsup, KeysRequired),
+    {error, [{keys_duplicated, [a]}]} =
+        hope_kv_list:validate_unique_presence(DictDups, KeysRequired),
+    {error, [{keys_missing, [c]}]} =
+        hope_kv_list:validate_unique_presence(DictMissing, KeysRequired).
This page took 0.02237 seconds and 4 git commands to generate.