# repos_asf_couchdb-triq **Repository Path**: mirrors_community_gitbox_apache/repos_asf_couchdb-triq ## Basic Information - **Project Name**: repos_asf_couchdb-triq - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: upstream - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-07-29 - **Last Updated**: 2026-07-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #+OPTIONS: ^:nil #+TITLE: Triq * [[https://gitlab.com/triq/triq][Triq]] QuickCheck for Erlang ** Introduction :PROPERTIES: :CUSTOM_ID: introduction :END: By and large, the Triq API is modeled closely after QuviQ =eqc=, except you want to replace any occurrence of =eqc= with =triq=. The main supporting module is called =triq_dom=, corresponding to eqc's =eqc_gen=. #+BEGIN_EXPORT html #+END_EXPORT This is a fork of Triq that is being run under the ZeroMQ Collaberation rules, https://rfc.zeromq.org/spec:22 with the one exception being that it is under the Apache licence. ** Obtaining Triq :PROPERTIES: :CUSTOM_ID: using-triq :END: *** Installation via package manager :PROPERTIES: :CUSTOM_ID: installation-via-package-manager :END: To use =triq=, you can add it as a project dependency and let your package manager of choice handle it: rebar.config: ={triq, "1.*"}= erlang.mk: =DEPS = triq= mix.exs: ={:triq, "~> 1.*"}= *** Installation from source into =$ERL_LIBS= :PROPERTIES: :CUSTOM_ID: installation-from-source-into-erl_libs :END: If you want to make =triq= available globally, you can install it from source into your Erlang installation by adding it in one of your =$ERL_LIBS= paths. So, it's either somewhere like =/usr/lib/erlang/lib= or =$HOME/.erl=. You can either download a tagged release from =https://gitlab.com/triq/triq/tags= and extract that or clone the git repo =https://gitlab.com/triq/triq= in the target directory. Once that's done, cd into the directory and run =make=. Now, if you start =erl=, you should be able to call functions from the =triq= module. #+BEGIN_EXAMPLE $ erl 1> code:which(triq). "/usr/lib/erlang/lib/triq/ebin/triq.beam" 2> #+END_EXAMPLE ** Writing QuickCheck properties with Triq :PROPERTIES: :CUSTOM_ID: writing-properties-with-triq :END: To write properties with =triq=, include the header file: #+BEGIN_EXAMPLE erlang -include_lib("triq/include/triq.hrl"). #+END_EXAMPLE And you're ready to write property tests. An example property could be: #+BEGIN_EXAMPLE erlang prop_append() -> ?FORALL({Xs,Ys},{list(int()),list(int())}, lists:reverse(Xs++Ys) == lists:reverse(Ys) ++ lists:reverse(Xs)). #+END_EXAMPLE To test this property, run =triq:check/1=, thus: #+BEGIN_EXAMPLE 1> triq:check(prop_append()). ...................................................................... .............................. Ran 100 tests true 2> #+END_EXAMPLE If the test fails, it will try to shrink the result; here is an example: #+BEGIN_EXAMPLE erlang prop_delete() -> ?FORALL(L,list(int()), ?IMPLIES(L /= [], ?FORALL(I,elements(L), ?WHENFAIL(io:format("L=~p, I=~p~n", [L,I]), not lists:member(I,lists:delete(I,L)))))). #+END_EXAMPLE Which runs like this: #+BEGIN_EXAMPLE 1> triq:check(triq_tests:prop_delete()). x....Failed! L=[4,5,5], I=5 Failed after 5 tests with false Simplified: L = [0,0] I = 0 false 2> #+END_EXAMPLE You can get the values used for the failing test with =counterexample=, and reuse the same test values with =check/2=: #+BEGIN_EXAMPLE 3> A = triq:counterexample(triq_tests:xprop_delete()). x.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFailed! L=[3,2,1,1,1], I=1 Failed after 101 tests with false Simplified: L = [0,0] I = 0 [[0,0],0] 4> A. [[0,0],0] 5> triq:check(triq_tests:xprop_delete(), A). Failed! L=[0,0], I=0 Failed after 1 tests with false Simplified: L = [0,0] I = 0 false 6> #+END_EXAMPLE Modules compiled with the =triq.hrl= header, auto-export all functions named =prop_*=, and have a function added called =check/0= which runs =triq:check/1= on all the properties in the module. #+BEGIN_EXAMPLE 1> mymodule:check(). #+END_EXAMPLE You can also instruct =triq= to generate EUnit tests for each property which allow the module to be treated like an ordinary EUnit test suite. This is highly recommended and avoids the need for =triq= or generic =qc= support in your build/test tool of choice. To achieve that, just make sure to include the attribute =-triq(eunit).= at the top of the module. Thus, the initial =triq.hrl= include would turn into this: #+BEGIN_EXAMPLE erlang -include_lib("triq/include/triq.hrl"). -triq(eunit). #+END_EXAMPLE