Add a failing benchmark for vector shrinking
This introduces an ad-hoc framework for making benchmarking
assertions, using cprof.
diff --git a/test/triq_bench_tests.erl b/test/triq_bench_tests.erl
new file mode 100644
index 0000000..b79626f
--- /dev/null
+++ b/test/triq_bench_tests.erl
@@ -0,0 +1,57 @@
+%% Copyright (c) 2018 Krzysztof Jurewicz
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+
+-module(triq_bench_tests).
+
+-include_lib("triq/include/triq.hrl").
+-include_lib("eunit/include/eunit.hrl").
+
+-define(
+ LET_PROF(Prof, FunCall, Assertions),
+ begin
+ _ = cprof:start(),
+ _ = FunCall,
+ _ = cprof:pause(),
+ Prof = cprof:analyse(),
+ _ = cprof:stop(),
+ Assertions
+ end).
+
+-spec call_count(
+ mfa(),
+ {integer(),
+ list(
+ {Mod :: atom(),
+ ModCallCount :: integer(),
+ [{mfa(), integer()}]})})
+ -> integer().
+%% @doc Extract call count for a specific MFA from CProf results.
+call_count({Mod, _, _}=MFA, {_, ResultsPerMod}) ->
+ {_, _, ModResults} = lists:keyfind(Mod, 1, ResultsPerMod),
+ proplists:get_value(MFA, ModResults, 0).
+
+%% When looking for optimization opportunities in Triq, one can try to tighten
+%% assertions in the tests below.
+
+constant_singleton_vector_test() ->
+ ?LET_PROF(
+ Prof,
+ triq:counterexample(
+ ?FORALL(
+ _,
+ vector(1, return(foo)),
+ false)),
+ ?assertMatch(
+ C when C =< 25000, call_count(
+ {triq_dom, shrink_list_members, 4}, Prof))).