summaryrefslogtreecommitdiff
path: root/doc/02-writing-tests.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/02-writing-tests.html')
-rw-r--r--doc/02-writing-tests.html119
1 files changed, 119 insertions, 0 deletions
diff --git a/doc/02-writing-tests.html b/doc/02-writing-tests.html
new file mode 100644
index 0000000..152ccac
--- /dev/null
+++ b/doc/02-writing-tests.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="style.css">
+ <title>Writing Tests | lily-test</title>
+</head>
+<body>
+ <div id="flex-root">
+ <iframe id="toc" src="table-of-contents.html"></iframe>
+ <div id="content">
+
+ <h1>Writing Tests</h1>
+
+ <p>A basic unit test file looks like this:</p>
+
+ <pre><code>
+#include "lily-test.h"
+
+LILY_FILE_BEGIN(example_file)
+
+
+LILY_TEST("example test 1")
+{
+ CHECK_EQ(1+1, 2, "%d");
+}
+#include LILY_PUSH_TEST()
+
+
+LILY_TEST("example test 2")
+{
+ CHECK_LT(3.0, 4.0, "%0.2f");
+}
+#include LILY_PUSH_TEST()
+
+
+#define LILY_FILE_END
+#include LILY_REGISTER_TESTS()
+ </code></pre>
+
+ <p>This will define a function pointer <code>example_file</code> with signature <code>void ()</code> that, when called, will execute the two tests and display to stderr any errors that they generate. While there is more boilerplate than in comparable C++ libraries, this means that lily-test supports test auto-registration. To add a new test, just use the <code>LILY_TEST</code> macro as shown, and then follow the function body with <code>#include LILY_PUSH_TEST()</code> to register it. These macros will only work correctly when used between a <code>LILY_FILE_BEGIN</code> and <code>LILY_FILE_END</code> block, and only when used <em>together</em>; using <code>LILY_TEST</code> without a <code>LILY_PUSH_TEST</code> is probably going to throw up a ton of compile errors.</p>
+
+ <h2>Using a single file</h2>
+
+ <p>For very small projects, you may be able to get away with using only a single unit test file. In this case, you should set it up along the following lines:</p>
+
+ <pre><code>
+#define LILY_IMPLEMENTATION
+#include "lily-test.h"
+
+/* any includes or code to get your tests working */
+
+LILY_FILE_BEGIN(tests)
+
+/* test definitions... */
+
+#define LILY_FILE_END
+#include LILY_REGISTER_TESTS()
+
+int main()
+{
+ lily_begin();
+ tests();
+ lily_finish();
+ return 0;
+}
+ </code></pre>
+
+ However, in most cases you will want to have multiple test files.
+
+
+ <h2>Multiple test files</h2>
+
+ <p>You will need, in addition to your unit test files, a header file that contains extern declarations of the function pointers defined by your files and a main C source file that contains a <code>main</code> function to run all of the function pointers. A nice way to set this up is to use X-macros, like this:</p>
+
+ <pre><code>
+/* tests.h */
+
+#define TESTS \
+ X(suite_1) \
+ X(suite_2) \
+ X(suite_3) \
+
+
+#define X(suite) extern void (*suite)();
+TESTS
+#undef X
+ </code></pre>
+
+ <pre><code>
+/* tests_main.c */
+
+#define LILY_IMPLEMENTATION
+#include "lily-test.h"
+
+int main()
+{
+ lily_begin();
+ #define X(suite) suite();
+ TESTS
+ #undef X
+ lily_finish();
+ return 0;
+}
+ </code></pre>
+
+ <p>This is convenient, because it means that when you add a new test file you need only add a single line to the definition of the <code>TESTS</code> macro in <code>tests.h</code> and all of the other relevant code is added for you automatically.<p>
+
+ <p>Note that exactly ONE file should define <code>LILY_IMPLEMENTATION</code>. I find it reasonable to make this the same file with the implementation of <code>main</code> but YMMV.</p>
+
+ </div>
+ </div>
+ <div id="footer">
+ <a id="prev" href="01-introduction.html">⇐ Previous</a>
+ <a id="next" href="03-assertions.html">Next ⇒</a>
+ </div>
+</body>
+</html>