Fix check for no maps in keys

This commit is contained in:
Thomas Arts 2019-08-23 14:45:15 +02:00
parent c270c794c3
commit d794566363
3 changed files with 31 additions and 0 deletions

View File

@ -22,5 +22,6 @@ quickcheck_test_() ->
{setup, fun() -> eqc:start() end, {setup, fun() -> eqc:start() end,
[ ?EQC_EUNIT(aefate_type_eqc, prop_roundtrip, 1000), [ ?EQC_EUNIT(aefate_type_eqc, prop_roundtrip, 1000),
?EQC_EUNIT(aefate_eqc, prop_serializes, 1000), ?EQC_EUNIT(aefate_eqc, prop_serializes, 1000),
?EQC_EUNIT(aefate_eqc, prop_no_maps_in_keys, 1000),
?EQC_EUNIT(aefate_eqc, prop_idempotent, 1000) ?EQC_EUNIT(aefate_eqc, prop_idempotent, 1000)
]}. ]}.

View File

@ -10,6 +10,7 @@
-module(aefate_eqc). -module(aefate_eqc).
-include_lib("eqc/include/eqc.hrl"). -include_lib("eqc/include/eqc.hrl").
-include("../include/aeb_fate_data.hrl").
-compile([export_all, nowarn_export_all]). -compile([export_all, nowarn_export_all]).
@ -43,6 +44,18 @@ prop_serializes() ->
{size, size(Binary) < 500000}])) {size, size(Binary) < 500000}]))
end)). end)).
prop_no_maps_in_keys() ->
?FORALL(FateData, fate_bad_map(), %% may contain a map in its keys
begin
HasMapInKeys = lists:any(fun(K) -> has_map(K) end, maps:keys(FateData)),
try aeb_fate_encoding:serialize(FateData),
?WHENFAIL(eqc:format("Should not serialize, contains a map in key\n", []),
not HasMapInKeys)
catch error:Reason ->
?WHENFAIL(eqc:format("(~p) Should serialize\n", [Reason]), HasMapInKeys)
end
end).
prop_fuzz() -> prop_fuzz() ->
in_parallel( in_parallel(
?FORALL(Binary, ?LET(FateData, ?SIZED(Size, resize(Size div 4, fate_data())), aeb_fate_encoding:serialize(FateData)), ?FORALL(Binary, ?LET(FateData, ?SIZED(Size, resize(Size div 4, fate_data())), aeb_fate_encoding:serialize(FateData)),
@ -167,3 +180,14 @@ injection(Binary) ->
is_empty(L) -> is_empty(L) ->
?WHENFAIL(eqc:format("~p\n", [L]), L == []). ?WHENFAIL(eqc:format("~p\n", [L]), L == []).
has_map(L) when is_list(L) ->
lists:any(fun(V) -> has_map(V) end, L);
has_map(T) when is_tuple(T) ->
has_map(tuple_to_list(T));
has_map(M) when is_map(M) ->
true;
has_map(?FATE_STORE_MAP(_, _)) ->
true;
has_map(_) ->
false.

View File

@ -487,5 +487,11 @@ sort(KVList) ->
valid_key_type(K) when ?IS_FATE_MAP(K) -> valid_key_type(K) when ?IS_FATE_MAP(K) ->
error({map_as_key_in_map, K}); error({map_as_key_in_map, K});
valid_key_type(?FATE_STORE_MAP(_, _) = K) ->
error({map_as_key_in_map, K});
valid_key_type(K) when is_list(K) ->
lists:all(fun(E) -> valid_key_type(E) end, K);
valid_key_type(K) when is_tuple(K) ->
lists:all(fun(E) -> valid_key_type(E) end, tuple_to_list(K));
valid_key_type(_K) -> valid_key_type(_K) ->
true. true.