Coverage is about as good as it's going to get
This commit is contained in:
parent
da2bad564f
commit
fd7dad0714
1 changed files with 51 additions and 20 deletions
|
@ -96,7 +96,7 @@ prop_calc_projection(Nodes, TrackUseTab) ->
|
||||||
{gen_rand_seed(),
|
{gen_rand_seed(),
|
||||||
oneof([0,15,35,55,75,85,100]),
|
oneof([0,15,35,55,75,85,100]),
|
||||||
oneof([0,15,35,55,75,85,100]),
|
oneof([0,15,35,55,75,85,100]),
|
||||||
choose(500, 2000),
|
5000,
|
||||||
oneof(Nodes)},
|
oneof(Nodes)},
|
||||||
begin
|
begin
|
||||||
erase(goofus),
|
erase(goofus),
|
||||||
|
@ -140,15 +140,17 @@ find_common_prefix(_, _) ->
|
||||||
[].
|
[].
|
||||||
|
|
||||||
calc_projection_test_() ->
|
calc_projection_test_() ->
|
||||||
{timeout, 60,
|
Runtime = 15, %% Runtime = 60*60,
|
||||||
|
{timeout, Runtime * 500,
|
||||||
fun() ->
|
fun() ->
|
||||||
%% Nodes = [a,b,c,d],
|
|
||||||
Nodes = [a,b,c],
|
Nodes = [a,b,c],
|
||||||
Cs = combinations(Nodes),
|
Cs = combinations(Nodes),
|
||||||
Combos = lists:sort([{UPI1, UPI2} || UPI1 <- Cs, UPI2 <- Cs]),
|
Combos = lists:sort([{UPI1, UPI2} || UPI1 <- Cs, UPI2 <- Cs]),
|
||||||
|
put(hack, 0),
|
||||||
timer:sleep(500),
|
timer:sleep(500),
|
||||||
io:format(user, "\n", []),
|
io:format(user, "\n", []),
|
||||||
Rs = [begin
|
Rs = [begin
|
||||||
|
Hack = get(hack),if Hack rem 10000 == 0 -> ?D({time(), Hack}); true -> ok end,put(hack, Hack + 1),
|
||||||
P1 = ?MGR:make_projection(2, 1, <<>>, HdNd, Nodes,
|
P1 = ?MGR:make_projection(2, 1, <<>>, HdNd, Nodes,
|
||||||
[], PsUPI1, Nodes -- PsUPI1, []),
|
[], PsUPI1, Nodes -- PsUPI1, []),
|
||||||
P2 = ?MGR:make_projection(3, 2, <<>>, HdNd, Nodes,
|
P2 = ?MGR:make_projection(3, 2, <<>>, HdNd, Nodes,
|
||||||
|
@ -159,34 +161,49 @@ calc_projection_test_() ->
|
||||||
end,
|
end,
|
||||||
{Res, PsUPI1, PsUPI2}
|
{Res, PsUPI1, PsUPI2}
|
||||||
end || HdNd <- Nodes,
|
end || HdNd <- Nodes,
|
||||||
{UPI1,UPI2} <- Combos,
|
{PsUPI1,PsUPI2} <- Combos,
|
||||||
%% We assume that the author appears in any UPI list
|
%% We assume that the author appears in any UPI list
|
||||||
UPI1 /= [],
|
PsUPI1 /= [],
|
||||||
UPI2 /= [],
|
PsUPI2 /= [],
|
||||||
%% HdNd is the author for all of these
|
%% HdNd is the author for all of these
|
||||||
%% tests, so it must be present in UPI1 & UPI2
|
%% tests, so it must be present in UPI1 & UPI2
|
||||||
lists:member(HdNd, UPI1),
|
lists:member(HdNd, PsUPI1),
|
||||||
lists:member(HdNd, UPI2),
|
lists:member(HdNd, PsUPI2)],
|
||||||
PsUPI1 <- perms(UPI1),
|
|
||||||
PsUPI2 <- perms(UPI2)],
|
|
||||||
OKs = [begin
|
OKs = [begin
|
||||||
{UPI1,UPI2}
|
{UPI1,UPI2}
|
||||||
end || {true, UPI1, UPI2} <- Rs],
|
end || {true, UPI1, UPI2} <- Rs],
|
||||||
io:format(user, "OKs = ~p\n", [lists:usort(OKs)]),
|
%% io:format(user, "OKs = ~p\n", [lists:usort(OKs)]),
|
||||||
Tab = ets:new(count, [public, set, {keypos, 1}]),
|
Tab = ets:new(count, [public, set, {keypos, 1}]),
|
||||||
[ets:insert(Tab, {Transition, 0}) || Transition <- OKs],
|
[ets:insert(Tab, {Transition, 0}) || Transition <- OKs],
|
||||||
|
|
||||||
true = eqc:quickcheck(
|
true = eqc:quickcheck(
|
||||||
eqc:numtests(3500,
|
eqc:testing_time(Runtime,
|
||||||
?QC_OUT(prop_calc_projection(Nodes, Tab)))),
|
?QC_OUT(prop_calc_projection(Nodes, Tab)))),
|
||||||
NotCounted = [Transition || {Transition, 0} <- ets:tab2list(Tab)],
|
|
||||||
_Counted = [X || {_, N}=X <- ets:tab2list(Tab),
|
NotCounted = lists:sort([Transition || {Transition, 0} <- ets:tab2list(Tab)]),
|
||||||
|
Counted = [X || {_, N}=X <- ets:tab2list(Tab),
|
||||||
N > 0],
|
N > 0],
|
||||||
|
CountedX = lists:sort(fun(X, Y) ->
|
||||||
|
element(2, X) < element(2, Y)
|
||||||
|
end, Counted),
|
||||||
timer:sleep(100),
|
timer:sleep(100),
|
||||||
io:format(user, "\tNotCounted = ~p\n", [NotCounted]),
|
File = io_lib:format("/tmp/manager-test.~w.~w.~w",
|
||||||
|
tuple_to_list(time())),
|
||||||
|
{ok, FH} = file:open(File, [write]),
|
||||||
|
io:format(FH, "% NotCounted =\n~p.\n", [NotCounted]),
|
||||||
|
file:close(FH),
|
||||||
|
%% io:format(user, "\tNotCounted = ~p\n", [NotCounted]),
|
||||||
|
io:format(user, "\n\tNotCounted list was written to ~s\n", [File]),
|
||||||
io:format(user, "\tOKs length = ~p\n", [length(OKs)]),
|
io:format(user, "\tOKs length = ~p\n", [length(OKs)]),
|
||||||
io:format(user, "\tTransitions hit = ~p\n", [length(OKs) - length(NotCounted)]),
|
io:format(user, "\tTransitions hit = ~p\n",
|
||||||
|
[length(OKs) - length(NotCounted)]),
|
||||||
%% io:format(user, "\tTransitions = ~p\n", [lists:sort(_Counted)]),
|
%% io:format(user, "\tTransitions = ~p\n", [lists:sort(_Counted)]),
|
||||||
io:format(user, "\tNotCounted length = ~p\n", [length(NotCounted)]),
|
io:format(user, "\tNotCounted length = ~p\n",
|
||||||
|
[length(NotCounted)]),
|
||||||
|
io:format(user, "\tLeast-counted transition = ~p\n",
|
||||||
|
[hd(CountedX)]),
|
||||||
|
io:format(user, "\tMost-counted transition = ~p\n",
|
||||||
|
[lists:last(CountedX)]),
|
||||||
ok
|
ok
|
||||||
end}.
|
end}.
|
||||||
|
|
||||||
|
@ -291,6 +308,7 @@ projection_transition_is_sane(
|
||||||
end,
|
end,
|
||||||
true = lists:prefix(UPI_common_prefix, UPI_list1),
|
true = lists:prefix(UPI_common_prefix, UPI_list1),
|
||||||
true = lists:prefix(UPI_common_prefix, UPI_list2),
|
true = lists:prefix(UPI_common_prefix, UPI_list2),
|
||||||
|
UPI_1_suffix = UPI_list1 -- UPI_common_prefix,
|
||||||
UPI_2_suffix = UPI_list2 -- UPI_common_prefix,
|
UPI_2_suffix = UPI_list2 -- UPI_common_prefix,
|
||||||
|
|
||||||
%% Where did elements in UPI_2_suffix come from?
|
%% Where did elements in UPI_2_suffix come from?
|
||||||
|
@ -303,8 +321,8 @@ projection_transition_is_sane(
|
||||||
%% The UPI_2_suffix must exactly be equal to: ordered items from
|
%% The UPI_2_suffix must exactly be equal to: ordered items from
|
||||||
%% UPI_list1 concat'ed with ordered items from Repairing_list1.
|
%% UPI_list1 concat'ed with ordered items from Repairing_list1.
|
||||||
%% Both temp vars below preserve relative order!
|
%% Both temp vars below preserve relative order!
|
||||||
UPI_2_suffix_from_UPI1 = [X || X <- UPI_2_suffix,
|
UPI_2_suffix_from_UPI1 = [X || X <- UPI_1_suffix,
|
||||||
lists:member(X, UPI_list1)],
|
lists:member(X, UPI_list2)],
|
||||||
UPI_2_suffix_from_Repairing1 = [X || X <- UPI_2_suffix,
|
UPI_2_suffix_from_Repairing1 = [X || X <- UPI_2_suffix,
|
||||||
lists:member(X, Repairing_list1)],
|
lists:member(X, Repairing_list1)],
|
||||||
%% true?
|
%% true?
|
||||||
|
@ -403,6 +421,19 @@ fail3_smoke_test() ->
|
||||||
|
|
||||||
true.
|
true.
|
||||||
|
|
||||||
|
fail4_smoke_test() ->
|
||||||
|
Nodes = [a,b,c],
|
||||||
|
Two = [c,b,a],
|
||||||
|
Three = [c,a,b],
|
||||||
|
P2a= ?MGR:make_projection(2, 1, <<>>, a, Nodes,
|
||||||
|
[], Two, Nodes -- Two, []),
|
||||||
|
P3a= ?MGR:make_projection(3, 2, <<>>, a, Nodes,
|
||||||
|
[], Three, Nodes -- Three, []),
|
||||||
|
true = (projection_transition_is_sane(P2a, P3a) /= true),
|
||||||
|
|
||||||
|
true.
|
||||||
|
|
||||||
|
|
||||||
%% aaa_smoke_test() ->
|
%% aaa_smoke_test() ->
|
||||||
%% L = [a,b,c,d],
|
%% L = [a,b,c,d],
|
||||||
%% Cs = combinations(L),
|
%% Cs = combinations(L),
|
||||||
|
|
Loading…
Reference in a new issue