From: Leandro Lucarella Date: Wed, 13 Mar 2013 21:11:32 +0000 (+0100) Subject: Add contents of source/proj/mutest X-Git-Url: https://git.llucax.com/personal/website.git/commitdiff_plain/67a171d9d7972ba345be04aabf7680714214fb2f?ds=sidebyside;hp=f03c5c04202cf08198c99ff4f64ef3597502dd2b Add contents of source/proj/mutest --- diff --git a/source/proj/mutest/index.html b/source/proj/mutest/index.html new file mode 120000 index 0000000..084d26d --- /dev/null +++ b/source/proj/mutest/index.html @@ -0,0 +1 @@ +manual.html \ No newline at end of file diff --git a/source/proj/mutest/manual.html b/source/proj/mutest/manual.html new file mode 100644 index 0000000..0221ff4 --- /dev/null +++ b/source/proj/mutest/manual.html @@ -0,0 +1,909 @@ + + + + + + +mutest - A simple micro unit testing framework for C + + + + + + +
+

mutest - A simple micro unit testing framework for C

+ +++ + + + + + + + + + + + +
Author:Leandro Lucarella
Contact:llucax@gmail.com
Version:1.0
Date:2013-02-17
Copyright:Leandro Lucarella (2008), released under the BOLA license
+
+

Abstract

+

mutest is a micro unit testing framework for C (with some +C++ support). It's mostly an idea (it even comes with +2 implementations of the idea!) with the goal of being easy to use +(just write your test cases grouped in test suites and you're +set) and so small and simple that you don't mind to copy the files to +your project and just use it (i.e., no dependencies).

+

The idea is simple: a source file is a test suite, a function is +a test case (special functions can be used for test suite +initialization and termination), which can can have several checks. +Checks comes in 2 flavors, one that only prints an error, and one that +terminates the current test case too. A (normally) automated test +program run all the test suites and print some stats. It fails +(returns non-zero) if any test suite fails.

+

+ +

+
+ +
+

1.   Installation

+

Download the latest distribution tarball and uncompress it.

+

You can also download any release from the releases directory or get it +using Git directly from the Git repository.

+

You can get this manual too, or a PDF version of it.

+

To actually install mutest run:

+
+$ make install
+
+

Default installation path is /usr/local (because of that, you'll probably +need superuser privileges to install to the default location). You can override +that by passing the prefix make variable, for example:

+
+$ make prefix=/opt/mutest install
+
+

If you want to install just the docs, you can do:

+
+$ make install-doc
+
+

Or even install-readme, install-html or install-pdf if you are too +picky.

+

If you want to install just one particular implementation, to can use the +install-c and install-py targets.

+
+
+

2.   Quick Sample

+

You can find some samples in the sample directory.

+

This is an example taken from there. A simple module called factorial.c +with its corresponding test suite (factorial_test.c).

+

You can see some C++ support in the exception_test.cpp test suite.

+
+

2.1.   factorial.c

+
+/*
+ * This file is part of mutest, a simple micro unit testing framework for C.
+ *
+ * mutest was written by Leandro Lucarella <llucax@gmail.com> and is released
+ * under the BOLA license, please see the LICENSE file or visit:
+ * http://blitiri.com.ar/p/bola/
+ *
+ * This is an example module that calculates a factorial.
+ *
+ * Please, read the README file for more details.
+ */
+
+unsigned factorial(unsigned x) {
+        if (x <= 1)
+                return 1;
+        return x * factorial(x-1);
+}
+
+
+
+

2.2.   factorial_test.c

+
+/*
+ * This file is part of mutest, a simple micro unit testing framework for C.
+ *
+ * mutest was written by Leandro Lucarella <llucax@gmail.com> and is released
+ * under the BOLA license, please see the LICENSE file or visit:
+ * http://blitiri.com.ar/p/bola/
+ *
+ * This is the factorial module test suite. Each (public) function starting
+ * with mu_test will be picked up by mkmutest as a test case.
+ *
+ * Please, read the README file for more details.
+ */
+
+#include "factorial.h"
+
+#include "../mutest.h"
+
+void mu_test_factorial_zero() {
+        unsigned x = factorial(0);
+        mu_check(x == 1);
+}
+
+void mu_test_factorial_one() {
+        unsigned x = factorial(1);
+        /* this test is wrong on purpose, to see how it fails */
+        mu_check(x == 2);
+}
+
+void mu_test_factorial_positive() {
+        unsigned x = factorial(2);
+        /* this test is wrong on purpose, to see how it fails */
+        mu_check(x == 3);
+
+        x = factorial(3);
+        /* we don't want to continue if this fails, because the next result
+         * depends on this one. This one will succeed. */
+        mu_ensure(x == 6);
+
+        x = factorial(x);
+        mu_check(x == 720);
+
+        x = factorial(4);
+        mu_ensure(x == 6); /* same as before, but this one will fail. */
+
+        x = factorial(x-15); /* and this will never be executed */
+        mu_check(x == 362881); /* but if excecuted, will fail */
+}
+
+
+
+

2.3.   exception_test.cpp

+
+/*
+ * This file is part of mutest, a simple micro unit testing framework for C.
+ *
+ * mutest was written by Leandro Lucarella <llucax@gmail.com> and is released
+ * under the BOLA license, please see the LICENSE file or visit:
+ * http://blitiri.com.ar/p/bola/
+ *
+ * This is a C++ module test suite. It shows how to use checks involving
+ * exceptions.
+ *
+ * Please, read the README file for more details.
+ */
+
+#include <stdexcept> // std::out_of_range
+#include <vector> // std::vector
+
+#include "../mutest.h"
+
+extern "C" {
+
+void mu_test_exceptions() {
+        std::vector<int> v(1);
+        // ok
+        mu_check(v.at(0) == 0);
+        // throws! This fails
+        mu_check(v.at(1) == 0);
+        // ok, we expect the exception to be thrown, and it does
+        mu_echeck(std::out_of_range, v.at(1));
+        // fails! We expect this to throw, but it doesn't
+        mu_echeck(std::out_of_range, v.at(0));
+        // fails again, but this time the show is over (note the "ensure")
+        mu_eensure(std::out_of_range, v.at(0));
+        // this will never be executed (it should fail if it is)
+        mu_check(v.empty());
+}
+
+} // extern "C"
+
+
+
+
+

3.   Concepts

+

mutest is about 4 simple concepts: test program, test suite, test +case and checks. Well, to be honest you probably will need test suite +initialization and termination too =)

+
+

3.1.   Test Program

+

A test program is the higher level unit of mutest. The test program is +the one in charge of running all your tests. Probably one of the more important +features of mutest is that you are not supposed to bother about the test +program. So, different implementations have different ways to tackle this. +Some need more or less interactions from your part, and each have their pros +and cons.

+

But this is all you need to know for now, for more details see how the test +program is implemented by your implementation of choice.

+
+
+

3.2.   Test Suite

+

A test suite is the higher level unit of mutest that you should +care about =). Is not much more than a way to group test cases. Code-wise, +a test suite is a C (or C++) module (or compilation unit). Not clear enough? +A unit test is an object file (could be a shared object depending on the +implementation). This module should have one or more test cases and it +could have any number (including zero) of initialization and termination +functions.

+

A test suite, is inspected by the test program for test cases and +initialization and termination functions, and run them.

+

A test suite fail if one or more test cases fail, and it's skipped if one or +more initialization functions fail (or, depending on the implementation, if +the test suite can't be loaded at all).

+
+
+

3.3.   Test Case

+

A test case is just a plain function with a special signature and name. +A test case function name must start with mu_test, and take no arguments +and return nothing. For example:

+
+void mu_test_something(void);
+
+

A test case (probably) only make sense if it has checks. A test case succeed +only if all its checks succeed too.

+

Test are executed in an implementation-dependant order, but usually the +default order is alphabetical.

+
+
+

3.4.   Checks

+

Checks are assertions that a test case must pass (a boolean expression that +must evaluate to true). There are 2 big flavors of checks: check and +ensure. check just print an error (and mark the test case as +failed) and ensure halt the test case execution, jumping to the next +one.

+

For better C++ support there are check macros that assert that a specified +exception is thrown (instead of check for a boolean expression to evaluate to +true).

+

You can take a look at the reference to see the different flavors of check +macros in more detail.

+
+
+

3.5.   Initialization

+

Sometimes you need to setup some environment shared between all the test +cases in a test suite. You can use initialization functions for this.

+

An initialization function, like a test case, is a plain C function with +a special name and signature. The name must start with mu_init and it must +take no arguments, and return an error code (0 being success). For +example:

+
+int mu_init_something(void);
+
+

All initialization functions are executed before any test case, in an +implementation-dependant order, and if one of them fail (returns non-zero), +the whole test suite is skipped immediately.

+
+
+

3.6.   Termination

+

Termination functions are just like initialization functions, but they're +executed after the test cases, their names start with mu_term and +they return nothing. For example:

+
+void mu_term_something(void);
+
+
+
+
+

4.   C++ Support

+

You can use mutest with C++, the only care you must take is that, because of +C++ name mangling (and mutest relaying on function names), you must +declare your test cases and initialization and termination functions as +extern "C" (see exception_test.cpp for an example).

+

Checks become exception-safe when using mutest with a C++ compiler, and +2 extra checks designed for C++ get defined (mu_echeck() and +mu_eensure()). They assert that an expression throws a particular exception.

+
+
+

5.   Implementations

+

There are 2 big groups of possible implementations that I can think +of: static and dynamic.

+

mutest comes with one implementation of each group.

+
+

5.1.   Static Implementations

+

Static implementations can be only written in C/C++ (or other language that is +link-compatible with C, like the D Programming Language, but since one of +the main goals of mutest is avoid unnecessary dependencies, you probably +don't want to depend on an extra language/compiler to run your tests =).

+

The main advantage is better debugging support, because you can run the test +program in a standard debugger and see what happens with test cases very +naturally.

+

The main disadvantage is, the test suites must be figured out in +compile-time, usually using some kind of code generation (if you want to +avoid writing repetitive code yourself). There's also a limitation in the test +case, initialization and termination functions names: they should be unique +for all the test program.

+
+

5.1.1.   C implementation

+

mutest comes with a C static implementation. Only 3 files are needed: +mutest.c (the user-independent part of the test program), mkmutest +(a bash script for generating the user-dependent part of the test program) +and mutest.h (the header file that test suites should include).

+

You can copy this 3 files to your project or install them at system-level and +use them globally.

+

The procedure is simple, You should compile you test suites, mutest.c +and the generated output of mkmutest as object files and link them +together.

+

For example:

+
+$ cc -c -o mutest.o mutest.c
+$ cc -c -o test1.o test1.c
+$ cc -c -o test2.o test2.c
+$ mkmutest mutest.h test1.o test2.o | cc -xc -c -o runmutest.o -
+$ cc -o testprg mutest.o test1.o test2.o runmutest.o
+
+

Then you can run the test program invoking it with no arguments:

+
+$ ./testprg
+
+
+

5.1.1.1.   mkmutest Invocation

+

This small script take 1 mandatory positional argument: the path to the +mutest.h file. All remaining positional arguments should be object files +representing test suites.

+
+
+

5.1.1.2.   Test Program Invocation

+

The test program can be invoked without arguments, but can take some extra +options:

+
+
-v
+

Be verbose. This is accumulative, when you add extra -v you will +get extra verbosity.

+

By default, you just get failed checks printed. If you use a single +-v, a summary of failed/passed test suites, test cases and +checks will be printed. If an extra -v is used, you'll see the current +test suite being executed. Another -v and you'll get the current +test case, and another one, and you'll get each check.

+
+
+
+
+

5.1.1.3.   Dependencies

+

Even when dependencies are kept minimal, there always be a few ;)

+

To use this implementation you just need:

+
    +
  • A C compiler (you already needed that, so...)
  • +
  • The nm program (from GNU Binutils, included in virtually any *NIX)
  • +
  • The GNU Bash shell interpreter (also included in virtually any *NIX)
  • +
+
+
+
+
+

5.2.   Dynamic Implementations

+

Dynamic implementations, on the other hand, can be written in any language that +can access to shared objects. The idea is to inspect a shared object for test +suites and run them, without requiring any information about test suites +at compile time.

+

There are several advantages in this kind of implementations. The dynamic +nature let you completely separate the test program from the user-written +test suites and you can choose at run-time what test suites to execute +by just selecting the correct shared objects. Also, test case, +initialization and termination functions names only have to be unique in the +scope of the test suites, because test suites are completely isolated in +separate shared objects.

+

But everything comes at a price, and the higher price to pay is +debuggability. It's a little harder to plug a debugger to a shared object.

+
+

5.2.1.   Python implementation

+

This implementation is much simpler and elegant than the C implementation. +Only 2 files are needed: mutest (test program written in Python using +ctypes module to access the shared object symbols) and mutest.h (the +header file that test suites should include).

+

Since both implementations provided by mutest share the same mutest.h, +you should define the MUTEST_PY macro when compiling the test suites if +you will run them using this implementation.

+

As with the C implementation, you can copy this 2 files to your project or +install them at system-level and use them globally.

+

The procedure is even simpler than the C implementation: compile and link +you test suites as shared objects and then run the mutest program +passing the shared objects as arguments. For example:

+
+$ cc -c -fPIC -DMUTEST_PY -o test1.o test1.c
+$ cc -shared -o test1.so test1.o
+$ cc -c -fPIC -DMUTEST_PY -o test2.o test2.c
+$ cc -shared -o test2.so test2.o
+$ mutest test1.so test2.so
+
+

That's it.

+
+

5.2.1.1.   mutest Invocation

+

mutest program takes test suites shared objects to run as positional +arguments. It accepts the same options as the C implementation's test +program and some extra options are accepted too:

+
+
--verbose
+
Alias for -v.
+
-q, --quiet
+
Be quiet (no output is shown at all).
+
-s, --search
+
Search for test suites (*.so) in the current directory and add them +to the list of test suites to run.
+
-h, --help
+
Show a help message and exit.
+
+
+
+

5.2.1.2.   Dependencies

+

As with the C implementation, some minor dependencies are needed:

+
    +
  • Python (2.5 or later)
  • +
  • The nm program (from GNU Binutils, included in virtually any *NIX)
  • +
+

You will need a C compiler for building the test suites too, but technically +is not needed by mutest itself ;)

+
+
+
+
+
+

6.   Reference

+
+

6.1.   mu_check()

+
+
Synopsis
+
mu_check(expression)
+
Description
+
Check that the expression evaluates to true. Continue with the +test case if fail.
+
Availability
+
Always
+
Example
+
+void mu_test(void)
+{
+    mu_check(5 == 4); /* fail */
+    mu_check(5 == 5); /* excecuted, pass */
+}
+
+
+
+
+
+

6.2.   mu_ensure()

+
+
Synopsis
+
mu_ensure(expression)
+
Description
+
Check that the expression evaluates to true. Interrupt the test +case if fail.
+
Availability
+
Always
+
Example
+
+void mu_test(void)
+{
+    mu_ensure(5 == 4); /* fail */
+    mu_check(5 == 5); /* not excecuted */
+}
+
+
+
+
+
+

6.3.   mu_echeck()

+
+
Synopsis
+
mu_echeck(class, expression)
+
Description
+
Check that the expression throws a specific exception class (or +subclass). Continue with the test case if fail.
+
Availability
+
C++ only
+
Example
+
+#include <stdexcept>
+
+extern "C"
+{
+    void mu_test(void)
+    {
+        mu_echeck(std::exception, true); /* fail */
+        mu_echeck(std::exception,
+                throw std::runtime_error("!")); /* excecuted, pass */
+    }
+}
+
+
+
+
+
+

6.4.   mu_eensure()

+
+
Synopsis
+
mu_eensure(class, expression)
+
Description
+
Check that the expression throws a specific exception class (or +subclass). Interrupt the test case if fail.
+
Availability
+
C++ only
+
Example
+
+#include <stdexcept>
+
+extern "C"
+{
+    void mu_test(void)
+    {
+        mu_eensure(std::exception, true); /* fail */
+        mu_echeck(std::exception,
+                throw std::runtime_error("!")); /* not excecuted */
+    }
+}
+
+
+
+
+
+
+

7.   About

+

This manual was written using reStructuredText.

