<!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 class="pre" href="Io.html" title="Io">Previous</a> <a class="up" href="pa_monad.html" title="Index">Up</a> </div> <h1>Module <a href="type_Utest.html">Utest</a></h1> <pre><span class="keyword">module</span> Utest: <code class="code">sig</code> <a href="Utest.html">..</a> <code class="code">end</code></pre><div class="info"> <h3 id="3_SimpleUnitTestFramework">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> </div> <hr width="100%"> <pre><code><span id="TYPEexpected_test_outcome"><span class="keyword">type</span> <code class="type"></code>expected_test_outcome</span> = </code></pre><table class="typetable"> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span id="TYPEELTexpected_test_outcome.ExpectPass"><span class="constructor">ExpectPass</span></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 id="TYPEELTexpected_test_outcome.ExpectFail"><span class="constructor">ExpectFail</span></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 id="TYPEELTexpected_test_outcome.ExpectException"><span class="constructor">ExpectException</span></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> <pre><code><span id="TYPEtest_outcome"><span class="keyword">type</span> <code class="type"></code>test_outcome</span> = </code></pre><table class="typetable"> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span id="TYPEELTtest_outcome.Pass"><span class="constructor">Pass</span></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 id="TYPEELTtest_outcome.Fail"><span class="constructor">Fail</span></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 id="TYPEELTtest_outcome.UPass"><span class="constructor">UPass</span></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 id="TYPEELTtest_outcome.XFail"><span class="constructor">XFail</span></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 id="TYPEELTtest_outcome.Unresolved"><span class="constructor">Unresolved</span></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> <pre><code><span id="TYPEtest"><span class="keyword">type</span> <code class="type"></code>test</span> = </code></pre><table class="typetable"> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span id="TYPEELTtest.TestCase"><span class="constructor">TestCase</span></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> <pre><code><span id="TYPEtest_results"><span class="keyword">type</span> <code class="type"></code>test_results</span> = {</code></pre><table class="typetable"> <tr> <td align="left" valign="top" > <code> </code></td> <td align="left" valign="top" > <code><span id="TYPEELTtest_results.total">total</span> :<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><span id="TYPEELTtest_results.passed">passed</span> :<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><span id="TYPEELTtest_results.failed">failed</span> :<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><span id="TYPEELTtest_results.upassed">upassed</span> :<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><span id="TYPEELTtest_results.xfailed">xfailed</span> :<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><span id="TYPEELTtest_results.unresolved">unresolved</span> :<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 id="VALtestcase"><span class="keyword">val</span> testcase</span> : <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 id="VALexpect_pass"><span class="keyword">val</span> expect_pass</span> : <code class="type">string -> (unit -> bool) -> <a href="Utest.html#TYPEtest">test</a></code></pre><div class="info"> <code class="code">expect_pass a_test_title a_test_function</code> <p> Create a testcase of <code class="code">a_test_function</code> with <code class="code">a_test_title</code> that is expected to succeed.<br> </div> <pre><span id="VALexpect_fail"><span class="keyword">val</span> expect_fail</span> : <code class="type">string -> (unit -> bool) -> <a href="Utest.html#TYPEtest">test</a></code></pre><div class="info"> <code class="code">expect_fail a_test_title a_test_function</code> <p> Create a testcase of <code class="code">a_test_function</code> with <code class="code">a_test_title</code> that is expected to fail.<br> </div> <pre><span id="VALexpect_exception"><span class="keyword">val</span> expect_exception</span> : <code class="type">string -> exn -> (unit -> bool) -> <a href="Utest.html#TYPEtest">test</a></code></pre><div class="info"> <code class="code">expect_exception a_test_title an_exception a_test_function</code> <p> Create a testcase of <code class="code">a_test_function</code> with <code class="code">a_test_title</code> that is expected to raise <code class="code">an_exception</code>.<br> </div> <pre><span id="EXCEPTIONInconsistentFixture"><span class="keyword">exception</span> InconsistentFixture</span></pre> <div class="info"> This exception is for the convenience of the user. Raise it if the test data itself is inconsistent.<br> </div> <pre><span id="VALeval_with_imperative_fixture"><span class="keyword">val</span> eval_with_imperative_fixture</span> : <code class="type">(unit -> 'fix) -><br> ('fix -> <a href="Utest.html#TYPEtest">test</a>) -> ('fix -> 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 id="VALeval_with_functional_fixture"><span class="keyword">val</span> eval_with_functional_fixture</span> : <code class="type">(unit -> 'fix) -> ('fix -> <a href="Utest.html#TYPEtest">test</a>) -> unit -> <a href="Utest.html#TYPEtest">test</a></code></pre><div class="info"> <code class="code">eval_with_functional_fixture a_setup_function a_test_function</code> <p> Evaluate <code class="code">a_test_function</code> by passing the result of <code class="code">a_setup_function</code>. <p> This is for example useful if several test functions should be tested with the same data set.<br> </div> <pre><code><span id="TYPEverbosity"><span class="keyword">type</span> <code class="type"></code>verbosity</span> = </code></pre><table class="typetable"> <tr> <td align="left" valign="top" > <code><span class="keyword">|</span></code></td> <td align="left" valign="top" > <code><span id="TYPEELTverbosity.PrintNothing"><span class="constructor">PrintNothing</span></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 id="TYPEELTverbosity.PrintFailedTests"><span class="constructor">PrintFailedTests</span></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 id="TYPEELTverbosity.PrintTestTotals"><span class="constructor">PrintTestTotals</span></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 id="TYPEELTverbosity.PrintAllTests"><span class="constructor">PrintAllTests</span></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> <div class="info"> Verbosity level when running tests<br> </div> <pre><span id="VALrun_tests"><span class="keyword">val</span> run_tests</span> : <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>