<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <link rel="stylesheet" href="style.css" type="text/css"> <meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type"> <link rel="Start" href="pa_monad.html"> <link rel="previous" href="Io.html"> <link rel="Up" href="pa_monad.html"> <link title="Index of types" rel=Appendix href="pa_monad_types.html"> <link title="Index of exceptions" rel=Appendix href="pa_monad_exceptions.html"> <link title="Index of values" rel=Appendix href="pa_monad_values.html"> <link title="Index of modules" rel=Appendix href="pa_monad_modules.html"> <link title="Pa_monad" rel="Chapter" href="Pa_monad.html"> <link title="Cc" rel="Chapter" href="Cc.html"> <link title="Exception" rel="Chapter" href="Exception.html"> <link title="Io" rel="Chapter" href="Io.html"> <link title="Utest" rel="Chapter" href="Utest.html"><title>Utest</title> </head> <body> <div class="navbar"><a href="Io.html">Previous</a> <a href="pa_monad.html">Up</a> </div> <center><h1>Module <a href="type_Utest.html">Utest</a></h1></center> <br> <pre><span class="keyword">module</span> Utest: <code class="code">sig</code> <a href="Utest.html">..</a> <code class="code">end</code></pre><a name="3_SimpleUnitTestFramework"></a> <h3>Simple Unit-Test Framework</h3> <p> <code class="code">Utest</code> supplies a simple framework for performing unit-tests in an Extreme Programming style. It has been influenced by Greg (Gnu REGression testing) and Maas-Maarten Zeeman's oUnit.<br> <hr width="100%"> <br><code><span class="keyword">type</span> <a name="TYPEexpected_test_outcome"></a><code class="type"></code>expected_test_outcome = </code><table class="typetable"> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span class="constructor">ExpectPass</span></code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >We expect to pass the test.</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span class="constructor">ExpectFail</span></code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >We expect to fail the test.</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span class="constructor">ExpectException</span> <span class="keyword">of</span> <code class="type">exn</code></code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >We expect that the given exception will be raised.</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr></table> <div class="info"> The outcome of a test case as the writer of the test suite expects it to be.<br> </div> <br><code><span class="keyword">type</span> <a name="TYPEtest_outcome"></a><code class="type"></code>test_outcome = </code><table class="typetable"> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span class="constructor">Pass</span></code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >We expected passing and we passed.</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span class="constructor">Fail</span></code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >We expected passing but we failed.</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span class="constructor">UPass</span></code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >We expected failing but we did succeed.</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span class="constructor">XFail</span></code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >We expected failed and we failed.</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span class="constructor">Unresolved</span> <span class="keyword">of</span> <code class="type">string</code></code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >An unexpected exception occurred. The argument is the exception's text,</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr></table> <div class="info"> The actual outcome of a test case after it has been run.<br> </div> <br><code><span class="keyword">type</span> <a name="TYPEtest"></a><code class="type"></code>test = </code><table class="typetable"> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span class="constructor">TestCase</span> <span class="keyword">of</span> <code class="type">string * <a href="Utest.html#TYPEexpected_test_outcome">expected_test_outcome</a> * (unit -> bool)</code></code></td> </tr></table> <div class="info"> A test itself.<br> </div> <br><code><span class="keyword">type</span> <a name="TYPEtest_results"></a><code class="type"></code>test_results = {</code><table class="typetable"> <tr> <td align="left" valign="top" > <code> </code></td> <td align="left" valign="top" > <code>total : <code class="type">int</code>;</code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >Total number of test cases attempted</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code> </code></td> <td align="left" valign="top" > <code>passed : <code class="type">int</code>;</code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >Number of passed tests</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code> </code></td> <td align="left" valign="top" > <code>failed : <code class="type">int</code>;</code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >Number of failed tests</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code> </code></td> <td align="left" valign="top" > <code>upassed : <code class="type">int</code>;</code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >Number of unexpectedly passed tests</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code> </code></td> <td align="left" valign="top" > <code>xfailed : <code class="type">int</code>;</code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >Number of expectedly failed tests</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code> </code></td> <td align="left" valign="top" > <code>unresolved : <code class="type">int</code>;</code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >Number of unresolved tests</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr></table> } <div class="info"> Results of some tests.<br> </div> <pre><span class="keyword">val</span> <a name="VALtestcase"></a>testcase : <code class="type">string -> <a href="Utest.html#TYPEexpected_test_outcome">expected_test_outcome</a> -> (unit -> bool) -> <a href="Utest.html#TYPEtest">test</a></code></pre><div class="info"> <code class="code">testcase a_test_title an_expected_outcome a_test_function</code> <p> Create a single testcase of <code class="code">a_test_function</code> with <code class="code">a_test_title</code> and <code class="code">an_expected_outcome</code>. <p> Note that this is a "low-level" function and the two convenience functions <a href="Utest.html#VALexpect_pass"><code class="code">Utest.expect_pass</code></a> and <a href="Utest.html#VALexpect_fail"><code class="code">Utest.expect_fail</code></a> allow for a terser definition of a test.<br> </div> <pre><span class="keyword">val</span> <a name="VALexpect_pass"></a>expect_pass : <code class="type">string -> (unit -> bool) -> <a href="Utest.html#TYPEtest">test</a></code></pre><pre><span class="keyword">val</span> <a name="VALexpect_fail"></a>expect_fail : <code class="type">string -> (unit -> bool) -> <a href="Utest.html#TYPEtest">test</a></code></pre><pre><span class="keyword">val</span> <a name="VALexpect_exception"></a>expect_exception : <code class="type">string -> exn -> (unit -> bool) -> <a href="Utest.html#TYPEtest">test</a></code></pre><pre><span class="keyword">exception</span> <a name="EXCEPTIONInconsistentFixture"></a>InconsistentFixture</pre> <pre><span class="keyword">val</span> <a name="VALeval_with_imperative_fixture"></a>eval_with_imperative_fixture : <code class="type">(unit -> 'a) -> ('a -> <a href="Utest.html#TYPEtest">test</a>) -> ('a -> unit) -> unit -> <a href="Utest.html#TYPEtest">test</a></code></pre><div class="info"> <code class="code">eval_with_imperative_fixture a_setup_function a_test_function a_teardown_function</code> <p> Evaluate <code class="code">a_test_function</code> by passing the result of <code class="code">a_setup_function</code>. After <code class="code">a_test_function</code> completes, pass the result of <code class="code">a_setup_function</code> to <code class="code">a_teardown_function</code>. <p> This is for example useful of <code class="code">a_test_function</code> need the handles of some open files. In this case <code class="code">a_setup_function</code> would open the files and pass the handle (the fixture). <code class="code">a_teardown_function</code> closes the files after <code class="code">a_test_function</code> completes.<br> </div> <pre><span class="keyword">val</span> <a name="VALeval_with_functional_fixture"></a>eval_with_functional_fixture : <code class="type">(unit -> 'a) -> ('a -> <a href="Utest.html#TYPEtest">test</a>) -> unit -> <a href="Utest.html#TYPEtest">test</a></code></pre><br><code><span class="keyword">type</span> <a name="TYPEverbosity"></a><code class="type"></code>verbosity = </code><table class="typetable"> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span class="constructor">PrintNothing</span></code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >Do not print anything</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span class="constructor">PrintFailedTests</span></code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >Only print failed tests</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span class="constructor">PrintTestTotals</span></code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >Show test totals</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span class="constructor">PrintAllTests</span></code></td> <td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >Display each single test</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td> </tr></table> <pre><span class="keyword">val</span> <a name="VALrun_tests"></a>run_tests : <code class="type"><a href="Utest.html#TYPEverbosity">verbosity</a> -> (unit -> <a href="Utest.html#TYPEtest">test</a>) list -> <a href="Utest.html#TYPEtest_results">test_results</a></code></pre><div class="info"> <code class="code">run_tests ~verbose a_list_of_tests</code> <p> Run all tests in <code class="code">a_list_of_tests</code>. The <code class="code">verbose</code> flag controls whether the function prints each test result or just the totals.<br> </div> </body></html>