Merge pull request #60 from KrzysiekJ/benchmarks

Vector shrinking is inefficient
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))).