<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE fileref SYSTEM "fileref.dtd">
<fileref>
<header>
<copyright>
<year>2012</year><year>2015</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
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.
</legalnotice>
<title>assert.hrl</title>
<prepared></prepared>
<docno></docno>
<date></date>
<rev></rev>
</header>
<file>assert.hrl</file>
<filesummary>Assert Macros</filesummary>
<description>
<p>The include file <c>assert.hrl</c> provides macros for inserting
assertions in your program code.</p>
<p>These macros are defined in the Stdlib include file
<c>assert.hrl</c>. Include the following directive in the module
from which the function is called:</p>
<code type="none">
-include_lib("stdlib/include/assert.hrl").</code>
<p>When an assertion succeeds, the assert macro yields the atom
<c>ok</c>. When an assertion fails, an exception of type <c>error</c> is
instead generated. The associated error term will have the form
<c>{Macro, Info}</c>, where <c>Macro</c> is the name of the macro, for
example <c>assertEqual</c>, and <c>Info</c> will be a list of tagged
values such as <c>[{module, M}, {line, L}, ...]</c> giving more
information about the location and cause of the exception. All entries
in the <c>Info</c> list are optional, and you should not rely
programatically on any of them being present.</p>
<p>If the macro <c>NOASSERT</c> is defined when the <c>assert.hrl</c>
include file is read by the compiler, the macros will be defined as
equivalent to the atom <c>ok</c>. The test will not be performed, and
there will be no cost at runtime.</p>
<p>For example, using <c>erlc</c> to compile your modules, the following
will disable all assertions:</p>
<code type="none">
erlc -DNOASSERT=true *.erl</code>
<p>(The value of <c>NOASSERT</c> does not matter, only the fact that it
is defined.)</p>
<p>A few other macros also have effect on the enabling or disabling of
assertions:</p>
<list type="bulleted">
<item>If <c>NODEBUG</c> is defined, it implies <c>NOASSERT</c>, unless
<c>DEBUG</c> is also defined, which is assumed to take
precedence.</item>
<item>If <c>ASSERT</c> is defined, it overrides <c>NOASSERT</c>, that
is, the assertions will remain enabled.</item>
</list>
<p>If you prefer, you can thus use only <c>DEBUG</c>/<c>NODEBUG</c> as
the main flags to control the behaviour of the assertions (which is
useful if you have other compiler conditionals or debugging macros
controlled by those flags), or you can use <c>ASSERT</c>/<c>NOASSERT</c>
to control only the assert macros.</p>
</description>
<section>
<title>Macros</title>
<taglist>
<tag><c>assert(BoolExpr)</c></tag>
<item><p>Tests that <c>BoolExpr</c> completes normally returning
<c>true</c>.</p>
</item>
<tag><c>assertNot(BoolExpr)</c></tag>
<item><p>Tests that <c>BoolExpr</c> completes normally returning
<c>false</c>.</p>
</item>
<tag><c>assertMatch(GuardedPattern, Expr)</c></tag>
<item><p>Tests that <c>Expr</c> completes normally yielding a value
that matches <c>GuardedPattern</c>. For example:</p>
<code type="none">
?assertMatch({bork, _}, f())</code>
<p>Note that a guard <c>when ...</c> can be included:</p>
<code type="none">
?assertMatch({bork, X} when X > 0, f())</code>
</item>
<tag><c>assertNotMatch(GuardedPattern, Expr)</c></tag>
<item><p>Tests that <c>Expr</c> completes normally yielding a value
that does not match <c>GuardedPattern</c>.</p>
<p>As in <c>assertMatch</c>, <c>GuardedPattern</c> can have a
<c>when</c> part.</p>
</item>
<tag><c>assertEqual(ExpectedValue, Expr)</c></tag>
<item><p>Tests that <c>Expr</c> completes normally yielding a value
that is exactly equal to <c>ExpectedValue</c>.</p>
</item>
<tag><c>assertNotEqual(ExpectedValue, Expr)</c></tag>
<item><p>Tests that <c>Expr</c> completes normally yielding a value
that is not exactly equal to <c>ExpectedValue</c>.</p>
</item>
<tag><c>assertException(Class, Term, Expr)</c></tag>
<item><p>Tests that <c>Expr</c> completes abnormally with an exception
of type <c>Class</c> and with the associated <c>Term</c>. The
assertion fails if <c>Expr</c> raises a different exception or if it
completes normally returning any value.</p>
<p>Note that both <c>Class</c> and <c>Term</c> can be guarded
patterns, as in <c>assertMatch</c>.</p>
</item>
<tag><c>assertNotException(Class, Term, Expr)</c></tag>
<item><p>Tests that <c>Expr</c> does not evaluate abnormally with an
exception of type <c>Class</c> and with the associated <c>Term</c>.
The assertion succeeds if <c>Expr</c> raises a different exception or
if it completes normally returning any value.</p>
<p>As in <c>assertException</c>, both <c>Class</c> and <c>Term</c>
can be guarded patterns.</p>
</item>
<tag><c>assertError(Term, Expr)</c></tag>
<item><p>Equivalent to <c>assertException(error, Term,
Expr)</c></p>
</item>
<tag><c>assertExit(Term, Expr)</c></tag>
<item><p>Equivalent to <c>assertException(exit, Term, Expr)</c></p>
</item>
<tag><c>assertThrow(Term, Expr)</c></tag>
<item><p>Equivalent to <c>assertException(throw, Term, Expr)</c></p>
</item>
</taglist>
</section>
<section>
<title>SEE ALSO</title>
<p><seealso marker="compiler:compile">compile(3)</seealso></p>
<p><seealso marker="erts:erlc">erlc(3)</seealso></p>
</section>
</fileref>