+ + + + + +
+
+ + diff --git a/source/proj/mutest/manual.pdf b/source/proj/mutest/manual.pdf new file mode 100644 index 0000000..4a18909 --- /dev/null +++ b/source/proj/mutest/manual.pdf @@ -0,0 +1,6874 @@ +%PDF-1.4 +%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com +% 'BasicFonts': class PDFDictionary +1 0 obj +% The standard fonts dictionary +<< /F1 2 0 R + /F2 3 0 R + /F3 4 0 R + /F4 7 0 R + /F5 57 0 R + /F6 171 0 R + /F7 174 0 R >> +endobj +% 'F1': class PDFType1Font +2 0 obj +% Font Helvetica +<< /BaseFont /Helvetica + /Encoding /WinAnsiEncoding + /Name /F1 + /Subtype /Type1 + /Type /Font >> +endobj +% 'F2': class PDFType1Font +3 0 obj +% Font Helvetica-BoldOblique +<< /BaseFont /Helvetica-BoldOblique + /Encoding /WinAnsiEncoding + /Name /F2 + /Subtype /Type1 + /Type /Font >> +endobj +% 'F3': class PDFType1Font +4 0 obj +% Font Helvetica-Bold +<< /BaseFont /Helvetica-Bold + /Encoding /WinAnsiEncoding + /Name /F3 + /Subtype /Type1 + /Type /Font >> +endobj +% 'Annot.NUMBER1': class PDFDictionary +5 0 obj +<< /A << /S /URI + /Type /Action + /URI (mailto:llucax@gmail.com) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 153.7323 + 680.7736 + 526.5827 + 692.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER2': class PDFDictionary +6 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://blitiri.com.ar/p/bola/) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 357.1723 + 635.7736 + 386.6323 + 647.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'F4': class PDFType1Font +7 0 obj +% Font Helvetica-Oblique +<< /BaseFont /Helvetica-Oblique + /Encoding /WinAnsiEncoding + /Name /F4 + /Subtype /Type1 + /Type /Font >> +endobj +% 'Annot.NUMBER3': class PDFDictionary +8 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://en.wikipedia.org/wiki/Unit_testing) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 141.0429 + 587.7736 + 192.1829 + 599.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER4': class LinkAnnotation +9 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 768.5236 + 0 ] + /Rect [ 317.2029 + 587.7736 + 372.2329 + 599.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER5': class LinkAnnotation +10 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 651.5236 + 0 ] + /Rect [ 91.59291 + 575.7736 + 167.1729 + 587.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER6': class LinkAnnotation +11 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 441.7529 + 575.7736 + 489.5529 + 587.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER7': class LinkAnnotation +12 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 73.25291 + 563.7736 + 121.0529 + 575.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER8': class LinkAnnotation +13 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 223.8629 + 539.7736 + 263.8829 + 551.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER9': class LinkAnnotation +14 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 333.9229 + 539.7736 + 376.7229 + 551.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER10': class LinkAnnotation +15 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 62.69291 + 527.7736 + 102.7129 + 539.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER11': class LinkAnnotation +16 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 348.8236 + 0 ] + /Rect [ 105.4929 + 527.7736 + 159.9529 + 539.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER12': class LinkAnnotation +17 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 181.6236 + 0 ] + /Rect [ 179.4129 + 527.7736 + 228.8729 + 539.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER13': class LinkAnnotation +18 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 468.8236 + 0 ] + /Rect [ 363.3729 + 527.7736 + 394.4929 + 539.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER14': class LinkAnnotation +19 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 468.8236 + 0 ] + /Rect [ 400.0529 + 527.7736 + 436.1729 + 539.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER15': class LinkAnnotation +20 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 348.9529 + 515.7736 + 391.7529 + 527.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER16': class LinkAnnotation +21 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 209.8236 + 0 ] + /Rect [ 62.69291 + 503.7736 + 121.6029 + 515.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER17': class LinkAnnotation +22 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 168.2929 + 503.7736 + 216.0929 + 515.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER18': class LinkAnnotation +23 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 450.0729 + 503.7736 + 492.8729 + 515.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Page1': class PDFPage +24 0 obj +% Page dictionary +<< /Annots [ 5 0 R + 6 0 R + 8 0 R + 9 0 R + 10 0 R + 11 0 R + 12 0 R + 13 0 R + 14 0 R + 15 0 R + 16 0 R + 17 0 R + 18 0 R + 19 0 R + 20 0 R + 21 0 R + 22 0 R + 23 0 R ] + /Contents 255 0 R + /MediaBox [ 0 + 0 + 595.2756 + 841.8898 ] + /Parent 254 0 R + /Resources << /Font 1 0 R + /ProcSet [ /PDF + /Text + /ImageB + /ImageC + /ImageI ] >> + /Rotate 0 + /Trans << >> + /Type /Page >> +endobj +% 'Annot.NUMBER19': class LinkAnnotation +25 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 99 0 R + /XYZ + 62.69291 + 204.0236 + 0 ] + /Rect [ 62.69291 + 723.7736 + 132.1629 + 735.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER20': class LinkAnnotation +26 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 99 0 R + /XYZ + 62.69291 + 204.0236 + 0 ] + /Rect [ 527.0227 + 723.7736 + 532.5827 + 735.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER21': class LinkAnnotation +27 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 108 0 R + /XYZ + 62.69291 + 559.4236 + 0 ] + /Rect [ 62.69291 + 705.7736 + 145.5129 + 717.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER22': class LinkAnnotation +28 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 108 0 R + /XYZ + 62.69291 + 559.4236 + 0 ] + /Rect [ 527.0227 + 705.7736 + 532.5827 + 717.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER23': class LinkAnnotation +29 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 108 0 R + /XYZ + 62.69291 + 460.4236 + 0 ] + /Rect [ 82.69291 + 687.7736 + 150.5029 + 699.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER24': class LinkAnnotation +30 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 108 0 R + /XYZ + 62.69291 + 460.4236 + 0 ] + /Rect [ 527.0227 + 687.7736 + 532.5827 + 699.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER25': class LinkAnnotation +31 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 109 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Rect [ 82.69291 + 669.7736 + 172.1829 + 681.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER26': class LinkAnnotation +32 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 109 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Rect [ 527.0227 + 669.7736 + 532.5827 + 681.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER27': class LinkAnnotation +33 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Rect [ 82.69291 + 651.7736 + 191.0929 + 663.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER28': class LinkAnnotation +34 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Rect [ 527.0227 + 651.7736 + 532.5827 + 663.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER29': class LinkAnnotation +35 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 269.8236 + 0 ] + /Rect [ 62.69291 + 633.7736 + 124.9329 + 645.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER30': class LinkAnnotation +36 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 269.8236 + 0 ] + /Rect [ 527.0227 + 633.7736 + 532.5827 + 645.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER31': class LinkAnnotation +37 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 206.8236 + 0 ] + /Rect [ 82.69291 + 615.7736 + 168.2829 + 627.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER32': class LinkAnnotation +38 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 206.8236 + 0 ] + /Rect [ 527.0227 + 615.7736 + 532.5827 + 627.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER33': class LinkAnnotation +39 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Rect [ 82.69291 + 597.7736 + 152.7329 + 609.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER34': class LinkAnnotation +40 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Rect [ 527.0227 + 597.7736 + 532.5827 + 609.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER35': class LinkAnnotation +41 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 609.0236 + 0 ] + /Rect [ 82.69291 + 579.7736 + 153.2829 + 591.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER36': class LinkAnnotation +42 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 609.0236 + 0 ] + /Rect [ 527.0227 + 579.7736 + 532.5827 + 591.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER37': class LinkAnnotation +43 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 465.8236 + 0 ] + /Rect [ 82.69291 + 561.7736 + 141.0529 + 573.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER38': class LinkAnnotation +44 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 465.8236 + 0 ] + /Rect [ 527.0227 + 561.7736 + 532.5827 + 573.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER39': class LinkAnnotation +45 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 345.8236 + 0 ] + /Rect [ 82.69291 + 543.7736 + 159.9529 + 555.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER40': class LinkAnnotation +46 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 345.8236 + 0 ] + /Rect [ 527.0227 + 543.7736 + 532.5827 + 555.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER41': class LinkAnnotation +47 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 178.6236 + 0 ] + /Rect [ 82.69291 + 525.7736 + 160.5029 + 537.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER42': class LinkAnnotation +48 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 178.6236 + 0 ] + /Rect [ 527.0227 + 525.7736 + 532.5827 + 537.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER43': class LinkAnnotation +49 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Rect [ 62.69291 + 507.7736 + 139.3829 + 519.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER44': class LinkAnnotation +50 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Rect [ 527.0227 + 507.7736 + 532.5827 + 519.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER45': class LinkAnnotation +51 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 648.0236 + 0 ] + /Rect [ 62.69291 + 489.7736 + 158.8329 + 501.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER46': class LinkAnnotation +52 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 648.0236 + 0 ] + /Rect [ 527.0227 + 489.7736 + 532.5827 + 501.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER47': class LinkAnnotation +53 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 579.0236 + 0 ] + /Rect [ 82.69291 + 471.7736 + 208.8629 + 483.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER48': class LinkAnnotation +54 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 579.0236 + 0 ] + /Rect [ 527.0227 + 471.7736 + 532.5827 + 483.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER49': class LinkAnnotation +55 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 435.0236 + 0 ] + /Rect [ 102.6929 + 453.7736 + 213.8529 + 465.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER50': class LinkAnnotation +56 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 435.0236 + 0 ] + /Rect [ 527.0227 + 453.7736 + 532.5827 + 465.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'F5': class PDFType1Font +57 0 obj +% Font Courier +<< /BaseFont /Courier + /Encoding /WinAnsiEncoding + /Name /F5 + /Subtype /Type1 + /Type /Font >> +endobj +% 'Annot.NUMBER51': class LinkAnnotation +58 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 165.6236 + 0 ] + /Rect [ 122.6929 + 435.7736 + 164.3929 + 447.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER52': class LinkAnnotation +59 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 165.6236 + 0 ] + /Rect [ 164.3929 + 435.7736 + 218.3929 + 447.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER53': class LinkAnnotation +60 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 165.6236 + 0 ] + /Rect [ 218.3929 + 435.7736 + 263.9729 + 447.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER54': class LinkAnnotation +61 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 165.6236 + 0 ] + /Rect [ 527.0227 + 435.7736 + 532.5827 + 447.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER55': class LinkAnnotation +62 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 111.6236 + 0 ] + /Rect [ 122.6929 + 417.7736 + 273.3229 + 429.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER56': class LinkAnnotation +63 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 111.6236 + 0 ] + /Rect [ 527.0227 + 417.7736 + 532.5827 + 429.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER57': class LinkAnnotation +64 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 207 0 R + /XYZ + 62.69291 + 672.0236 + 0 ] + /Rect [ 122.6929 + 399.7736 + 228.3129 + 411.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER58': class LinkAnnotation +65 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 207 0 R + /XYZ + 62.69291 + 672.0236 + 0 ] + /Rect [ 527.0227 + 399.7736 + 532.5827 + 411.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER59': class LinkAnnotation +66 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 207 0 R + /XYZ + 62.69291 + 558.0236 + 0 ] + /Rect [ 82.69291 + 381.7736 + 222.7429 + 393.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER60': class LinkAnnotation +67 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 207 0 R + /XYZ + 62.69291 + 558.0236 + 0 ] + /Rect [ 527.0227 + 381.7736 + 532.5827 + 393.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER61': class LinkAnnotation +68 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 207 0 R + /XYZ + 62.69291 + 390.0236 + 0 ] + /Rect [ 102.6929 + 363.7736 + 237.7629 + 375.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER62': class LinkAnnotation +69 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 207 0 R + /XYZ + 62.69291 + 390.0236 + 0 ] + /Rect [ 527.0227 + 363.7736 + 532.5827 + 375.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER63': class LinkAnnotation +70 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 207 0 R + /XYZ + 62.69291 + 129.8236 + 0 ] + /Rect [ 122.6929 + 345.7736 + 164.3929 + 357.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER64': class LinkAnnotation +71 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 207 0 R + /XYZ + 62.69291 + 129.8236 + 0 ] + /Rect [ 164.3929 + 345.7736 + 206.3929 + 357.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER65': class LinkAnnotation +72 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 207 0 R + /XYZ + 62.69291 + 129.8236 + 0 ] + /Rect [ 206.3929 + 345.7736 + 251.9729 + 357.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER66': class LinkAnnotation +73 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 207 0 R + /XYZ + 62.69291 + 129.8236 + 0 ] + /Rect [ 527.0227 + 345.7736 + 532.5827 + 357.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER67': class LinkAnnotation +74 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 216 0 R + /XYZ + 62.69291 + 633.0236 + 0 ] + /Rect [ 122.6929 + 327.7736 + 228.3129 + 339.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER68': class LinkAnnotation +75 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 216 0 R + /XYZ + 62.69291 + 633.0236 + 0 ] + /Rect [ 527.0227 + 327.7736 + 532.5827 + 339.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER69': class LinkAnnotation +76 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 216 0 R + /XYZ + 62.69291 + 537.0236 + 0 ] + /Rect [ 62.69291 + 309.7736 + 127.7229 + 321.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER70': class LinkAnnotation +77 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 216 0 R + /XYZ + 62.69291 + 537.0236 + 0 ] + /Rect [ 527.0227 + 309.7736 + 532.5827 + 321.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER71': class LinkAnnotation +78 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 216 0 R + /XYZ + 62.69291 + 504.0236 + 0 ] + /Rect [ 82.69291 + 291.7736 + 107.7129 + 303.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER72': class LinkAnnotation +79 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 216 0 R + /XYZ + 62.69291 + 504.0236 + 0 ] + /Rect [ 107.7129 + 291.7736 + 167.7129 + 303.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER73': class LinkAnnotation +80 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 216 0 R + /XYZ + 62.69291 + 504.0236 + 0 ] + /Rect [ 527.0227 + 291.7736 + 532.5827 + 303.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER74': class LinkAnnotation +81 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 216 0 R + /XYZ + 62.69291 + 286.8236 + 0 ] + /Rect [ 82.69291 + 273.7736 + 107.7129 + 285.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER75': class LinkAnnotation +82 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 216 0 R + /XYZ + 62.69291 + 286.8236 + 0 ] + /Rect [ 107.7129 + 273.7736 + 173.7129 + 285.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER76': class LinkAnnotation +83 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 216 0 R + /XYZ + 62.69291 + 286.8236 + 0 ] + /Rect [ 527.0227 + 273.7736 + 532.5827 + 285.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER77': class LinkAnnotation +84 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 221 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Rect [ 82.69291 + 255.7736 + 107.7129 + 267.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER78': class LinkAnnotation +85 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 221 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Rect [ 107.7129 + 255.7736 + 173.7129 + 267.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER79': class LinkAnnotation +86 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 221 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Rect [ 521.4627 + 255.7736 + 532.5827 + 267.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER80': class LinkAnnotation +87 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 221 0 R + /XYZ + 62.69291 + 463.8236 + 0 ] + /Rect [ 82.69291 + 237.7736 + 107.7129 + 249.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER81': class LinkAnnotation +88 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 221 0 R + /XYZ + 62.69291 + 463.8236 + 0 ] + /Rect [ 107.7129 + 237.7736 + 179.7129 + 249.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER82': class LinkAnnotation +89 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 221 0 R + /XYZ + 62.69291 + 463.8236 + 0 ] + /Rect [ 521.4627 + 237.7736 + 532.5827 + 249.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER83': class LinkAnnotation +90 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 221 0 R + /XYZ + 62.69291 + 162.6236 + 0 ] + /Rect [ 62.69291 + 219.7736 + 108.2529 + 231.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER84': class LinkAnnotation +91 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 221 0 R + /XYZ + 62.69291 + 162.6236 + 0 ] + /Rect [ 521.4627 + 219.7736 + 532.5827 + 231.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER85': class PDFDictionary +92 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://proj.llucax.com.ar/home/mutest/releases/mutest.tar.gz) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 126.6129 + 165.7736 + 234.4329 + 177.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER86': class PDFDictionary +93 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://proj.llucax.com.ar/home/mutest/releases/) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 273.0328 + 147.7736 + 357.2828 + 159.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER87': class PDFDictionary +94 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://git.or.cz/) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 425.2127 + 147.7736 + 442.0527 + 159.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER88': class PDFDictionary +95 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://git.llucax.com.ar/w/software/mutest.git) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 519.8027 + 147.7736 + 531.3027 + 159.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER89': class PDFDictionary +96 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://git.llucax.com.ar/w/software/mutest.git) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 62.69291 + 135.7736 + 106.5929 + 147.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER90': class PDFDictionary +97 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://proj.llucax.com.ar/home/mutest/manual.html) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 118.8429 + 117.7736 + 172.7529 + 129.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER91': class PDFDictionary +98 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://proj.llucax.com.ar/home/mutest/manual.pdf) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 212.2229 + 117.7736 + 270.0129 + 129.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Page2': class PDFPage +99 0 obj +% Page dictionary +<< /Annots [ 25 0 R + 26 0 R + 27 0 R + 28 0 R + 29 0 R + 30 0 R + 31 0 R + 32 0 R + 33 0 R + 34 0 R + 35 0 R + 36 0 R + 37 0 R + 38 0 R + 39 0 R + 40 0 R + 41 0 R + 42 0 R + 43 0 R + 44 0 R + 45 0 R + 46 0 R + 47 0 R + 48 0 R + 49 0 R + 50 0 R + 51 0 R + 52 0 R + 53 0 R + 54 0 R + 55 0 R + 56 0 R + 58 0 R + 59 0 R + 60 0 R + 61 0 R + 62 0 R + 63 0 R + 64 0 R + 65 0 R + 66 0 R + 67 0 R + 68 0 R + 69 0 R + 70 0 R + 71 0 R + 72 0 R + 73 0 R + 74 0 R + 75 0 R + 76 0 R + 77 0 R + 78 0 R + 79 0 R + 80 0 R + 81 0 R + 82 0 R + 83 0 R + 84 0 R + 85 0 R + 86 0 R + 87 0 R + 88 0 R + 89 0 R + 90 0 R + 91 0 R + 92 0 R + 93 0 R + 94 0 R + 95 0 R + 96 0 R + 97 0 R + 98 0 R ] + /Contents 256 0 R + /MediaBox [ 0 + 0 + 595.2756 + 841.8898 ] + /Parent 254 0 R + /Resources << /Font 1 0 R + /ProcSet [ /PDF + /Text + /ImageB + /ImageC + /ImageI ] >> + /Rotate 0 + /Trans << >> + /Type /Page >> +endobj +% 'Annot.NUMBER92': class LinkAnnotation +100 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 651.5236 + 0 ] + /Rect [ 243.4995 + 584.1736 + 311.2995 + 596.1736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER93': class PDFDictionary +101 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://git.llucax.com.ar/w/software/mutest.git?a=tree;f=sample;h=d8ad4dd9c3428fef5963107c82ab6a5e34ec6e00;hb=HEAD) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 215.5429 + 521.1736 + 250.5529 + 533.1736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER94': class LinkAnnotation +102 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 108 0 R + /XYZ + 62.69291 + 463.4236 + 0 ] + /Rect [ 342.9128 + 503.1736 + 389.4027 + 515.1736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER95': class LinkAnnotation +103 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 491.6427 + 503.1736 + 531.6627 + 515.1736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER96': class LinkAnnotation +104 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 109 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 66.02291 + 491.1736 + 130.4929 + 503.1736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER97': class LinkAnnotation +105 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 768.5236 + 0 ] + /Rect [ 148.2929 + 473.1736 + 206.1029 + 485.1736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER98': class LinkAnnotation +106 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 233.3429 + 473.1736 + 316.7229 + 485.1736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER99': class LinkAnnotation +107 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 319.5029 + 473.1736 + 359.5229 + 485.1736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Page3': class PDFPage +108 0 obj +% Page dictionary +<< /Annots [ 100 0 R + 101 0 R + 102 0 R + 103 0 R + 104 0 R + 105 0 R + 106 0 R + 107 0 R ] + /Contents 257 0 R + /MediaBox [ 0 + 0 + 595.2756 + 841.8898 ] + /Parent 254 0 R + /Resources << /Font 1 0 R + /ProcSet [ /PDF + /Text + /ImageB + /ImageC + /ImageI ] >> + /Rotate 0 + /Trans << >> + /Type /Page >> +endobj +% 'Page4': class PDFPage +109 0 obj +% Page dictionary +<< /Contents 258 0 R + /MediaBox [ 0 + 0 + 595.2756 + 841.8898 ] + /Parent 254 0 R + /Resources << /Font 1 0 R + /ProcSet [ /PDF + /Text + /ImageB + /ImageC + /ImageI ] >> + /Rotate 0 + /Trans << >> + /Type /Page >> +endobj +% 'Annot.NUMBER100': class LinkAnnotation +110 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 209.8236 + 0 ] + /Rect [ 221.7262 + 231.5736 + 278.3317 + 243.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER101': class LinkAnnotation +111 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 284.3673 + 231.5736 + 324.8628 + 243.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER102': class LinkAnnotation +112 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 330.8983 + 231.5736 + 374.6494 + 243.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER103': class LinkAnnotation +113 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 468.8236 + 0 ] + /Rect [ 394.585 + 231.5736 + 425.705 + 243.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER104': class LinkAnnotation +114 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 145.5029 + 219.5736 + 185.5229 + 231.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER105': class LinkAnnotation +115 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 348.8236 + 0 ] + /Rect [ 188.3029 + 219.5736 + 242.7629 + 231.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER106': class LinkAnnotation +116 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 181.6236 + 0 ] + /Rect [ 262.2229 + 219.5736 + 314.4629 + 231.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER107': class LinkAnnotation +117 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 651.5236 + 0 ] + /Rect [ 197.8378 + 147.5736 + 273.4328 + 159.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER108': class LinkAnnotation +118 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 651.5236 + 0 ] + /Rect [ 62.69291 + 105.5736 + 133.2729 + 117.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Page5': class PDFPage +119 0 obj +% Page dictionary +<< /Annots [ 110 0 R + 111 0 R + 112 0 R + 113 0 R + 114 0 R + 115 0 R + 116 0 R + 117 0 R + 118 0 R ] + /Contents 259 0 R + /MediaBox [ 0 + 0 + 595.2756 + 841.8898 ] + /Parent 254 0 R + /Resources << /Font 1 0 R + /ProcSet [ /PDF + /Text + /ImageB + /ImageC + /ImageI ] >> + /Rotate 0 + /Trans << >> + /Type /Page >> +endobj +% 'Annot.NUMBER109': class LinkAnnotation +120 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 106.454 + 717.7736 + 153.6195 + 729.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER110': class LinkAnnotation +121 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 651.5236 + 0 ] + /Rect [ 435.7486 + 705.7736 + 503.5486 + 717.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER111': class LinkAnnotation +122 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 213.5022 + 693.7736 + 261.9187 + 705.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER112': class LinkAnnotation +123 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 348.8236 + 0 ] + /Rect [ 480.9027 + 693.7736 + 532.2745 + 705.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER113': class LinkAnnotation +124 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 181.6236 + 0 ] + /Rect [ 82.15291 + 681.7736 + 134.3929 + 693.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER114': class LinkAnnotation +125 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 209.8236 + 0 ] + /Rect [ 203.4134 + 663.7736 + 262.3493 + 675.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER115': class LinkAnnotation +126 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 276.8122 + 663.7736 + 324.638 + 675.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER116': class LinkAnnotation +127 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 348.8236 + 0 ] + /Rect [ 344.111 + 663.7736 + 398.5839 + 675.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER117': class LinkAnnotation +128 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 181.6236 + 0 ] + /Rect [ 418.0568 + 663.7736 + 470.3097 + 675.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER118': class LinkAnnotation +129 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 197.9404 + 633.7736 + 246.4823 + 645.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER119': class LinkAnnotation +130 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 348.8236 + 0 ] + /Rect [ 403.6499 + 633.7736 + 458.4808 + 645.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER120': class LinkAnnotation +131 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 468.8236 + 0 ] + /Rect [ 276.5178 + 508.5736 + 307.6378 + 520.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER121': class LinkAnnotation +132 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 651.5236 + 0 ] + /Rect [ 169.9729 + 478.5736 + 237.7729 + 490.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER122': class LinkAnnotation +133 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 192.2605 + 430.5736 + 235.0875 + 442.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER123': class LinkAnnotation +134 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 448.9277 + 418.5736 + 491.9177 + 430.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER124': class LinkAnnotation +135 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 153.3029 + 406.5736 + 196.1029 + 418.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER125': class LinkAnnotation +136 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 768.5236 + 0 ] + /Rect [ 109.3076 + 388.5736 + 167.6023 + 400.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER126': class LinkAnnotation +137 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 216 0 R + /XYZ + 62.69291 + 540.5236 + 0 ] + /Rect [ 181.1029 + 358.5736 + 226.1229 + 370.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER127': class LinkAnnotation +138 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 396.7492 + 310.5736 + 446.4704 + 322.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER128': class LinkAnnotation +139 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 467.2915 + 310.5736 + 508.2721 + 322.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER129': class LinkAnnotation +140 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 205.5656 + 280.5736 + 246.9262 + 292.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER130': class LinkAnnotation +141 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 286.2378 + 203.3736 + 326.5113 + 215.3736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER131': class LinkAnnotation +142 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 651.5236 + 0 ] + /Rect [ 357.292 + 203.3736 + 425.092 + 215.3736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER132': class LinkAnnotation +143 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 265.0029 + 191.3736 + 307.8029 + 203.3736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER133': class LinkAnnotation +144 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 348.8236 + 0 ] + /Rect [ 225.6293 + 143.3736 + 280.4485 + 155.3736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER134': class LinkAnnotation +145 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 461.8341 + 143.3736 + 507.2134 + 155.3736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Page6': class PDFPage +146 0 obj +% Page dictionary +<< /Annots [ 120 0 R + 121 0 R + 122 0 R + 123 0 R + 124 0 R + 125 0 R + 126 0 R + 127 0 R + 128 0 R + 129 0 R + 130 0 R + 131 0 R + 132 0 R + 133 0 R + 134 0 R + 135 0 R + 136 0 R + 137 0 R + 138 0 R + 139 0 R + 140 0 R + 141 0 R + 142 0 R + 143 0 R + 144 0 R + 145 0 R ] + /Contents 260 0 R + /MediaBox [ 0 + 0 + 595.2756 + 841.8898 ] + /Parent 254 0 R + /Resources << /Font 1 0 R + /ProcSet [ /PDF + /Text + /ImageB + /ImageC + /ImageI ] >> + /Rotate 0 + /Trans << >> + /Type /Page >> +endobj +% 'Annot.NUMBER135': class PDFDictionary +147 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://en.wikipedia.org/wiki/Name_mangling) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 440.1822 + 726.7736 + 512.5727 + 738.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER136': class LinkAnnotation +148 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 335.8999 + 714.7736 + 386.117 + 726.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER137': class LinkAnnotation +149 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 348.8236 + 0 ] + /Rect [ 406.7856 + 714.7736 + 462.4541 + 726.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER138': class LinkAnnotation +150 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 181.6236 + 0 ] + /Rect [ 483.1227 + 714.7736 + 531.3741 + 726.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER139': class LinkAnnotation +151 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 207.0629 + 702.7736 + 293.2229 + 714.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER140': class LinkAnnotation +152 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 468.8236 + 0 ] + /Rect [ 62.69291 + 684.7736 + 99.19956 + 696.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER141': class LinkAnnotation +153 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 468.8236 + 0 ] + /Rect [ 442.8794 + 684.7736 + 477.166 + 696.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER142': class LinkAnnotation +154 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 221 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 144.6382 + 672.7736 + 206.7667 + 684.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER143': class LinkAnnotation +155 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 221 0 R + /XYZ + 62.69291 + 466.8236 + 0 ] + /Rect [ 227.7851 + 672.7736 + 290.0251 + 684.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER144': class PDFDictionary +156 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://www.digitalmars.com/d/) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 82.83356 + 531.7736 + 207.0249 + 543.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER145': class LinkAnnotation +157 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 209.8236 + 0 ] + /Rect [ 410.8127 + 501.7736 + 472.2477 + 513.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER146': class LinkAnnotation +158 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 231.6829 + 489.7736 + 279.4829 + 501.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER147': class LinkAnnotation +159 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 201.0699 + 471.7736 + 249.7487 + 483.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER148': class LinkAnnotation +160 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 516.4627 + 459.7736 + 532.0268 + 471.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER149': class LinkAnnotation +161 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 62.69291 + 447.7736 + 83.81291 + 459.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER150': class LinkAnnotation +162 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 348.8236 + 0 ] + /Rect [ 89.37291 + 447.7736 + 143.8329 + 459.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER151': class LinkAnnotation +163 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 181.6236 + 0 ] + /Rect [ 163.2929 + 447.7736 + 215.5329 + 459.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER152': class LinkAnnotation +164 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 209.8236 + 0 ] + /Rect [ 438.4329 + 447.7736 + 494.5629 + 459.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER153': class LinkAnnotation +165 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 209.8236 + 0 ] + /Rect [ 114.6935 + 390.7736 + 172.2204 + 402.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER154': class LinkAnnotation +166 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 209.8236 + 0 ] + /Rect [ 516.4627 + 390.7736 + 531.1858 + 402.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER155': class LinkAnnotation +167 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 209.8236 + 0 ] + /Rect [ 62.69291 + 378.7736 + 99.92291 + 390.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER156': class LinkAnnotation +168 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 268.4329 + 378.7736 + 316.2329 + 390.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER157': class LinkAnnotation +169 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 295.2208 + 342.7736 + 341.6568 + 354.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER158': class LinkAnnotation +170 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 209.8236 + 0 ] + /Rect [ 159.9729 + 211.5736 + 218.8829 + 223.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'F6': class PDFType1Font +171 0 obj +% Font Courier-BoldOblique +<< /BaseFont /Courier-BoldOblique + /Encoding /WinAnsiEncoding + /Name /F6 + /Subtype /Type1 + /Type /Font >> +endobj +% 'Annot.NUMBER159': class LinkAnnotation +172 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 312.2529 + 124.3736 + 357.2729 + 136.3736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Page7': class PDFPage +173 0 obj +% Page dictionary +<< /Annots [ 147 0 R + 148 0 R + 149 0 R + 150 0 R + 151 0 R + 152 0 R + 153 0 R + 154 0 R + 155 0 R + 156 0 R + 157 0 R + 158 0 R + 159 0 R + 160 0 R + 161 0 R + 162 0 R + 163 0 R + 164 0 R + 165 0 R + 166 0 R + 167 0 R + 168 0 R + 169 0 R + 170 0 R + 172 0 R ] + /Contents 261 0 R + /MediaBox [ 0 + 0 + 595.2756 + 841.8898 ] + /Parent 254 0 R + /Resources << /Font 1 0 R + /ProcSet [ /PDF + /Text + /ImageB + /ImageC + /ImageI ] >> + /Rotate 0 + /Trans << >> + /Type /Page >> +endobj +% 'F7': class PDFType1Font +174 0 obj +% Font Courier-Bold +<< /BaseFont /Courier-Bold + /Encoding /WinAnsiEncoding + /Name /F7 + /Subtype /Type1 + /Type /Font >> +endobj +% 'Annot.NUMBER160': class LinkAnnotation +175 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 468.8236 + 0 ] + /Rect [ 215.6962 + 720.7736 + 249.9917 + 732.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER161': class LinkAnnotation +176 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 516.4627 + 720.7736 + 532.1871 + 732.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER162': class LinkAnnotation +177 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 82.69291 + 708.7736 + 108.8129 + 720.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER163': class LinkAnnotation +178 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 115.0634 + 708.7736 + 164.2445 + 720.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER164': class LinkAnnotation +179 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 468.8236 + 0 ] + /Rect [ 184.395 + 708.7736 + 218.9855 + 720.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER165': class LinkAnnotation +180 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 491.8722 + 708.7736 + 531.8922 + 720.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER166': class LinkAnnotation +181 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 324.7428 + 696.7736 + 364.8628 + 708.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER167': class LinkAnnotation +182 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 468.8236 + 0 ] + /Rect [ 82.69291 + 684.7736 + 108.8129 + 696.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER168': class PDFDictionary +183 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://www.gnu.org/software/binutils/) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 189.8229 + 585.7736 + 247.0529 + 597.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER169': class PDFDictionary +184 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://www.gnu.org/software/bash/) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 105.7029 + 567.7736 + 156.2729 + 579.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER170': class LinkAnnotation +185 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 309.4145 + 510.7736 + 362.5369 + 522.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER171': class LinkAnnotation +186 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 142.7329 + 498.7736 + 190.5329 + 510.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER172': class LinkAnnotation +187 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 209.8236 + 0 ] + /Rect [ 124.4966 + 468.7736 + 186.8404 + 480.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER173': class LinkAnnotation +188 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 286.4609 + 468.7736 + 337.6947 + 480.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER174': class LinkAnnotation +189 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 516.4627 + 468.7736 + 530.8658 + 480.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER175': class LinkAnnotation +190 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 62.69291 + 456.7736 + 91.8309 + 468.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER176': class LinkAnnotation +191 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 362.6707 + 456.7736 + 402.9287 + 468.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER177': class LinkAnnotation +192 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 348.8236 + 0 ] + /Rect [ 408.7267 + 456.7736 + 463.4247 + 468.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER178': class LinkAnnotation +193 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 181.6236 + 0 ] + /Rect [ 483.1227 + 456.7736 + 532.3447 + 468.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER179': class LinkAnnotation +194 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 327.7961 + 444.7736 + 372.9505 + 456.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER180': class LinkAnnotation +195 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 419.3594 + 444.7736 + 467.4282 + 456.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER181': class LinkAnnotation +196 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 437.5236 + 0 ] + /Rect [ 334.6208 + 357.7736 + 413.9194 + 369.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER182': class LinkAnnotation +197 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 119 0 R + /XYZ + 62.69291 + 209.8236 + 0 ] + /Rect [ 108.9742 + 345.7736 + 169.7869 + 357.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER183': class PDFDictionary +198 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://www.python.org/) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 214.4795 + 345.7736 + 249.3408 + 357.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER184': class PDFDictionary +199 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://docs.python.org/library/ctypes.html) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 276.9721 + 345.7736 + 309.6035 + 357.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER185': class LinkAnnotation +200 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 205.6329 + 333.7736 + 253.4329 + 345.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER186': class LinkAnnotation +201 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 241.6229 + 303.7736 + 289.4229 + 315.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER187': class LinkAnnotation +202 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 437.5236 + 0 ] + /Rect [ 115.7408 + 285.7736 + 193.9934 + 297.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER188': class LinkAnnotation +203 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 437.5236 + 0 ] + /Rect [ 249.9341 + 255.7736 + 329.3128 + 267.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER189': class LinkAnnotation +204 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 436.1365 + 255.7736 + 487.0939 + 267.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER190': class LinkAnnotation +205 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 175.9009 + 100.5736 + 226.7128 + 112.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER191': class LinkAnnotation +206 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 113.6236 + 0 ] + /Rect [ 127.7329 + 88.57362 + 274.1329 + 100.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Page8': class PDFPage +207 0 obj +% Page dictionary +<< /Annots [ 175 0 R + 176 0 R + 177 0 R + 178 0 R + 179 0 R + 180 0 R + 181 0 R + 182 0 R + 183 0 R + 184 0 R + 185 0 R + 186 0 R + 187 0 R + 188 0 R + 189 0 R + 190 0 R + 191 0 R + 192 0 R + 193 0 R + 194 0 R + 195 0 R + 196 0 R + 197 0 R + 198 0 R + 199 0 R + 200 0 R + 201 0 R + 202 0 R + 203 0 R + 204 0 R + 205 0 R + 206 0 R ] + /Contents 262 0 R + /MediaBox [ 0 + 0 + 595.2756 + 841.8898 ] + /Parent 254 0 R + /Resources << /Font 1 0 R + /ProcSet [ /PDF + /Text + /ImageB + /ImageC + /ImageI ] >> + /Rotate 0 + /Trans << >> + /Type /Page >> +endobj +% 'Annot.NUMBER192': class LinkAnnotation +208 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 131.6029 + 676.7736 + 179.4029 + 688.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER193': class LinkAnnotation +209 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 426.1829 + 676.7736 + 473.9829 + 688.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER194': class LinkAnnotation +210 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 173 0 R + /XYZ + 62.69291 + 437.5236 + 0 ] + /Rect [ 114.3829 + 603.7736 + 192.1829 + 615.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER195': class PDFDictionary +211 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://www.python.org/) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 85.69291 + 582.7736 + 119.6029 + 594.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER196': class PDFDictionary +212 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://www.gnu.org/software/binutils/) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 189.8229 + 564.7736 + 247.0529 + 576.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER197': class LinkAnnotation +213 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 768.0236 + 0 ] + /Rect [ 252.2129 + 549.7736 + 300.0129 + 561.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER198': class LinkAnnotation +214 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 375.4829 + 422.7736 + 418.2829 + 434.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER199': class LinkAnnotation +215 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 352.1429 + 205.5736 + 394.9429 + 217.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Page9': class PDFPage +216 0 obj +% Page dictionary +<< /Annots [ 208 0 R + 209 0 R + 210 0 R + 211 0 R + 212 0 R + 213 0 R + 214 0 R + 215 0 R ] + /Contents 263 0 R + /MediaBox [ 0 + 0 + 595.2756 + 841.8898 ] + /Parent 254 0 R + /Resources << /Font 1 0 R + /ProcSet [ /PDF + /Text + /ImageB + /ImageC + /ImageI ] >> + /Rotate 0 + /Trans << >> + /Type /Page >> +endobj +% 'Annot.NUMBER200': class LinkAnnotation +217 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 82.69291 + 671.7736 + 125.4929 + 683.7736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER201': class LinkAnnotation +218 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 516.4627 + 382.5736 + 530.8327 + 394.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER202': class LinkAnnotation +219 0 obj +<< /Border [ 0 + 0 + 0 ] + /Contents () + /Dest [ 146 0 R + /XYZ + 62.69291 + 612.0236 + 0 ] + /Rect [ 82.69291 + 370.5736 + 106.5929 + 382.5736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Annot.NUMBER203': class PDFDictionary +220 0 obj +<< /A << /S /URI + /Type /Action + /URI (http://docutils.sourceforge.net/rst.html) >> + /Border [ 0 + 0 + 0 ] + /Rect [ 199.4029 + 124.3736 + 273.8729 + 136.3736 ] + /Subtype /Link + /Type /Annot >> +endobj +% 'Page10': class PDFPage +221 0 obj +% Page dictionary +<< /Annots [ 217 0 R + 218 0 R + 219 0 R + 220 0 R ] + /Contents 264 0 R + /MediaBox [ 0 + 0 + 595.2756 + 841.8898 ] + /Parent 254 0 R + /Resources << /Font 1 0 R + /ProcSet [ /PDF + /Text + /ImageB + /ImageC + /ImageI ] >> + /Rotate 0 + /Trans << >> + /Type /Page >> +endobj +% 'R222': class PDFCatalog +222 0 obj +% Document Root +<< /Outlines 224 0 R + /PageLabels 265 0 R + /PageMode /UseNone + /Pages 254 0 R + /Type /Catalog >> +endobj +% 'R223': class PDFInfo +223 0 obj +<< /Author (Leandro Lucarella) + /CreationDate (D:20130217192608-01'00') + /Creator (\(unspecified\)) + /Keywords () + /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (\(unspecified\)) + /Title (mutest - A simple micro unit testing framework for C) >> +endobj +% 'R224': class PDFOutlines +224 0 obj +<< /Count 37 + /First 225 0 R + /Last 253 0 R + /Type /Outlines >> +endobj +% 'Outline.0': class OutlineEntryObject +225 0 obj +<< /Dest [ 99 0 R + /XYZ + 62.69291 + 204.0236 + 0 ] + /Next 226 0 R + /Parent 224 0 R + /Title (\376\377\0001\000.\000\240\000\240\000\240\000I\000n\000s\000t\000a\000l\000l\000a\000t\000i\000o\000n) >> +endobj +% 'Outline.1': class OutlineEntryObject +226 0 obj +<< /Count 3 + /Dest [ 108 0 R + /XYZ + 62.69291 + 559.4236 + 0 ] + /First 227 0 R + /Last 229 0 R + /Next 230 0 R + /Parent 224 0 R + /Prev 225 0 R + /Title (\376\377\0002\000.\000\240\000\240\000\240\000Q\000u\000i\000c\000k\000 \000S\000a\000m\000p\000l\000e) >> +endobj +% 'Outline.30.0': class OutlineEntryObject +227 0 obj +<< /Dest [ 108 0 R + /XYZ + 62.69291 + 460.4236 + 0 ] + /Next 228 0 R + /Parent 226 0 R + /Title (\376\377\0002\000.\0001\000.\000\240\000\240\000\240\000f\000a\000c\000t\000o\000r\000i\000a\000l\000.\000c) >> +endobj +% 'Outline.30.1': class OutlineEntryObject +228 0 obj +<< /Dest [ 109 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Next 229 0 R + /Parent 226 0 R + /Prev 227 0 R + /Title (\376\377\0002\000.\0002\000.\000\240\000\240\000\240\000f\000a\000c\000t\000o\000r\000i\000a\000l\000_\000t\000e\000s\000t\000.\000c) >> +endobj +% 'Outline.30.2': class OutlineEntryObject +229 0 obj +<< /Dest [ 119 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Parent 226 0 R + /Prev 228 0 R + /Title (\376\377\0002\000.\0003\000.\000\240\000\240\000\240\000e\000x\000c\000e\000p\000t\000i\000o\000n\000_\000t\000e\000s\000t\000.\000c\000p\000p) >> +endobj +% 'Outline.2': class OutlineEntryObject +230 0 obj +<< /Count 6 + /Dest [ 119 0 R + /XYZ + 62.69291 + 269.8236 + 0 ] + /First 231 0 R + /Last 236 0 R + /Next 237 0 R + /Parent 224 0 R + /Prev 226 0 R + /Title (\376\377\0003\000.\000\240\000\240\000\240\000C\000o\000n\000c\000e\000p\000t\000s) >> +endobj +% 'Outline.31.0': class OutlineEntryObject +231 0 obj +<< /Dest [ 119 0 R + /XYZ + 62.69291 + 206.8236 + 0 ] + /Next 232 0 R + /Parent 230 0 R + /Title (\376\377\0003\000.\0001\000.\000\240\000\240\000\240\000T\000e\000s\000t\000 \000P\000r\000o\000g\000r\000a\000m) >> +endobj +% 'Outline.31.1': class OutlineEntryObject +232 0 obj +<< /Dest [ 146 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Next 233 0 R + /Parent 230 0 R + /Prev 231 0 R + /Title (\376\377\0003\000.\0002\000.\000\240\000\240\000\240\000T\000e\000s\000t\000 \000S\000u\000i\000t\000e) >> +endobj +% 'Outline.31.2': class OutlineEntryObject +233 0 obj +<< /Dest [ 146 0 R + /XYZ + 62.69291 + 609.0236 + 0 ] + /Next 234 0 R + /Parent 230 0 R + /Prev 232 0 R + /Title (\376\377\0003\000.\0003\000.\000\240\000\240\000\240\000T\000e\000s\000t\000 \000C\000a\000s\000e) >> +endobj +% 'Outline.31.3': class OutlineEntryObject +234 0 obj +<< /Dest [ 146 0 R + /XYZ + 62.69291 + 465.8236 + 0 ] + /Next 235 0 R + /Parent 230 0 R + /Prev 233 0 R + /Title (\376\377\0003\000.\0004\000.\000\240\000\240\000\240\000C\000h\000e\000c\000k\000s) >> +endobj +% 'Outline.31.4': class OutlineEntryObject +235 0 obj +<< /Dest [ 146 0 R + /XYZ + 62.69291 + 345.8236 + 0 ] + /Next 236 0 R + /Parent 230 0 R + /Prev 234 0 R + /Title (\376\377\0003\000.\0005\000.\000\240\000\240\000\240\000I\000n\000i\000t\000i\000a\000l\000i\000z\000a\000t\000i\000o\000n) >> +endobj +% 'Outline.31.5': class OutlineEntryObject +236 0 obj +<< /Dest [ 146 0 R + /XYZ + 62.69291 + 178.6236 + 0 ] + /Parent 230 0 R + /Prev 235 0 R + /Title (\376\377\0003\000.\0006\000.\000\240\000\240\000\240\000T\000e\000r\000m\000i\000n\000a\000t\000i\000o\000n) >> +endobj +% 'Outline.3': class OutlineEntryObject +237 0 obj +<< /Dest [ 173 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Next 238 0 R + /Parent 224 0 R + /Prev 230 0 R + /Title (\376\377\0004\000.\000\240\000\240\000\240\000C\000+\000+\000 \000S\000u\000p\000p\000o\000r\000t) >> +endobj +% 'Outline.4': class OutlineEntryObject +238 0 obj +<< /Count 9 + /Dest [ 173 0 R + /XYZ + 62.69291 + 648.0236 + 0 ] + /First 239 0 R + /Last 244 0 R + /Next 248 0 R + /Parent 224 0 R + /Prev 237 0 R + /Title (\376\377\0005\000.\000\240\000\240\000\240\000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n\000s) >> +endobj +% 'Outline.32.0': class OutlineEntryObject +239 0 obj +<< /Count 4 + /Dest [ 173 0 R + /XYZ + 62.69291 + 579.0236 + 0 ] + /First 240 0 R + /Last 240 0 R + /Next 244 0 R + /Parent 238 0 R + /Title (\376\377\0005\000.\0001\000.\000\240\000\240\000\240\000S\000t\000a\000t\000i\000c\000 \000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n\000s) >> +endobj +% 'Outline.33.0': class OutlineEntryObject +240 0 obj +<< /Count 3 + /Dest [ 173 0 R + /XYZ + 62.69291 + 435.0236 + 0 ] + /First 241 0 R + /Last 243 0 R + /Parent 239 0 R + /Title (\376\377\0005\000.\0001\000.\0001\000.\000\240\000\240\000\240\000C\000 \000i\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n) >> +endobj +% 'Outline.34.0': class OutlineEntryObject +241 0 obj +<< /Dest [ 173 0 R + /XYZ + 62.69291 + 165.6236 + 0 ] + /Next 242 0 R + /Parent 240 0 R + /Title (\376\377\0005\000.\0001\000.\0001\000.\0001\000.\000\240\000\240\000\240\000m\000k\000m\000u\000t\000e\000s\000t\000 \000I\000n\000v\000o\000c\000a\000t\000i\000o\000n) >> +endobj +% 'Outline.34.1': class OutlineEntryObject +242 0 obj +<< /Dest [ 173 0 R + /XYZ + 62.69291 + 111.6236 + 0 ] + /Next 243 0 R + /Parent 240 0 R + /Prev 241 0 R + /Title (\376\377\0005\000.\0001\000.\0001\000.\0002\000.\000\240\000\240\000\240\000T\000e\000s\000t\000 \000P\000r\000o\000g\000r\000a\000m\000 \000I\000n\000v\000o\000c\000a\000t\000i\000o\000n) >> +endobj +% 'Outline.34.2': class OutlineEntryObject +243 0 obj +<< /Dest [ 207 0 R + /XYZ + 62.69291 + 672.0236 + 0 ] + /Parent 240 0 R + /Prev 242 0 R + /Title (\376\377\0005\000.\0001\000.\0001\000.\0003\000.\000\240\000\240\000\240\000D\000e\000p\000e\000n\000d\000e\000n\000c\000i\000e\000s) >> +endobj +% 'Outline.32.1': class OutlineEntryObject +244 0 obj +<< /Count 3 + /Dest [ 207 0 R + /XYZ + 62.69291 + 558.0236 + 0 ] + /First 245 0 R + /Last 245 0 R + /Parent 238 0 R + /Prev 239 0 R + /Title (\376\377\0005\000.\0002\000.\000\240\000\240\000\240\000D\000y\000n\000a\000m\000i\000c\000 \000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n\000s) >> +endobj +% 'Outline.35.0': class OutlineEntryObject +245 0 obj +<< /Count 2 + /Dest [ 207 0 R + /XYZ + 62.69291 + 390.0236 + 0 ] + /First 246 0 R + /Last 247 0 R + /Parent 244 0 R + /Title (\376\377\0005\000.\0002\000.\0001\000.\000\240\000\240\000\240\000P\000y\000t\000h\000o\000n\000 \000i\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n) >> +endobj +% 'Outline.36.0': class OutlineEntryObject +246 0 obj +<< /Dest [ 207 0 R + /XYZ + 62.69291 + 129.8236 + 0 ] + /Next 247 0 R + /Parent 245 0 R + /Title (\376\377\0005\000.\0002\000.\0001\000.\0001\000.\000\240\000\240\000\240\000m\000u\000t\000e\000s\000t\000 \000I\000n\000v\000o\000c\000a\000t\000i\000o\000n) >> +endobj +% 'Outline.36.1': class OutlineEntryObject +247 0 obj +<< /Dest [ 216 0 R + /XYZ + 62.69291 + 633.0236 + 0 ] + /Parent 245 0 R + /Prev 246 0 R + /Title (\376\377\0005\000.\0002\000.\0001\000.\0002\000.\000\240\000\240\000\240\000D\000e\000p\000e\000n\000d\000e\000n\000c\000i\000e\000s) >> +endobj +% 'Outline.5': class OutlineEntryObject +248 0 obj +<< /Count 4 + /Dest [ 216 0 R + /XYZ + 62.69291 + 537.0236 + 0 ] + /First 249 0 R + /Last 252 0 R + /Next 253 0 R + /Parent 224 0 R + /Prev 238 0 R + /Title (\376\377\0006\000.\000\240\000\240\000\240\000R\000e\000f\000e\000r\000e\000n\000c\000e) >> +endobj +% 'Outline.37.0': class OutlineEntryObject +249 0 obj +<< /Dest [ 216 0 R + /XYZ + 62.69291 + 504.0236 + 0 ] + /Next 250 0 R + /Parent 248 0 R + /Title (\376\377\0006\000.\0001\000.\000\240\000\240\000\240\000m\000u\000_\000c\000h\000e\000c\000k\000\(\000\)) >> +endobj +% 'Outline.37.1': class OutlineEntryObject +250 0 obj +<< /Dest [ 216 0 R + /XYZ + 62.69291 + 286.8236 + 0 ] + /Next 251 0 R + /Parent 248 0 R + /Prev 249 0 R + /Title (\376\377\0006\000.\0002\000.\000\240\000\240\000\240\000m\000u\000_\000e\000n\000s\000u\000r\000e\000\(\000\)) >> +endobj +% 'Outline.37.2': class OutlineEntryObject +251 0 obj +<< /Dest [ 221 0 R + /XYZ + 62.69291 + 765.0236 + 0 ] + /Next 252 0 R + /Parent 248 0 R + /Prev 250 0 R + /Title (\376\377\0006\000.\0003\000.\000\240\000\240\000\240\000m\000u\000_\000e\000c\000h\000e\000c\000k\000\(\000\)) >> +endobj +% 'Outline.37.3': class OutlineEntryObject +252 0 obj +<< /Dest [ 221 0 R + /XYZ + 62.69291 + 463.8236 + 0 ] + /Parent 248 0 R + /Prev 251 0 R + /Title (\376\377\0006\000.\0004\000.\000\240\000\240\000\240\000m\000u\000_\000e\000e\000n\000s\000u\000r\000e\000\(\000\)) >> +endobj +% 'Outline.6': class OutlineEntryObject +253 0 obj +<< /Dest [ 221 0 R + /XYZ + 62.69291 + 162.6236 + 0 ] + /Parent 224 0 R + /Prev 248 0 R + /Title (\376\377\0007\000.\000\240\000\240\000\240\000A\000b\000o\000u\000t) >> +endobj +% 'R254': class PDFPages +254 0 obj +% page tree +<< /Count 10 + /Kids [ 24 0 R + 99 0 R + 108 0 R + 109 0 R + 119 0 R + 146 0 R + 173 0 R + 207 0 R + 216 0 R + 221 0 R ] + /Type /Pages >> +endobj +% 'R255': class PDFStream +255 0 obj +% page stream +<< /Length 4021 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 62.69291 717.0236 cm +q +BT 1 0 0 1 0 28 Tm 11.56488 0 Td 24 TL /F2 20 Tf 0 0 0 rg (mutest ) Tj /F3 20 Tf (- A simple micro unit testing framework) Tj T* 200.05 0 Td (for C) Tj T* -211.6149 0 Td ET +Q +Q +q +1 0 0 1 62.69291 692.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 36.93937 0 Td (Author:) Tj T* -36.93937 0 Td ET +Q +Q +q +1 0 0 1 91.03937 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Leandro Lucarella) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 677.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 32.48937 0 Td (Contact:) Tj T* -32.48937 0 Td ET +Q +Q +q +1 0 0 1 91.03937 3 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (llucax@gmail.com) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 662.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 33.02937 0 Td (Version:) Tj T* -33.02937 0 Td ET +Q +Q +q +1 0 0 1 91.03937 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (1.0) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 647.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 48.03937 0 Td (Date:) Tj T* -48.03937 0 Td ET +Q +Q +q +1 0 0 1 91.03937 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (2013-02-17) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 632.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 22.48937 0 Td (Copyright:) Tj T* -22.48937 0 Td ET +Q +Q +q +1 0 0 1 91.03937 3 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Leandro Lucarella \(2008\), released under the ) Tj 0 0 .501961 rg (BOLA ) Tj 0 0 0 rg (license) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 605.0236 cm +q +BT 1 0 0 1 0 2.5 Tm 15 TL /F2 12.5 Tf 0 0 0 rg (Abstract) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 551.0236 cm +q +BT 1 0 0 1 0 38 Tm 12 TL /F4 10 Tf 0 0 0 rg (mutest ) Tj /F1 10 Tf (is a micro ) Tj 0 0 .501961 rg (unit testing ) Tj 0 0 0 rg (framework for C \(with some ) Tj 0 0 .501961 rg (C++ support) Tj 0 0 0 rg (\). It's mostly an idea \(it even comes) Tj T* (with 2 ) Tj 0 0 .501961 rg (implementations ) Tj 0 0 0 rg (of the idea!\) with the goal of being easy to use \(just write your ) Tj 0 0 .501961 rg (test cases ) Tj 0 0 0 rg (grouped) Tj T* (in ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (and you're set\) and so small and simple that you don't mind to copy the files to your project) Tj T* (and just use it \(i.e., no dependencies\).) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 503.0236 cm +q +BT 1 0 0 1 0 38 Tm 12 TL /F1 10 Tf 0 0 0 rg (The idea is simple: a source file is a ) Tj 0 0 .501961 rg (test suite) Tj 0 0 0 rg (, a function is a ) Tj 0 0 .501961 rg (test case ) Tj 0 0 0 rg (\(special functions can be used for) Tj T* 0 0 .501961 rg (test suite) Tj 0 0 0 rg ( ) Tj 0 0 .501961 rg (initialization ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (termination) Tj 0 0 0 rg (\), which can can have several ) Tj 0 0 .501961 rg (checks) Tj 0 0 0 rg (. ) Tj 0 0 .501961 rg (Checks ) Tj 0 0 0 rg (comes in 2 flavors,) Tj T* (one that only prints an error, and one that terminates the current ) Tj 0 0 .501961 rg (test case ) Tj 0 0 0 rg (too. A \(normally\) automated) Tj T* 0 0 .501961 rg (test program ) Tj 0 0 0 rg (run all the ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (and print some stats. It fails \(returns non-zero\) if any ) Tj 0 0 .501961 rg (test suite ) Tj 0 0 0 rg (fails.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 467.0236 cm +q +BT 1 0 0 1 0 26 Tm 12 TL /F1 10 Tf 0 0 0 rg (<) Tj (div style="width: 220px; height: 270px; float: right; margin-left: 1em; margin-top: 1em") Tj (> <) Tj (iframe) Tj T* (width="220" height="270" style="border: none; outline: none") Tj T* (src="http://tools.flattr.net/widgets/thing.html?thing=1141711") Tj (>) Tj (<) Tj (/iframe) Tj (> <) Tj (/div) Tj (>) Tj T* ET +Q +Q + +endstream +endobj +% 'R256': class PDFStream +256 0 obj +% page stream +<< /Length 8831 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 62.69291 744.0236 cm +q +BT 1 0 0 1 0 3.5 Tm 21 TL /F3 17.5 Tf 0 0 0 rg (Contents) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 216.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 0 507 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 .501961 rg (1. Installation) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 507 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 66.44 0 Td (2) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 489 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 .501961 rg (2. Quick Sample) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 489 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 66.44 0 Td (3) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 471 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (2.1. factorial.c) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 471 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (3) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 453 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (2.2. factorial_test.c) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 453 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (4) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 435 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (2.3. exception_test.cpp) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 435 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (5) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 417 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 .501961 rg (3. Concepts) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 417 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 66.44 0 Td (5) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 399 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (3.1. Test Program) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 399 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (5) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 381 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (3.2. Test Suite) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 381 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (6) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 363 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (3.3. Test Case) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 363 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (6) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 345 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (3.4. Checks) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 345 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (6) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 327 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (3.5. Initialization) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 327 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (6) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 309 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (3.6. Termination) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 309 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (6) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 291 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 .501961 rg (4. C++ Support) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 291 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 66.44 0 Td (7) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 273 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 .501961 rg (5. Implementations) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 273 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 66.44 0 Td (7) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 255 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (5.1. Static Implementations) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 255 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (7) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 237 cm +q +BT 1 0 0 1 40 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (5.1.1. C implementation) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 237 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (7) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 219 cm +q +BT 1 0 0 1 60 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (5.1.1.1. ) Tj /F5 10 Tf 0 0 0 rg (mkmutest ) Tj /F1 10 Tf 0 0 .501961 rg (Invocation) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 219 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (7) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 201 cm +q +BT 1 0 0 1 60 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (5.1.1.2. Test Program Invocation) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 201 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (7) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 183 cm +q +BT 1 0 0 1 60 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (5.1.1.3. Dependencies) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 183 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (8) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 165 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (5.2. Dynamic Implementations) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 165 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (8) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 147 cm +q +BT 1 0 0 1 40 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (5.2.1. Python implementation) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 147 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (8) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 129 cm +q +BT 1 0 0 1 60 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (5.2.1.1. ) Tj /F5 10 Tf 0 0 0 rg (mutest ) Tj /F1 10 Tf 0 0 .501961 rg (Invocation) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 129 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (8) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 111 cm +q +BT 1 0 0 1 60 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (5.2.1.2. Dependencies) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 111 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (9) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 93 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 .501961 rg (6. Reference) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 93 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 66.44 0 Td (9) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 75 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (6.1. ) Tj /F5 10 Tf 0 0 0 rg (mu_check\(\)) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 75 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (9) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 57 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (6.2. ) Tj /F5 10 Tf 0 0 0 rg (mu_ensure\(\)) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 57 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (9) Tj T* -66.44 0 Td ET +Q +Q +q +1 0 0 1 0 39 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (6.3. ) Tj /F5 10 Tf 0 0 0 rg (mu_echeck\(\)) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 39 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (10) Tj T* -60.88 0 Td ET +Q +Q +q +1 0 0 1 0 21 cm +q +BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (6.4. ) Tj /F5 10 Tf 0 0 0 rg (mu_eensure\(\)) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 21 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (10) Tj T* -60.88 0 Td ET +Q +Q +q +1 0 0 1 0 3 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 .501961 rg (7. About) Tj T* ET +Q +Q +q +1 0 0 1 397.8898 3 cm +q +0 0 .501961 rg +0 0 .501961 RG +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 60.88 0 Td (10) Tj T* -60.88 0 Td ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 183.0236 cm +q +BT 1 0 0 1 0 3.5 Tm 21 TL /F3 17.5 Tf 0 0 0 rg (1. Installation) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 165.0236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Download the ) Tj 0 0 .501961 rg (latest distribution tarball ) Tj 0 0 0 rg (and uncompress it.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 135.0236 cm +q +BT 1 0 0 1 0 14 Tm 1.279987 Tw 12 TL /F1 10 Tf 0 0 0 rg (You can also download any release from the ) Tj 0 0 .501961 rg (releases directory ) Tj 0 0 0 rg (or get it using ) Tj 0 0 .501961 rg (Git ) Tj 0 0 0 rg (directly from the ) Tj 0 0 .501961 rg (Git) Tj T* 0 Tw (repository) Tj 0 0 0 rg (.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 117.0236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (You can get ) Tj 0 0 .501961 rg (this manual ) Tj 0 0 0 rg (too, or a ) Tj 0 0 .501961 rg (PDF version ) Tj 0 0 0 rg (of it.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 99.02362 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (To actually install ) Tj /F4 10 Tf (mutest ) Tj /F1 10 Tf (run:) Tj T* ET +Q +Q + +endstream +endobj +% 'R257': class PDFStream +257 0 obj +% page stream +<< /Length 4497 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 62.69291 739.8236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 24 re B* +Q +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL ($ make install) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 707.8236 cm +q +BT 1 0 0 1 0 14 Tm 1.377674 Tw 12 TL /F1 10 Tf 0 0 0 rg (Default installation path is ) Tj /F5 10 Tf (/usr/local ) Tj /F1 10 Tf (\(because of that, you'll probably need superuser privileges to) Tj T* 0 Tw (install to the default location\). You can override that by passing the ) Tj /F5 10 Tf (prefix ) Tj /F1 10 Tf (make variable, for example:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 674.6236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 24 re B* +Q +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL ($ make prefix=/opt/mutest install) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 654.6236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (If you want to install just the docs, you can do:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 621.4236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 24 re B* +Q +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL ($ make install-doc) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 601.4236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Or even ) Tj /F5 10 Tf (install-readme) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (install-html ) Tj /F1 10 Tf (or ) Tj /F5 10 Tf (install-pdf ) Tj /F1 10 Tf (if you are too picky.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 571.4236 cm +q +BT 1 0 0 1 0 14 Tm 1.063318 Tw 12 TL /F1 10 Tf 0 0 0 rg (If you want to install just one particular ) Tj 0 0 .501961 rg (implementation) Tj 0 0 0 rg (, to can use the ) Tj /F5 10 Tf (install-c ) Tj /F1 10 Tf (and ) Tj /F5 10 Tf (install-py) Tj T* 0 Tw /F1 10 Tf (targets.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 538.4236 cm +q +BT 1 0 0 1 0 3.5 Tm 21 TL /F3 17.5 Tf 0 0 0 rg (2. Quick Sample) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 520.4236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (You can find some samples in the ) Tj 0 0 .501961 rg (sample ) Tj 0 0 0 rg (directory.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 490.4236 cm +q +BT 1 0 0 1 0 14 Tm .919985 Tw 12 TL /F1 10 Tf 0 0 0 rg (This is an example taken from there. A simple ) Tj /F4 10 Tf (module ) Tj /F1 10 Tf (called ) Tj 0 0 .501961 rg (factorial.c ) Tj 0 0 0 rg (with its corresponding ) Tj 0 0 .501961 rg (test suite) Tj T* 0 Tw 0 0 0 rg (\() Tj 0 0 .501961 rg (factorial_test.c) Tj 0 0 0 rg (\).) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 472.4236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (You can see some ) Tj 0 0 .501961 rg (C++ support ) Tj 0 0 0 rg (in the ) Tj 0 0 .501961 rg (exception_test.cpp) Tj 0 0 0 rg ( ) Tj 0 0 .501961 rg (test suite) Tj 0 0 0 rg (.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 442.4236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (2.1. factorial.c) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 217.2236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 216 re B* +Q +q +BT 1 0 0 1 0 194 Tm 12 TL /F1 10 Tf 0 0 0 rg (/*) Tj T* ( * This file is part of mutest, a simple micro unit testing framework for C.) Tj T* ( *) Tj T* ( * mutest was written by Leandro Lucarella ) Tj (<) Tj (llucax@gmail.com) Tj (>) Tj ( and is released) Tj T* ( * under the BOLA license, please see the LICENSE file or visit:) Tj T* ( * http://blitiri.com.ar/p/bola/) Tj T* ( *) Tj T* ( * This is an example module that calculates a factorial.) Tj T* ( *) Tj T* ( * Please, read the README file for more details.) Tj T* ( */) Tj /F5 10 Tf T* T* /F1 10 Tf (unsigned) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (factorial) Tj (\() Tj (unsigned) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (x) Tj (\)) Tj /F5 10 Tf ( ) Tj /F1 10 Tf ({) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (if) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (\() Tj (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (<) Tj (=) Tj /F5 10 Tf ( ) Tj (1) Tj /F1 10 Tf (\)) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (return) Tj /F5 10 Tf ( ) Tj (1) Tj /F1 10 Tf (;) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (return) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (*) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (factorial) Tj (\() Tj (x) Tj (-) Tj /F5 10 Tf (1) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* /F1 10 Tf (}) Tj T* ET +Q +Q +Q +Q +Q + +endstream +endobj +% 'R258': class PDFStream +258 0 obj +% page stream +<< /Length 4506 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 62.69291 747.0236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (2.2. factorial_test.c) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 161.8236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 576 re B* +Q +q +BT 1 0 0 1 0 554 Tm 12 TL /F1 10 Tf 0 0 0 rg (/*) Tj T* ( * This file is part of mutest, a simple micro unit testing framework for C.) Tj T* ( *) Tj T* ( * mutest was written by Leandro Lucarella ) Tj (<) Tj (llucax@gmail.com) Tj (>) Tj ( and is released) Tj T* ( * under the BOLA license, please see the LICENSE file or visit:) Tj T* ( * http://blitiri.com.ar/p/bola/) Tj T* ( *) Tj T* ( * This is the factorial module test suite. Each \(public\) function starting) Tj T* ( * with mu_test will be picked up by mkmutest as a test case.) Tj T* ( *) Tj T* ( * Please, read the README file for more details.) Tj T* ( */) Tj /F5 10 Tf T* T* /F1 10 Tf (#include "factorial.h") Tj T* /F5 10 Tf T* /F1 10 Tf (#include "../mutest.h") Tj T* /F5 10 Tf T* /F1 10 Tf (void) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (mu_test_factorial_zero) Tj (\(\)) Tj /F5 10 Tf ( ) Tj /F1 10 Tf ({) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (unsigned) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (=) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (factorial) Tj (\() Tj /F5 10 Tf (0) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (mu_check) Tj (\() Tj (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (==) Tj /F5 10 Tf ( ) Tj (1) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* /F1 10 Tf (}) Tj /F5 10 Tf T* T* /F1 10 Tf (void) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (mu_test_factorial_one) Tj (\(\)) Tj /F5 10 Tf ( ) Tj /F1 10 Tf ({) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (unsigned) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (=) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (factorial) Tj (\() Tj /F5 10 Tf (1) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (/* this test is wrong on purpose, to see how it fails */) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (mu_check) Tj (\() Tj (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (==) Tj /F5 10 Tf ( ) Tj (2) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* /F1 10 Tf (}) Tj /F5 10 Tf T* T* /F1 10 Tf (void) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (mu_test_factorial_positive) Tj (\(\)) Tj /F5 10 Tf ( ) Tj /F1 10 Tf ({) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (unsigned) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (=) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (factorial) Tj (\() Tj /F5 10 Tf (2) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (/* this test is wrong on purpose, to see how it fails */) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (mu_check) Tj (\() Tj (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (==) Tj /F5 10 Tf ( ) Tj (3) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* T* ( ) Tj /F1 10 Tf (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (=) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (factorial) Tj (\() Tj /F5 10 Tf (3) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (/* we don't want to continue if this fails, because the next result) Tj T* ( * depends on this one. This one will succeed. */) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (mu_ensure) Tj (\() Tj (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (==) Tj /F5 10 Tf ( ) Tj (6) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* T* ( ) Tj /F1 10 Tf (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (=) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (factorial) Tj (\() Tj (x) Tj (\);) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (mu_check) Tj (\() Tj (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (==) Tj /F5 10 Tf ( ) Tj (720) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* T* ( ) Tj /F1 10 Tf (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (=) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (factorial) Tj (\() Tj /F5 10 Tf (4) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (mu_ensure) Tj (\() Tj (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (==) Tj /F5 10 Tf ( ) Tj (6) Tj /F1 10 Tf (\);) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (/* same as before, but this one will fail. */) Tj /F5 10 Tf T* T* ( ) Tj /F1 10 Tf (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (=) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (factorial) Tj (\() Tj (x) Tj (-) Tj /F5 10 Tf (15) Tj /F1 10 Tf (\);) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (/* and this will never be executed */) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (mu_check) Tj (\() Tj (x) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (==) Tj /F5 10 Tf ( ) Tj (362881) Tj /F1 10 Tf (\);) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (/* but if excecuted, will fail */) Tj /F5 10 Tf T* /F1 10 Tf (}) Tj T* ET +Q +Q +Q +Q +Q + +endstream +endobj +% 'R259': class PDFStream +259 0 obj +% page stream +<< /Length 5051 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 62.69291 747.0236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (2.3. exception_test.cpp) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 281.8236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 456 re B* +Q +q +BT 1 0 0 1 0 434 Tm 12 TL /F1 10 Tf 0 0 0 rg (/*) Tj T* ( * This file is part of mutest, a simple micro unit testing framework for C.) Tj T* ( *) Tj T* ( * mutest was written by Leandro Lucarella ) Tj (<) Tj (llucax@gmail.com) Tj (>) Tj ( and is released) Tj T* ( * under the BOLA license, please see the LICENSE file or visit:) Tj T* ( * http://blitiri.com.ar/p/bola/) Tj T* ( *) Tj T* ( * This is a C++ module test suite. It shows how to use checks involving) Tj T* ( * exceptions.) Tj T* ( *) Tj T* ( * Please, read the README file for more details.) Tj T* ( */) Tj /F5 10 Tf T* T* /F1 10 Tf (#include ) Tj (<) Tj (stdexcept) Tj (>) Tj ( ) Tj (// std::out_of_range) Tj T* (#include ) Tj (<) Tj (vector) Tj (>) Tj ( ) Tj (// std::vector) Tj T* /F5 10 Tf T* /F1 10 Tf (#include "../mutest.h") Tj T* /F5 10 Tf T* /F1 10 Tf (extern) Tj /F5 10 Tf ( ) Tj ("C") Tj ( ) Tj /F1 10 Tf ({) Tj /F5 10 Tf T* T* /F1 10 Tf (void) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (mu_test_exceptions) Tj (\(\)) Tj /F5 10 Tf ( ) Tj /F1 10 Tf ({) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (std) Tj (::) Tj (vector) Tj (<) Tj (int) Tj (>) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (v) Tj (\() Tj /F5 10 Tf (1) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (// ok) Tj T* /F5 10 Tf ( ) Tj /F1 10 Tf (mu_check) Tj (\() Tj (v) Tj (.) Tj (at) Tj (\() Tj /F5 10 Tf (0) Tj /F1 10 Tf (\)) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (==) Tj /F5 10 Tf ( ) Tj (0) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (// throws! This fails) Tj T* /F5 10 Tf ( ) Tj /F1 10 Tf (mu_check) Tj (\() Tj (v) Tj (.) Tj (at) Tj (\() Tj /F5 10 Tf (1) Tj /F1 10 Tf (\)) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (==) Tj /F5 10 Tf ( ) Tj (0) Tj /F1 10 Tf (\);) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (// ok, we expect the exception to be thrown, and it does) Tj T* /F5 10 Tf ( ) Tj /F1 10 Tf (mu_echeck) Tj (\() Tj (std) Tj (::) Tj (out_of_range) Tj (,) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (v) Tj (.) Tj (at) Tj (\() Tj /F5 10 Tf (1) Tj /F1 10 Tf (\)\);) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (// fails! We expect this to throw, but it doesn't) Tj T* /F5 10 Tf ( ) Tj /F1 10 Tf (mu_echeck) Tj (\() Tj (std) Tj (::) Tj (out_of_range) Tj (,) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (v) Tj (.) Tj (at) Tj (\() Tj /F5 10 Tf (0) Tj /F1 10 Tf (\)\);) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (// fails again, but this time the show is over \(note the "ensure"\)) Tj T* /F5 10 Tf ( ) Tj /F1 10 Tf (mu_eensure) Tj (\() Tj (std) Tj (::) Tj (out_of_range) Tj (,) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (v) Tj (.) Tj (at) Tj (\() Tj /F5 10 Tf (0) Tj /F1 10 Tf (\)\);) Tj /F5 10 Tf T* ( ) Tj /F1 10 Tf (// this will never be executed \(it should fail if it is\)) Tj T* /F5 10 Tf ( ) Tj /F1 10 Tf (mu_check) Tj (\() Tj (v) Tj (.) Tj (empty) Tj (\(\)\);) Tj /F5 10 Tf T* /F1 10 Tf (}) Tj /F5 10 Tf T* T* /F1 10 Tf (}) Tj /F5 10 Tf ( ) Tj /F1 10 Tf (// extern "C") Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 248.8236 cm +q +BT 1 0 0 1 0 3.5 Tm 21 TL /F3 17.5 Tf 0 0 0 rg (3. Concepts) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 218.8236 cm +q +BT 1 0 0 1 0 14 Tm .475542 Tw 12 TL /F4 10 Tf 0 0 0 rg (mutest ) Tj /F1 10 Tf (is about 4 simple concepts: ) Tj 0 0 .501961 rg (test program) Tj 0 0 0 rg (, ) Tj 0 0 .501961 rg (test suite) Tj 0 0 0 rg (, ) Tj 0 0 .501961 rg (test case ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (checks) Tj 0 0 0 rg (. Well, to be honest you) Tj T* 0 Tw (probably will need ) Tj 0 0 .501961 rg (test suite) Tj 0 0 0 rg ( ) Tj 0 0 .501961 rg (initialization ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (termination ) Tj 0 0 0 rg (too =\)) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 188.8236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (3.1. Test Program) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 134.8236 cm +q +BT 1 0 0 1 0 38 Tm .090941 Tw 12 TL /F1 10 Tf 0 0 0 rg (A ) Tj /F3 10 Tf (test program ) Tj /F1 10 Tf (is the higher level unit of ) Tj /F4 10 Tf (mutest) Tj /F1 10 Tf (. The test program is the one in charge of running all your) Tj T* 0 Tw .28832 Tw (tests. Probably one of the more important features of ) Tj /F4 10 Tf (mutest ) Tj /F1 10 Tf (is that you are not supposed to bother about) Tj T* 0 Tw .014985 Tw (the test program. So, different ) Tj 0 0 .501961 rg (implementations ) Tj 0 0 0 rg (have different ways to tackle this. Some need more or less) Tj T* 0 Tw (interactions from your part, and each have their pros and cons.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 104.8236 cm +q +BT 1 0 0 1 0 14 Tm .064751 Tw 12 TL /F1 10 Tf 0 0 0 rg (But this is all you need to know for now, for more details see how the test program is implemented by your) Tj T* 0 Tw 0 0 .501961 rg (implementation ) Tj 0 0 0 rg (of choice.) Tj T* ET +Q +Q + +endstream +endobj +% 'R260': class PDFStream +260 0 obj +% page stream +<< /Length 7052 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 62.69291 747.0236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (3.2. Test Suite) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 681.0236 cm +q +BT 1 0 0 1 0 50 Tm .300444 Tw 12 TL /F1 10 Tf 0 0 0 rg (A ) Tj /F3 10 Tf (test suite ) Tj /F1 10 Tf (is the higher level unit of ) Tj /F4 10 Tf (mutest ) Tj /F1 10 Tf (that you should care about =\). Is not much more than a way) Tj T* 0 Tw 2.145542 Tw (to group ) Tj 0 0 .501961 rg (test cases) Tj 0 0 0 rg (. Code-wise, a test suite is a C \(or C++\) module \(or compilation unit\). Not clear) Tj T* 0 Tw 1.254104 Tw (enough? A unit test is an object file \(could be a shared object depending on the ) Tj 0 0 .501961 rg (implementation) Tj 0 0 0 rg (\). This) Tj T* 0 Tw .308221 Tw (module should have one or more ) Tj 0 0 .501961 rg (test cases ) Tj 0 0 0 rg (and it could have any number \(including zero\) of ) Tj 0 0 .501961 rg (initialization) Tj T* 0 Tw 0 0 0 rg (and ) Tj 0 0 .501961 rg (termination ) Tj 0 0 0 rg (functions.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 651.0236 cm +q +BT 1 0 0 1 0 14 Tm .012927 Tw 12 TL /F1 10 Tf 0 0 0 rg (A test suite, is inspected by the ) Tj 0 0 .501961 rg (test program ) Tj 0 0 0 rg (for ) Tj 0 0 .501961 rg (test cases ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (initialization ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (termination ) Tj 0 0 0 rg (functions, and) Tj T* 0 Tw (run them.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 621.0236 cm +q +BT 1 0 0 1 0 14 Tm .370941 Tw 12 TL /F1 10 Tf 0 0 0 rg (A test suite fail if one or more ) Tj 0 0 .501961 rg (test cases ) Tj 0 0 0 rg (fail, and it's skipped if one or more ) Tj 0 0 .501961 rg (initialization ) Tj 0 0 0 rg (functions fail \(or,) Tj T* 0 Tw (depending on the implementation, if the test suite can't be loaded at all\).) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 591.0236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (3.3. Test Case) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 561.0236 cm +q +BT 1 0 0 1 0 14 Tm 1.064724 Tw 12 TL /F1 10 Tf 0 0 0 rg (A ) Tj /F3 10 Tf (test case ) Tj /F1 10 Tf (is just a plain function with a special signature and name. A test case function name must) Tj T* 0 Tw (start with ) Tj /F5 10 Tf (mu_test) Tj /F1 10 Tf (, and take no arguments and return nothing. For example:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 527.8236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 24 re B* +Q +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL (void mu_test_something\(void\);) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 495.8236 cm +q +BT 1 0 0 1 0 14 Tm .151488 Tw 12 TL /F1 10 Tf 0 0 0 rg (A test case \(probably\) only make sense if it has ) Tj 0 0 .501961 rg (checks) Tj 0 0 0 rg (. A test case succeed only if all its checks succeed) Tj T* 0 Tw (too.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 477.8236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Test are executed in an ) Tj 0 0 .501961 rg (implementation) Tj 0 0 0 rg (-dependant order, but usually the default order is alphabetical.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 447.8236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (3.4. Checks) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 405.8236 cm +q +BT 1 0 0 1 0 26 Tm .013516 Tw 12 TL /F1 10 Tf 0 0 0 rg (Checks are assertions that a ) Tj 0 0 .501961 rg (test case ) Tj 0 0 0 rg (must pass \(a boolean expression that must evaluate to ) Tj /F4 10 Tf (true) Tj /F1 10 Tf (\). There) Tj T* 0 Tw .094988 Tw (are 2 big flavors of checks: ) Tj /F3 10 Tf (check ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (ensure) Tj /F1 10 Tf (. ) Tj /F3 10 Tf (check ) Tj /F1 10 Tf (just print an error \(and ) Tj /F4 10 Tf (mark ) Tj /F1 10 Tf (the ) Tj 0 0 .501961 rg (test case ) Tj 0 0 0 rg (as failed\)) Tj T* 0 Tw (and ) Tj /F3 10 Tf (ensure ) Tj /F1 10 Tf (halt the ) Tj 0 0 .501961 rg (test case ) Tj 0 0 0 rg (execution, jumping to the next one.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 375.8236 cm +q +BT 1 0 0 1 0 14 Tm .242339 Tw 12 TL /F1 10 Tf 0 0 0 rg (For better ) Tj 0 0 .501961 rg (C++ support ) Tj 0 0 0 rg (there are check macros that assert that a specified exception is thrown \(instead of) Tj T* 0 Tw (check for a boolean expression to evaluate to ) Tj /F4 10 Tf (true) Tj /F1 10 Tf (\).) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 357.8236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (You can take a look at the ) Tj 0 0 .501961 rg (reference ) Tj 0 0 0 rg (to see the different flavors of check macros in more detail.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 327.8236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (3.5. Initialization) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 297.8236 cm +q +BT 1 0 0 1 0 14 Tm .960574 Tw 12 TL /F1 10 Tf 0 0 0 rg (Sometimes you need to setup some environment shared between all the ) Tj 0 0 .501961 rg (test cases ) Tj 0 0 0 rg (in a ) Tj 0 0 .501961 rg (test suite) Tj 0 0 0 rg (. You) Tj T* 0 Tw (can use ) Tj /F3 10 Tf (initialization functions ) Tj /F1 10 Tf (for this.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 255.8236 cm +q +BT 1 0 0 1 0 26 Tm 1.340542 Tw 12 TL /F1 10 Tf 0 0 0 rg (An initialization function, like a ) Tj 0 0 .501961 rg (test case) Tj 0 0 0 rg (, is a plain C function with a special name and signature. The) Tj T* 0 Tw 2.140574 Tw (name must start with ) Tj /F5 10 Tf (mu_init ) Tj /F1 10 Tf (and it must take no arguments, and return an ) Tj /F4 10 Tf (error code ) Tj /F1 10 Tf (\() Tj /F5 10 Tf (0 ) Tj /F1 10 Tf (being) Tj T* 0 Tw (success\). For example:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 222.6236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 24 re B* +Q +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL (int mu_init_something\(void\);) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 190.6236 cm +q +BT 1 0 0 1 0 14 Tm .253555 Tw 12 TL /F1 10 Tf 0 0 0 rg (All initialization functions are executed before any ) Tj 0 0 .501961 rg (test case) Tj 0 0 0 rg (, in an ) Tj 0 0 .501961 rg (implementation) Tj 0 0 0 rg (-dependant order, and if) Tj T* 0 Tw (one of them fail \(returns non-zero\), the whole ) Tj 0 0 .501961 rg (test suite ) Tj 0 0 0 rg (is skipped immediately.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 160.6236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (3.6. Termination) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 130.6236 cm +q +BT 1 0 0 1 0 14 Tm .359269 Tw 12 TL /F3 10 Tf 0 0 0 rg (Termination functions ) Tj /F1 10 Tf (are just like ) Tj 0 0 .501961 rg (initialization ) Tj 0 0 0 rg (functions, but they're executed ) Tj /F3 10 Tf (after ) Tj /F1 10 Tf (the ) Tj 0 0 .501961 rg (test cases) Tj 0 0 0 rg (, their) Tj T* 0 Tw (names start with ) Tj /F5 10 Tf (mu_term ) Tj /F1 10 Tf (and they return nothing. For example:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 97.42362 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 24 re B* +Q +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL (void mu_term_something\(void\);) Tj T* ET +Q +Q +Q +Q +Q + +endstream +endobj +% 'R261': class PDFStream +261 0 obj +% page stream +<< /Length 6908 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 62.69291 744.0236 cm +q +BT 1 0 0 1 0 3.5 Tm 21 TL /F3 17.5 Tf 0 0 0 rg (4. C++ Support) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 702.0236 cm +q +BT 1 0 0 1 0 26 Tm .625251 Tw 12 TL /F1 10 Tf 0 0 0 rg (You can use ) Tj /F4 10 Tf (mutest ) Tj /F1 10 Tf (with C++, the only care you must take is that, because of C++ ) Tj 0 0 .501961 rg (name mangling ) Tj 0 0 0 rg (\(and) Tj T* 0 Tw 1.208555 Tw /F4 10 Tf (mutest ) Tj /F1 10 Tf (relaying on function names\), you must declare your ) Tj 0 0 .501961 rg (test cases ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (initialization ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (termination) Tj T* 0 Tw 0 0 0 rg (functions as ) Tj /F5 10 Tf (extern) Tj ( ) Tj ("C" ) Tj /F1 10 Tf (\(see ) Tj 0 0 .501961 rg (exception_test.cpp ) Tj 0 0 0 rg (for an example\).) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 660.0236 cm +q +BT 1 0 0 1 0 26 Tm .386651 Tw 12 TL /F1 10 Tf 0 0 .501961 rg (Checks ) Tj 0 0 0 rg (become ) Tj /F4 10 Tf (exception-safe ) Tj /F1 10 Tf (when using ) Tj /F4 10 Tf (mutest ) Tj /F1 10 Tf (with a C++ compiler, and 2 extra ) Tj 0 0 .501961 rg (checks ) Tj 0 0 0 rg (designed for) Tj T* 0 Tw 1.558443 Tw (C++ get defined \() Tj 0 0 .501961 rg (mu_echeck\(\) ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (mu_eensure\(\)) Tj 0 0 0 rg (\). They assert that an expression throws a particular) Tj T* 0 Tw (exception.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 627.0236 cm +q +BT 1 0 0 1 0 3.5 Tm 21 TL /F3 17.5 Tf 0 0 0 rg (5. Implementations) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 609.0236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (There are 2 big groups of possible implementations that I can think of: ) Tj /F4 10 Tf (static ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (dynamic) Tj /F1 10 Tf (.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 591.0236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F4 10 Tf 0 0 0 rg (mutest ) Tj /F1 10 Tf (comes with one implementation of each group.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 561.0236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (5.1. Static Implementations) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 519.0236 cm +q +BT 1 0 0 1 0 26 Tm .398735 Tw 12 TL /F1 10 Tf 0 0 0 rg (Static implementations can be only written in C/C++ \(or other language that is link-compatible with C, like) Tj T* 0 Tw 3.460651 Tw (the ) Tj 0 0 .501961 rg (D Programming Language) Tj 0 0 0 rg (, but since one of the main goals of ) Tj /F4 10 Tf (mutest ) Tj /F1 10 Tf (is avoid unnecessary) Tj T* 0 Tw (dependencies, you probably don't want to depend on an extra language/compiler to run your tests =\).) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 489.0236 cm +q +BT 1 0 0 1 0 14 Tm 1.262485 Tw 12 TL /F1 10 Tf 0 0 0 rg (The main advantage is better debugging support, because you can run the ) Tj 0 0 .501961 rg (test program ) Tj 0 0 0 rg (in a standard) Tj T* 0 Tw (debugger and see what happens with ) Tj 0 0 .501961 rg (test cases ) Tj 0 0 0 rg (very naturally.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 447.0236 cm +q +BT 1 0 0 1 0 26 Tm .439398 Tw 12 TL /F1 10 Tf 0 0 0 rg (The main disadvantage is, the ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (must be figured out in ) Tj /F4 10 Tf (compile-time) Tj /F1 10 Tf (, usually using some kind of) Tj T* 0 Tw .555868 Tw (code generation \(if you want to avoid writing repetitive code yourself\). There's also a limitation in the ) Tj 0 0 .501961 rg (test) Tj T* 0 Tw (case) Tj 0 0 0 rg (, ) Tj 0 0 .501961 rg (initialization ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (termination ) Tj 0 0 0 rg (functions names: they should be unique for all the ) Tj 0 0 .501961 rg (test program) Tj 0 0 0 rg (.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 420.0236 cm +q +BT 1 0 0 1 0 2.5 Tm 15 TL /F2 12.5 Tf 0 0 0 rg (5.1.1. C implementation) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 378.0236 cm +q +BT 1 0 0 1 0 26 Tm .44784 Tw 12 TL /F4 10 Tf 0 0 0 rg (mutest ) Tj /F1 10 Tf (comes with a C static implementation. Only 3 files are needed: ) Tj /F5 10 Tf (mutest.c ) Tj /F1 10 Tf (\(the ) Tj /F4 10 Tf (user-independent) Tj T* 0 Tw 1.39686 Tw /F1 10 Tf (part of the ) Tj 0 0 .501961 rg (test program) Tj 0 0 0 rg (\), ) Tj /F5 10 Tf (mkmutest ) Tj /F1 10 Tf (\(a bash script for generating the ) Tj /F4 10 Tf (user-dependent ) Tj /F1 10 Tf (part of the ) Tj 0 0 .501961 rg (test) Tj T* 0 Tw (program) Tj 0 0 0 rg (\) and ) Tj /F5 10 Tf (mutest.h ) Tj /F1 10 Tf (\(the header file that ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (should include\).) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 360.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (You can copy this 3 files to your project or install them at system-level and use them globally.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 330.0236 cm +q +BT 1 0 0 1 0 14 Tm 1.415984 Tw 12 TL /F1 10 Tf 0 0 0 rg (The procedure is simple, You should compile you ) Tj 0 0 .501961 rg (test suites) Tj 0 0 0 rg (, ) Tj /F5 10 Tf (mutest.c ) Tj /F1 10 Tf (and the generated output of) Tj T* 0 Tw /F5 10 Tf (mkmutest ) Tj /F1 10 Tf (as object files and link them together.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 312.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (For example:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 230.8236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 72 re B* +Q +q +0 0 0 rg +BT 1 0 0 1 0 50 Tm /F5 10 Tf 12 TL ($ cc -c -o mutest.o mutest.c) Tj T* ($ cc -c -o test1.o test1.c) Tj T* ($ cc -c -o test2.o test2.c) Tj T* ($ mkmutest mutest.h test1.o test2.o | cc -xc -c -o runmutest.o -) Tj T* ($ cc -o testprg mutest.o test1.o test2.o runmutest.o) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 210.8236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Then you can run the ) Tj 0 0 .501961 rg (test program ) Tj 0 0 0 rg (invoking it with no arguments:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 177.6236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 24 re B* +Q +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL ($ ./testprg) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 153.6236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (5.1.1.1. ) Tj /F6 10 Tf (mkmutest ) Tj /F2 10 Tf (Invocation) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 123.6236 cm +q +BT 1 0 0 1 0 14 Tm 1.715318 Tw 12 TL /F1 10 Tf 0 0 0 rg (This small script take 1 mandatory positional argument: the path to the ) Tj /F5 10 Tf (mutest.h ) Tj /F1 10 Tf (file. All remaining) Tj T* 0 Tw (positional arguments should be object files representing ) Tj 0 0 .501961 rg (test suites) Tj 0 0 0 rg (.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 99.62362 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (5.1.1.2. Test Program Invocation) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 81.62362 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The test program can be invoked without arguments, but can take some extra options:) Tj T* ET +Q +Q + +endstream +endobj +% 'R262': class PDFStream +262 0 obj +% page stream +<< /Length 7873 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 62.69291 753.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F7 10 Tf 12 TL (-v) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 684.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 56 Tm T* ET +q +1 0 0 1 20 54 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Be verbose. This is accumulative, when you add extra ) Tj /F5 10 Tf (-v ) Tj /F1 10 Tf (you will get extra verbosity.) Tj T* ET +Q +Q +q +1 0 0 1 20 0 cm +q +BT 1 0 0 1 0 38 Tm .395542 Tw 12 TL /F1 10 Tf 0 0 0 rg (By default, you just get failed ) Tj 0 0 .501961 rg (checks ) Tj 0 0 0 rg (printed. If you use a single ) Tj /F5 10 Tf (-v) Tj /F1 10 Tf (, a summary of failed/passed ) Tj 0 0 .501961 rg (test) Tj T* 0 Tw .690514 Tw (suites) Tj 0 0 0 rg (, ) Tj 0 0 .501961 rg (test cases ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (checks ) Tj 0 0 0 rg (will be printed. If an extra ) Tj /F5 10 Tf (-v ) Tj /F1 10 Tf (is used, you'll see the current ) Tj 0 0 .501961 rg (test suite) Tj T* 0 Tw .099986 Tw 0 0 0 rg (being executed. Another ) Tj /F5 10 Tf (-v ) Tj /F1 10 Tf (and you'll get the current ) Tj 0 0 .501961 rg (test case) Tj 0 0 0 rg (, and another one, and you'll get each) Tj T* 0 Tw 0 0 .501961 rg (check) Tj 0 0 0 rg (.) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 660.0236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (5.1.1.3. Dependencies) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 642.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Even when dependencies are kept minimal, there always be a few ;\)) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 624.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (To use this implementation you just need:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 618.0236 cm +Q +q +1 0 0 1 62.69291 618.0236 cm +Q +q +1 0 0 1 62.69291 606.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 -3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET +Q +Q +q +1 0 0 1 23 -3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (A C compiler \(you already needed that, so...\)) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 600.0236 cm +Q +q +1 0 0 1 62.69291 588.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 -3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET +Q +Q +q +1 0 0 1 23 -3 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F5 10 Tf (nm ) Tj /F1 10 Tf (program \(from ) Tj 0 0 .501961 rg (GNU Binutils) Tj 0 0 0 rg (, included in virtually any *NIX\)) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 582.0236 cm +Q +q +1 0 0 1 62.69291 570.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 -3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET +Q +Q +q +1 0 0 1 23 -3 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj 0 0 .501961 rg (GNU Bash ) Tj 0 0 0 rg (shell interpreter \(also included in virtually any *NIX\)) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 570.0236 cm +Q +q +1 0 0 1 62.69291 540.0236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (5.2. Dynamic Implementations) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 498.0236 cm +q +BT 1 0 0 1 0 26 Tm .84686 Tw 12 TL /F1 10 Tf 0 0 0 rg (Dynamic implementations, on the other hand, can be written in any language that can access to shared) Tj T* 0 Tw 2.661163 Tw (objects. The idea is to inspect a shared object for ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (and run them, without requiring any) Tj T* 0 Tw (information about ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (at compile time.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 432.0236 cm +q +BT 1 0 0 1 0 50 Tm 1.684983 Tw 12 TL /F1 10 Tf 0 0 0 rg (There are several advantages in this kind of implementations. The dynamic nature let you completely) Tj T* 0 Tw 1.71686 Tw (separate the ) Tj 0 0 .501961 rg (test program ) Tj 0 0 0 rg (from the user-written ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (and you can choose at ) Tj /F4 10 Tf (run-time ) Tj /F1 10 Tf (what ) Tj 0 0 .501961 rg (test) Tj T* 0 Tw .237984 Tw (suites ) Tj 0 0 0 rg (to execute by just selecting the correct shared objects. Also, ) Tj 0 0 .501961 rg (test case) Tj 0 0 0 rg (, ) Tj 0 0 .501961 rg (initialization ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (termination) Tj T* 0 Tw .134431 Tw 0 0 0 rg (functions names only have to be unique in the scope of the ) Tj 0 0 .501961 rg (test suites) Tj 0 0 0 rg (, because ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (are completely) Tj T* 0 Tw (isolated in separate shared objects.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 402.0236 cm +q +BT 1 0 0 1 0 14 Tm .720988 Tw 12 TL /F1 10 Tf 0 0 0 rg (But everything comes at a price, and the higher price to pay is ) Tj /F4 10 Tf (debuggability) Tj /F1 10 Tf (. It's a little harder to plug a) Tj T* 0 Tw (debugger to a shared object.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 375.0236 cm +q +BT 1 0 0 1 0 2.5 Tm 15 TL /F2 12.5 Tf 0 0 0 rg (5.2.1. Python implementation) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 333.0236 cm +q +BT 1 0 0 1 0 26 Tm 1.498651 Tw 12 TL /F1 10 Tf 0 0 0 rg (This implementation is much simpler and elegant than the ) Tj 0 0 .501961 rg (C implementation) Tj 0 0 0 rg (. Only 2 files are needed:) Tj T* 0 Tw .951318 Tw /F5 10 Tf (mutest ) Tj /F1 10 Tf (\() Tj 0 0 .501961 rg (test program ) Tj 0 0 0 rg (written in ) Tj 0 0 .501961 rg (Python ) Tj 0 0 0 rg (using ) Tj 0 0 .501961 rg (ctypes ) Tj 0 0 0 rg (module to access the shared object symbols\) and) Tj T* 0 Tw /F5 10 Tf (mutest.h ) Tj /F1 10 Tf (\(the header file that ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (should include\).) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 303.0236 cm +q +BT 1 0 0 1 0 14 Tm 2.823059 Tw 12 TL /F1 10 Tf 0 0 0 rg (Since both implementations provided by ) Tj /F4 10 Tf (mutest ) Tj /F1 10 Tf (share the same ) Tj /F5 10 Tf (mutest.h) Tj /F1 10 Tf (, you should define the) Tj T* 0 Tw /F5 10 Tf (MUTEST_PY ) Tj /F1 10 Tf (macro when compiling the ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (if you will run them using this implementation.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 273.0236 cm +q +BT 1 0 0 1 0 14 Tm .452619 Tw 12 TL /F1 10 Tf 0 0 0 rg (As with the ) Tj 0 0 .501961 rg (C implementation) Tj 0 0 0 rg (, you can copy this 2 files to your project or install them at system-level and) Tj T* 0 Tw (use them globally.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 243.0236 cm +q +BT 1 0 0 1 0 14 Tm 1.578735 Tw 12 TL /F1 10 Tf 0 0 0 rg (The procedure is even simpler than the ) Tj 0 0 .501961 rg (C implementation) Tj 0 0 0 rg (: compile and link you ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (as shared) Tj T* 0 Tw (objects and then run the ) Tj /F5 10 Tf (mutest ) Tj /F1 10 Tf (program passing the shared objects as arguments. For example:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 161.8236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 72 re B* +Q +q +0 0 0 rg +BT 1 0 0 1 0 50 Tm /F5 10 Tf 12 TL ($ cc -c -fPIC -DMUTEST_PY -o test1.o test1.c) Tj T* ($ cc -shared -o test1.so test1.o) Tj T* ($ cc -c -fPIC -DMUTEST_PY -o test2.o test2.c) Tj T* ($ cc -shared -o test2.so test2.o) Tj T* ($ mutest test1.so test2.so) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 141.8236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (That's it.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 117.8236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (5.2.1.1. ) Tj /F6 10 Tf (mutest ) Tj /F2 10 Tf (Invocation) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 87.82362 cm +q +BT 1 0 0 1 0 14 Tm 1.505984 Tw 12 TL /F5 10 Tf 0 0 0 rg (mutest ) Tj /F1 10 Tf (program takes ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (shared objects to run as positional arguments. It accepts the same) Tj T* 0 Tw (options as the ) Tj 0 0 .501961 rg (C implementation's test program ) Tj 0 0 0 rg (and some extra options are accepted too:) Tj T* ET +Q +Q + +endstream +endobj +% 'R263': class PDFStream +263 0 obj +% page stream +<< /Length 6814 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 62.69291 753.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F7 10 Tf 12 TL (--verbose) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 738.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Alias for ) Tj /F5 10 Tf (-v) Tj /F1 10 Tf (.) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 722.0236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F7 10 Tf 0 0 0 rg (-q) Tj /F3 10 Tf (, ) Tj /F7 10 Tf (--quiet) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 707.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Be quiet \(no output is shown at all\).) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 691.0236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F7 10 Tf 0 0 0 rg (-s) Tj /F3 10 Tf (, ) Tj /F7 10 Tf (--search) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 676.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Search for ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (\(*.so\) in the current directory and add them to the list of ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (to run.) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 660.0236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F7 10 Tf 0 0 0 rg (-h) Tj /F3 10 Tf (, ) Tj /F7 10 Tf (--help) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 645.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Show a help message and exit.) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 621.0236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (5.2.1.2. Dependencies) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 603.0236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (As with the ) Tj 0 0 .501961 rg (C implementation) Tj 0 0 0 rg (, some minor dependencies are needed:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 597.0236 cm +Q +q +1 0 0 1 62.69291 597.0236 cm +Q +q +1 0 0 1 62.69291 585.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 -3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET +Q +Q +q +1 0 0 1 23 -3 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Python ) Tj 0 0 0 rg (\(2.5 or later\)) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 579.0236 cm +Q +q +1 0 0 1 62.69291 567.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 -3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET +Q +Q +q +1 0 0 1 23 -3 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F5 10 Tf (nm ) Tj /F1 10 Tf (program \(from ) Tj 0 0 .501961 rg (GNU Binutils) Tj 0 0 0 rg (, included in virtually any *NIX\)) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 567.0236 cm +Q +q +1 0 0 1 62.69291 549.0236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (You will need a C compiler for building the ) Tj 0 0 .501961 rg (test suites ) Tj 0 0 0 rg (too, but technically is not needed by ) Tj /F4 10 Tf (mutest ) Tj /F1 10 Tf (itself ;\)) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 516.0236 cm +q +BT 1 0 0 1 0 3.5 Tm 21 TL /F3 17.5 Tf 0 0 0 rg (6. Reference) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 486.0236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (6.1. ) Tj /F7 15 Tf (mu_check\(\)) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 468.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Synopsis) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 453.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL (mu_check\(expression\)) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 437.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Description) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 422.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Check that the ) Tj /F5 10 Tf (expression ) Tj /F1 10 Tf (evaluates to ) Tj /F4 10 Tf (true) Tj /F1 10 Tf (. Continue with the ) Tj 0 0 .501961 rg (test case ) Tj 0 0 0 rg (if fail.) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 406.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Availability) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 391.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Always) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 375.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Example) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 298.8236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 63.2 Tm T* ET +q +1 0 0 1 20 0 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 448.6898 72 re B* +Q +q +0 0 0 rg +BT 1 0 0 1 0 50 Tm /F5 10 Tf 12 TL (void mu_test\(void\)) Tj T* ({) Tj T* ( mu_check\(5 == 4\); /* fail */) Tj T* ( mu_check\(5 == 5\); /* excecuted, pass */) Tj T* (}) Tj T* ET +Q +Q +Q +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 268.8236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (6.2. ) Tj /F7 15 Tf (mu_ensure\(\)) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 250.8236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Synopsis) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 235.8236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL (mu_ensure\(expression\)) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 219.8236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Description) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 204.8236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Check that the ) Tj /F5 10 Tf (expression ) Tj /F1 10 Tf (evaluates to ) Tj /F4 10 Tf (true) Tj /F1 10 Tf (. Interrupt the ) Tj 0 0 .501961 rg (test case ) Tj 0 0 0 rg (if fail.) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 188.8236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Availability) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 173.8236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Always) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 157.8236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Example) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 81.62362 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 63.2 Tm T* ET +q +1 0 0 1 20 0 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 448.6898 72 re B* +Q +q +0 0 0 rg +BT 1 0 0 1 0 50 Tm /F5 10 Tf 12 TL (void mu_test\(void\)) Tj T* ({) Tj T* ( mu_ensure\(5 == 4\); /* fail */) Tj T* ( mu_check\(5 == 5\); /* not excecuted */) Tj T* (}) Tj T* ET +Q +Q +Q +Q +Q +q +Q +Q + +endstream +endobj +% 'R264': class PDFStream +264 0 obj +% page stream +<< /Length 4504 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 62.69291 747.0236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (6.3. ) Tj /F7 15 Tf (mu_echeck\(\)) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 729.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Synopsis) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 714.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F5 10 Tf 0 0 0 rg (mu_echeck\(class,) Tj ( ) Tj (expression\)) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 698.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Description) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 671.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 14 Tm T* ET +q +1 0 0 1 20 0 cm +q +BT 1 0 0 1 0 14 Tm 1.408443 Tw 12 TL /F1 10 Tf 0 0 0 rg (Check that the ) Tj /F5 10 Tf (expression ) Tj /F1 10 Tf (throws a specific exception ) Tj /F5 10 Tf (class ) Tj /F1 10 Tf (\(or subclass\). Continue with the) Tj T* 0 Tw 0 0 .501961 rg (test case ) Tj 0 0 0 rg (if fail.) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 655.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Availability) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 640.0236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (C++ only) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 624.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Example) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 475.8236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 135.2 Tm T* ET +q +1 0 0 1 20 0 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 448.6898 144 re B* +Q +q +BT 1 0 0 1 0 122 Tm 12 TL /F5 10 Tf 0 0 0 rg (#include ) Tj (<) Tj (stdexcept) Tj (>) Tj T* T* (extern "C") Tj T* ({) Tj T* ( void mu_test\(void\)) Tj T* ( {) Tj T* ( mu_echeck\(std::exception, true\); /* fail */) Tj T* ( mu_echeck\(std::exception,) Tj T* ( throw std::runtime_error\("!"\)\); /* excecuted, pass */) Tj T* ( }) Tj T* (}) Tj T* ET +Q +Q +Q +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 445.8236 cm +q +BT 1 0 0 1 0 3 Tm 18 TL /F3 15 Tf 0 0 0 rg (6.4. ) Tj /F7 15 Tf (mu_eensure\(\)) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 427.8236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Synopsis) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 412.8236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F5 10 Tf 0 0 0 rg (mu_eensure\(class,) Tj ( ) Tj (expression\)) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 396.8236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Description) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 369.8236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 14 Tm T* ET +q +1 0 0 1 20 0 cm +q +BT 1 0 0 1 0 14 Tm 1.749982 Tw 12 TL /F1 10 Tf 0 0 0 rg (Check that the ) Tj /F5 10 Tf (expression ) Tj /F1 10 Tf (throws a specific exception ) Tj /F5 10 Tf (class ) Tj /F1 10 Tf (\(or subclass\). Interrupt the ) Tj 0 0 .501961 rg (test) Tj T* 0 Tw (case ) Tj 0 0 0 rg (if fail.) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 353.8236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Availability) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 338.8236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 2 Tm T* ET +q +1 0 0 1 20 0 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (C++ only) Tj T* ET +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 322.8236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (Example) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 174.6236 cm +0 0 0 rg +BT /F1 10 Tf 12 TL ET +BT 1 0 0 1 0 135.2 Tm T* ET +q +1 0 0 1 20 0 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 448.6898 144 re B* +Q +q +BT 1 0 0 1 0 122 Tm 12 TL /F5 10 Tf 0 0 0 rg (#include ) Tj (<) Tj (stdexcept) Tj (>) Tj T* T* (extern "C") Tj T* ({) Tj T* ( void mu_test\(void\)) Tj T* ( {) Tj T* ( mu_eensure\(std::exception, true\); /* fail */) Tj T* ( mu_echeck\(std::exception,) Tj T* ( throw std::runtime_error\("!"\)\); /* not excecuted */) Tj T* ( }) Tj T* (}) Tj T* ET +Q +Q +Q +Q +Q +q +Q +Q +q +1 0 0 1 62.69291 141.6236 cm +q +BT 1 0 0 1 0 3.5 Tm 21 TL /F3 17.5 Tf 0 0 0 rg (7. About) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 123.6236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (This manual was written using ) Tj 0 0 .501961 rg (reStructuredText) Tj 0 0 0 rg (.) Tj T* ET +Q +Q + +endstream +endobj +% 'R265': class PDFPageLabels +265 0 obj +% Document Root +<< /Nums [ 0 + 266 0 R + 1 + 267 0 R + 2 + 268 0 R + 3 + 269 0 R + 4 + 270 0 R + 5 + 271 0 R + 6 + 272 0 R + 7 + 273 0 R + 8 + 274 0 R + 9 + 275 0 R ] >> +endobj +% 'R266': class PDFPageLabel +266 0 obj +% None +<< /S /D + /St 1 >> +endobj +% 'R267': class PDFPageLabel +267 0 obj +% None +<< /S /D + /St 2 >> +endobj +% 'R268': class PDFPageLabel +268 0 obj +% None +<< /S /D + /St 3 >> +endobj +% 'R269': class PDFPageLabel +269 0 obj +% None +<< /S /D + /St 4 >> +endobj +% 'R270': class PDFPageLabel +270 0 obj +% None +<< /S /D + /St 5 >> +endobj +% 'R271': class PDFPageLabel +271 0 obj +% None +<< /S /D + /St 6 >> +endobj +% 'R272': class PDFPageLabel +272 0 obj +% None +<< /S /D + /St 7 >> +endobj +% 'R273': class PDFPageLabel +273 0 obj +% None +<< /S /D + /St 8 >> +endobj +% 'R274': class PDFPageLabel +274 0 obj +% None +<< /S /D + /St 9 >> +endobj +% 'R275': class PDFPageLabel +275 0 obj +% None +<< /S /D + /St 10 >> +endobj +xref +0 276 +0000000000 65535 f +0000000113 00000 n +0000000286 00000 n +0000000451 00000 n +0000000640 00000 n +0000000827 00000 n +0000001068 00000 n +0000001303 00000 n +0000001496 00000 n +0000001756 00000 n +0000001998 00000 n +0000002241 00000 n +0000002484 00000 n +0000002727 00000 n +0000002970 00000 n +0000003214 00000 n +0000003458 00000 n +0000003702 00000 n +0000003946 00000 n +0000004190 00000 n +0000004434 00000 n +0000004678 00000 n +0000004922 00000 n +0000005166 00000 n +0000005394 00000 n +0000005862 00000 n +0000006105 00000 n +0000006348 00000 n +0000006592 00000 n +0000006836 00000 n +0000007080 00000 n +0000007324 00000 n +0000007568 00000 n +0000007812 00000 n +0000008056 00000 n +0000008300 00000 n +0000008544 00000 n +0000008788 00000 n +0000009032 00000 n +0000009276 00000 n +0000009520 00000 n +0000009764 00000 n +0000010008 00000 n +0000010252 00000 n +0000010496 00000 n +0000010740 00000 n +0000010984 00000 n +0000011228 00000 n +0000011472 00000 n +0000011716 00000 n +0000011960 00000 n +0000012204 00000 n +0000012448 00000 n +0000012692 00000 n +0000012936 00000 n +0000013180 00000 n +0000013424 00000 n +0000013654 00000 n +0000013830 00000 n +0000014074 00000 n +0000014318 00000 n +0000014562 00000 n +0000014806 00000 n +0000015050 00000 n +0000015294 00000 n +0000015538 00000 n +0000015782 00000 n +0000016026 00000 n +0000016270 00000 n +0000016514 00000 n +0000016758 00000 n +0000017002 00000 n +0000017246 00000 n +0000017490 00000 n +0000017734 00000 n +0000017978 00000 n +0000018222 00000 n +0000018466 00000 n +0000018710 00000 n +0000018954 00000 n +0000019198 00000 n +0000019442 00000 n +0000019686 00000 n +0000019930 00000 n +0000020174 00000 n +0000020418 00000 n +0000020662 00000 n +0000020906 00000 n +0000021150 00000 n +0000021394 00000 n +0000021638 00000 n +0000021882 00000 n +0000022125 00000 n +0000022405 00000 n +0000022672 00000 n +0000022909 00000 n +0000023175 00000 n +0000023441 00000 n +0000023710 00000 n +0000023963 00000 n +0000024930 00000 n +0000025174 00000 n +0000025509 00000 n +0000025754 00000 n +0000025999 00000 n +0000026244 00000 n +0000026489 00000 n +0000026734 00000 n +0000026963 00000 n +0000027338 00000 n +0000027638 00000 n +0000027884 00000 n +0000028130 00000 n +0000028376 00000 n +0000028620 00000 n +0000028866 00000 n +0000029112 00000 n +0000029358 00000 n +0000029604 00000 n +0000029833 00000 n +0000030235 00000 n +0000030480 00000 n +0000030726 00000 n +0000030972 00000 n +0000031218 00000 n +0000031464 00000 n +0000031710 00000 n +0000031955 00000 n +0000032200 00000 n +0000032446 00000 n +0000032692 00000 n +0000032938 00000 n +0000033184 00000 n +0000033430 00000 n +0000033676 00000 n +0000033922 00000 n +0000034168 00000 n +0000034414 00000 n +0000034660 00000 n +0000034906 00000 n +0000035152 00000 n +0000035398 00000 n +0000035644 00000 n +0000035888 00000 n +0000036134 00000 n +0000036380 00000 n +0000036609 00000 n +0000037180 00000 n +0000037445 00000 n +0000037690 00000 n +0000037936 00000 n +0000038182 00000 n +0000038428 00000 n +0000038674 00000 n +0000038919 00000 n +0000039165 00000 n +0000039410 00000 n +0000039662 00000 n +0000039908 00000 n +0000040154 00000 n +0000040400 00000 n +0000040646 00000 n +0000040892 00000 n +0000041138 00000 n +0000041384 00000 n +0000041630 00000 n +0000041876 00000 n +0000042122 00000 n +0000042368 00000 n +0000042614 00000 n +0000042860 00000 n +0000043091 00000 n +0000043293 00000 n +0000043522 00000 n +0000044069 00000 n +0000044257 00000 n +0000044503 00000 n +0000044749 00000 n +0000044995 00000 n +0000045241 00000 n +0000045486 00000 n +0000045732 00000 n +0000045978 00000 n +0000046223 00000 n +0000046482 00000 n +0000046738 00000 n +0000046984 00000 n +0000047230 00000 n +0000047476 00000 n +0000047722 00000 n +0000047968 00000 n +0000048213 00000 n +0000048459 00000 n +0000048705 00000 n +0000048951 00000 n +0000049197 00000 n +0000049443 00000 n +0000049689 00000 n +0000049934 00000 n +0000050178 00000 n +0000050443 00000 n +0000050689 00000 n +0000050935 00000 n +0000051181 00000 n +0000051427 00000 n +0000051673 00000 n +0000051919 00000 n +0000052148 00000 n +0000052780 00000 n +0000053026 00000 n +0000053272 00000 n +0000053517 00000 n +0000053761 00000 n +0000054021 00000 n +0000054267 00000 n +0000054513 00000 n +0000054742 00000 n +0000055134 00000 n +0000055380 00000 n +0000055626 00000 n +0000055871 00000 n +0000056118 00000 n +0000056455 00000 n +0000056619 00000 n +0000056938 00000 n +0000057067 00000 n +0000057333 00000 n +0000057663 00000 n +0000057938 00000 n +0000058254 00000 n +0000058561 00000 n +0000058871 00000 n +0000059151 00000 n +0000059437 00000 n +0000059718 00000 n +0000059984 00000 n +0000060290 00000 n +0000060562 00000 n +0000060840 00000 n +0000061185 00000 n +0000061559 00000 n +0000061897 00000 n +0000062232 00000 n +0000062603 00000 n +0000062903 00000 n +0000063282 00000 n +0000063645 00000 n +0000063970 00000 n +0000064267 00000 n +0000064582 00000 n +0000064854 00000 n +0000065147 00000 n +0000065440 00000 n +0000065719 00000 n +0000065936 00000 n +0000066136 00000 n +0000070258 00000 n +0000079190 00000 n +0000083788 00000 n +0000088395 00000 n +0000093547 00000 n +0000100700 00000 n +0000107709 00000 n +0000115683 00000 n +0000122598 00000 n +0000127207 00000 n +0000127429 00000 n +0000127508 00000 n +0000127587 00000 n +0000127666 00000 n +0000127745 00000 n +0000127824 00000 n +0000127903 00000 n +0000127982 00000 n +0000128061 00000 n +0000128140 00000 n +trailer +<< /ID + % ReportLab generated PDF document -- digest (http://www.reportlab.com) + [(\010\207@\355\312B{y\207\001\310\013\021\257\346z) (\010\207@\355\312B{y\207\001\310\013\021\257\346z)] + + /Info 223 0 R + /Root 222 0 R + /Size 276 >> +startxref +128189 +%%EOF diff --git a/source/proj/mutest/releases/.htaccess b/source/proj/mutest/releases/.htaccess new file mode 100644 index 0000000..e1d2560 --- /dev/null +++ b/source/proj/mutest/releases/.htaccess @@ -0,0 +1 @@ +Options +Indexes diff --git a/source/proj/mutest/releases/manual-1.0.html b/source/proj/mutest/releases/manual-1.0.html new file mode 100644 index 0000000..a2fa903 --- /dev/null +++ b/source/proj/mutest/releases/manual-1.0.html @@ -0,0 +1,873 @@ + + + + + + +mutest - A simple micro unit testing framework for C + + + + + + +
+

mutest - A simple micro unit testing framework for C

+ +++ + + + + + + + + + + + +
Author:Leandro Lucarella
Contact:llucax@gmail.com
Version:1.0
Date:2008-12-25
Copyright:Leandro Lucarella (2008), released under the BOLA license
+
+

Abstract

+

mutest is a micro unit testing framework for C (with some +C++ support). It's mostly an idea (it even comes with +2 implementations of the idea!) with the goal of being easy to use +(just write your test cases grouped in test suites and you're +set) and so small and simple that you don't mind to copy the files to +your project and just use it (i.e., no dependencies).

+

The idea is simple: a source file is a test suite, a function is +a test case (special functions can be used for test suite +initialization and termination), which can can have several checks. +Checks comes in 2 flavors, one that only prints an error, and one that +terminates the current test case too. A (normally) automated test +program run all the test suites and print some stats. It fails +(returns non-zero) if any test suite fails.

+
+ +
+

1.   Installation

+

Download the latest distribution tarball and uncompress it.

+

You can also download any release from the releases directory or get it +using Git directly from the Git repository.

+

You can get this manual too, or a PDF version of it.

+

To actually install mutest run:

+
+$ make install
+
+

Default installation path is /usr/local (because of that, you'll probably +need superuser privileges to install to the default location). You can override +that by passing the prefix make variable, for example:

+
+$ make prefix=/opt/mutest install
+
+

If you want to install just the docs, you can do:

+
+$ make install-doc
+
+

Or even install-readme, install-html or install-pdf if you are too +picky.

+

If you want to install just one particular implementation, to can use the +install-c and install-py targets.

+
+
+

2.   Quick Sample

+

You can find some samples in the sample directory.

+

This is an example taken from there. A simple module called factorial.c +with its corresponding test suite (factorial_test.c).

+

You can see some C++ support in the exception_test.cpp test suite.

+
+

2.1.   factorial.c

+
+/*
+ * This file is part of mutest, a simple micro unit testing framework for C.
+ *
+ * mutest was written by Leandro Lucarella <llucax@gmail.com> and is released
+ * under the BOLA license, please see the LICENSE file or visit:
+ * http://blitiri.com.ar/p/bola/
+ *
+ * This is an example module that calculates a factorial.
+ *
+ * Please, read the README file for more details.
+ */
+
+unsigned factorial(unsigned x) {
+	if (x <= 1)
+		return 1;
+	return x * factorial(x-1);
+}
+
+
+
+
+
+

2.2.   factorial_test.c

+
+/*
+ * This file is part of mutest, a simple micro unit testing framework for C.
+ *
+ * mutest was written by Leandro Lucarella <llucax@gmail.com> and is released
+ * under the BOLA license, please see the LICENSE file or visit:
+ * http://blitiri.com.ar/p/bola/
+ *
+ * This is the factorial module test suite. Each (public) function starting
+ * with mu_test will be picked up by mkmutest as a test case.
+ *
+ * Please, read the README file for more details.
+ */
+
+#include "factorial.h"
+
+#include "../mutest.h"
+
+void mu_test_factorial_zero() {
+	unsigned x = factorial(0);
+	mu_check(x == 1);
+}
+
+void mu_test_factorial_one() {
+	unsigned x = factorial(1);
+	/* this test is wrong on purpose, to see how it fails */
+	mu_check(x == 2);
+}
+
+void mu_test_factorial_positive() {
+	unsigned x = factorial(2);
+	/* this test is wrong on purpose, to see how it fails */
+	mu_check(x == 3);
+
+	x = factorial(3);
+	/* we don't want to continue if this fails, because the next result
+	 * depends on this one. This one will succeed. */
+	mu_ensure(x == 6);
+
+	x = factorial(x);
+	mu_check(x == 720);
+
+	x = factorial(4);
+	mu_ensure(x == 6); /* same as before, but this one will fail. */
+
+	x = factorial(x-15); /* and this will never be executed */
+	mu_check(x == 362881); /* but if excecuted, will fail */
+}
+
+
+
+
+
+

2.3.   exception_test.cpp

+
+/*
+ * This file is part of mutest, a simple micro unit testing framework for C.
+ *
+ * mutest was written by Leandro Lucarella <llucax@gmail.com> and is released
+ * under the BOLA license, please see the LICENSE file or visit:
+ * http://blitiri.com.ar/p/bola/
+ *
+ * This is a C++ module test suite. It shows how to use checks involving
+ * exceptions.
+ *
+ * Please, read the README file for more details.
+ */
+
+#include <stdexcept> // std::out_of_range
+#include <vector> // std::vector
+
+#include "../mutest.h"
+
+extern "C" {
+
+void mu_test_exceptions() {
+	std::vector<int> v(1);
+	// ok
+	mu_check(v.at(0) == 0);
+	// throws! This fails
+	mu_check(v.at(1) == 0);
+	// ok, we expect the exception to be thrown, and it does
+	mu_echeck(std::out_of_range, v.at(1));
+	// fails! We expect this to throw, but it doesn't
+	mu_echeck(std::out_of_range, v.at(0));
+	// fails again, but this time the show is over (note the "ensure")
+	mu_eensure(std::out_of_range, v.at(0));
+	// this will never be executed (it should fail if it is)
+	mu_check(v.empty());
+}
+
+} // extern "C"
+
+
+
+
+
+
+

3.   Concepts

+

mutest is about 4 simple concepts: test program, test suite, test +case and checks. Well, to be honest you probably will need test suite +initialization and termination too =)

+
+

3.1.   Test Program

+

A test program is the higher level unit of mutest. The test program is +the one in charge of running all your tests. Probably one of the more important +features of mutest is that you are not supposed to bother about the test +program. So, different implementations have different ways to tackle this. +Some need more or less interactions from your part, and each have their pros +and cons.

+

But this is all you need to know for now, for more details see how the test +program is implemented by your implementation of choice.

+
+
+

3.2.   Test Suite

+

A test suite is the higher level unit of mutest that you should +care about =). Is not much more than a way to group test cases. Code-wise, +a test suite is a C (or C++) module (or compilation unit). Not clear enough? +A unit test is an object file (could be a shared object depending on the +implementation). This module should have one or more test cases and it +could have any number (including zero) of initialization and termination +functions.

+

A test suite, is inspected by the test program for test cases and +initialization and termination functions, and run them.

+

A test suite fail if one or more test cases fail, and it's skipped if one or +more initialization functions fail (or, depending on the implementation, if +the test suite can't be loaded at all).

+
+
+

3.3.   Test Case

+

A test case is just a plain function with a special signature and name. +A test case function name must start with mu_test, and take no arguments +and return nothing. For example:

+
+void mu_test_something(void);
+
+

A test case (probably) only make sense if it has checks. A test case succeed +only if all its checks succeed too.

+

Test are executed in an implementation-dependant order, but usually the +default order is alphabetical.

+
+
+

3.4.   Checks

+

Checks are assertions that a test case must pass (a boolean expression that +must evaluate to true). There are 2 big flavors of checks: check and +ensure. check just print an error (and mark the test case as +failed) and ensure halt the test case execution, jumping to the next +one.

+

For better C++ support there are check macros that assert that a specified +exception is thrown (instead of check for a boolean expression to evaluate to +true).

+

You can take a look at the reference to see the different flavors of check +macros in more detail.

+
+
+

3.5.   Initialization

+

Sometimes you need to setup some environment shared between all the test +cases in a test suite. You can use initialization functions for this.

+

An initialization function, like a test case, is a plain C function with +a special name and signature. The name must start with mu_init and it must +take no arguments, and return an error code (0 being success). For +example:

+
+int mu_init_something(void);
+
+

All initialization functions are executed before any test case, in an +implementation-dependant order, and if one of them fail (returns non-zero), +the whole test suite is skipped immediately.

+
+
+

3.6.   Termination

+

Termination functions are just like initialization functions, but they're +executed after the test cases, their names start with mu_term and +they return nothing. For example:

+
+void mu_term_something(void);
+
+
+
+
+

4.   C++ Support

+

You can use mutest with C++, the only care you must take is that, because of +C++ name mangling (and mutest relaying on function names), you must +declare your test cases and initialization and termination functions as +extern "C" (see exception_test.cpp for an example).

+

Checks become exception-safe when using mutest with a C++ compiler, and +2 extra checks designed for C++ get defined (mu_echeck() and +mu_eensure()). They assert that an expression throws a particular exception.

+
+
+

5.   Implementations

+

There are 2 big groups of possible implementations that I can think +of: static and dynamic.

+

mutest comes with one implementation of each group.

+
+

5.1.   Static Implementations

+

Static implementations can be only written in C/C++ (or other language that is +link-compatible with C, like the D Programming Language, but since one of +the main goals of mutest is avoid unnecessary dependencies, you probably +don't want to depend on an extra language/compiler to run your tests =).

+

The main advantage is better debugging support, because you can run the test +program in a standard debugger and see what happens with test cases very +naturally.

+

The main disadvantage is, the test suites must be figured out in +compile-time, usually using some kind of code generation (if you want to +avoid writing repetitive code yourself). There's also a limitation in the test +case, initialization and termination functions names: they should be unique +for all the test program.

+
+

5.1.1.   C implementation

+

mutest comes with a C static implementation. Only 3 files are needed: +mutest.c (the user-independent part of the test program), mkmutest +(a bash script for generating the user-dependent part of the test program) +and mutest.h (the header file that test suites should include).

+

You can copy this 3 files to your project or install them at system-level and +use them globally.

+

The procedure is simple, You should compile you test suites, mutest.c +and the generated output of mkmutest as object files and link them +together.

+

For example:

+
+$ cc -c -o mutest.o mutest.c
+$ cc -c -o test1.o test1.c
+$ cc -c -o test2.o test2.c
+$ mkmutest mutest.h test1.o test2.o | cc -xc -c -o runmutest.o -
+$ cc -o testprg mutest.o test1.o test2.o runmutest.o
+
+

Then you can run the test program invoking it with no arguments:

+
+$ ./testprg
+
+
+

5.1.1.1.   mkmutest Invocation

+

This small script take 1 mandatory positional argument: the path to the +mutest.h file. All remaining positional arguments should be object files +representing test suites.

+
+
+

5.1.1.2.   Test Program Invocation

+

The test program can be invoked without arguments, but can take some extra +options:

+
+
-v
+

Be verbose. This is accumulative, when you add extra -v you will +get extra verbosity.

+

By default, you just get failed checks printed. If you use a single +-v, a summary of failed/passed test suites, test cases and +checks will be printed. If an extra -v is used, you'll see the current +test suite being executed. Another -v and you'll get the current +test case, and another one, and you'll get each check.

+
+
+
+
+

5.1.1.3.   Dependencies

+

Even when dependencies are kept minimal, there always be a few ;)

+

To use this implementation you just need:

+
    +
  • A C compiler (you already needed that, so...)
  • +
  • The nm program (from GNU Binutils, included in virtually any *NIX)
  • +
  • The GNU Bash shell interpreter (also included in virtually any *NIX)
  • +
+
+
+
+
+

5.2.   Dynamic Implementations

+

Dynamic implementations, on the other hand, can be written in any language that +can access to shared objects. The idea is to inspect a shared object for test +suites and run them, without requiring any information about test suites +at compile time.

+

There are several advantages in this kind of implementations. The dynamic +nature let you completely separate the test program from the user-written +test suites and you can choose at run-time what test suites to execute +by just selecting the correct shared objects. Also, test case, +initialization and termination functions names only have to be unique in the +scope of the test suites, because test suites are completely isolated in +separate shared objects.

+

But everything comes at a price, and the higher price to pay is +debuggability. It's a little harder to plug a debugger to a shared object.

+
+

5.2.1.   Python implementation

+

This implementation is much simpler and elegant than the C implementation. +Only 2 files are needed: mutest (test program written in Python using +ctypes module to access the shared object symbols) and mutest.h (the +header file that test suites should include).

+

Since both implementations provided by mutest share the same mutest.h, +you should define the MUTEST_PY macro when compiling the test suites if +you will run them using this implementation.

+

As with the C implementation, you can copy this 2 files to your project or +install them at system-level and use them globally.

+

The procedure is even simpler than the C implementation: compile and link +you test suites as shared objects and then run the mutest program +passing the shared objects as arguments. For example:

+
+$ cc -c -fPIC -DMUTEST_PY -o test1.o test1.c
+$ cc -shared -o test1.so test1.o
+$ cc -c -fPIC -DMUTEST_PY -o test2.o test2.c
+$ cc -shared -o test2.so test2.o
+$ mutest test1.so test2.so
+
+

That's it.

+
+

5.2.1.1.   mutest Invocation

+

mutest program takes test suites shared objects to run as positional +arguments. It accepts the same options as the C implementation's test +program and some extra options are accepted too:

+
+
--verbose
+
Alias for -v.
+
-q, --quiet
+
Be quiet (no output is shown at all).
+
-s, --search
+
Search for test suites (*.so) in the current directory and add them +to the list of test suites to run.
+
-h, --help
+
Show a help message and exit.
+
+
+
+

5.2.1.2.   Dependencies

+

As with the C implementation, some minor dependencies are needed:

+
    +
  • Python (2.5 or later)
  • +
  • The nm program (from GNU Binutils, included in virtually any *NIX)
  • +
+

You will need a C compiler for building the test suites too, but technically +is not needed by mutest itself ;)

+
+
+
+
+
+

6.   Reference

+
+

6.1.   mu_check()

+
+
Synopsis
+
mu_check(expression)
+
Description
+
Check that the expression evaluates to true. Continue with the +test case if fail.
+
Availability
+
Always
+
Example
+
+void mu_test(void)
+{
+    mu_check(5 == 4); /* fail */
+    mu_check(5 == 5); /* excecuted, pass */
+}
+
+
+
+
+
+

6.2.   mu_ensure()

+
+
Synopsis
+
mu_ensure(expression)
+
Description
+
Check that the expression evaluates to true. Interrupt the test +case if fail.
+
Availability
+
Always
+
Example
+
+void mu_test(void)
+{
+    mu_ensure(5 == 4); /* fail */
+    mu_check(5 == 5); /* not excecuted */
+}
+
+
+
+
+
+

6.3.   mu_echeck()

+
+
Synopsis
+
mu_echeck(class, expression)
+
Description
+
Check that the expression throws a specific exception class (or +subclass). Continue with the test case if fail.
+
Availability
+
C++ only
+
Example
+
+#include <stdexcept>
+
+extern "C"
+{
+    void mu_test(void)
+    {
+        mu_echeck(std::exception, true); /* fail */
+        mu_echeck(std::exception,
+                throw std::runtime_error("!")); /* excecuted, pass */
+    }
+}
+
+
+
+
+
+

6.4.   mu_eensure()

+
+
Synopsis
+
mu_eensure(class, expression)
+
Description
+
Check that the expression throws a specific exception class (or +subclass). Interrupt the test case if fail.
+
Availability
+
C++ only
+
Example
+
+#include <stdexcept>
+
+extern "C"
+{
+    void mu_test(void)
+    {
+        mu_eensure(std::exception, true); /* fail */
+        mu_echeck(std::exception,
+                throw std::runtime_error("!")); /* not excecuted */
+    }
+}
+
+
+
+
+
+
+

7.   About

+

This manual was written using reStructuredText.

+ + + + + +
+
+ + diff --git a/source/proj/mutest/releases/manual-1.0.pdf b/source/proj/mutest/releases/manual-1.0.pdf new file mode 100644 index 0000000..f28169b Binary files /dev/null and b/source/proj/mutest/releases/manual-1.0.pdf differ diff --git a/source/proj/mutest/releases/manual.html b/source/proj/mutest/releases/manual.html new file mode 120000 index 0000000..6658b45 --- /dev/null +++ b/source/proj/mutest/releases/manual.html @@ -0,0 +1 @@ +manual-1.0.html \ No newline at end of file diff --git a/source/proj/mutest/releases/manual.pdf b/source/proj/mutest/releases/manual.pdf new file mode 120000 index 0000000..a4a3038 --- /dev/null +++ b/source/proj/mutest/releases/manual.pdf @@ -0,0 +1 @@ +manual-1.0.pdf \ No newline at end of file diff --git a/source/proj/mutest/releases/mutest-1.0.tar.gz b/source/proj/mutest/releases/mutest-1.0.tar.gz new file mode 100644 index 0000000..95a1c35 Binary files /dev/null and b/source/proj/mutest/releases/mutest-1.0.tar.gz differ diff --git a/source/proj/mutest/releases/mutest.tar.gz b/source/proj/mutest/releases/mutest.tar.gz new file mode 120000 index 0000000..a065ef5 --- /dev/null +++ b/source/proj/mutest/releases/mutest.tar.gz @@ -0,0 +1 @@ +mutest-1.0.tar.gz \ No newline at end of file