doc/loupe-test.txt
author ali <ali@juiblex.co.uk>
Wed Oct 02 09:14:33 2013 +0100 (2013-10-02)
changeset 105 2d48e8cdda24
parent 101 f44c530f80da
permissions -rw-r--r--
Fix bug #19: Update documentation for 2.1
     1                            bookloupe test framework
     2                            ========================
     3 
     4 Running existing testcases
     5 --------------------------
     6 
     7 The test harness (the program that runs a test) is called loupe-test. The
     8 various testcases are stored in multiple text files, typically with a .tst
     9 extension.
    10 
    11 To run a testcase when all of bookloupe, loupe-test and the testcase file are
    12 in the current directory simply do something like:
    13 
    14 % loupe-test missing-space.tst
    15 
    16 from a command prompt. Under MS-Windows, this is called a command window and
    17 the prompt will normally look slightly different, eg.,
    18 
    19 C:\DP> loupe-test missing-space.tst
    20 
    21 To run all the tests in the current directory, do something like this:
    22 
    23 % loupe-test *.tst
    24 
    25 If bookloupe is not in the current directory or you want to run the testsuite
    26 against gutcheck (the program that bookloupe is based on), then you can set an
    27 environment variable (BOOKLOUPE) to point at it. For example, on MS-Windows
    28 you might do:
    29 
    30 C:\DP> set BOOKLOUPE=C:\GUTCHECK\GUTCHECK.EXE
    31 C:\DP> loupe-test *.tst
    32 
    33 When a testcase fails, loupe-test shows the output of bookloupe (or gutcheck)
    34 up until the point where it deviates from the expected result and displays a
    35 carat (^) to point to the exact column where the deviation occurred. Sometimes
    36 it can still be difficult to work out what is happening and so loupe-test also
    37 supports a -o option which will simply print bookloupe's output without comment
    38 or checking.
    39 
    40 Writing your own testcases
    41 --------------------------
    42 
    43 Writing a new testcase is pretty painless. Most testcases follow this simple
    44 pattern:
    45 
    46 		┌──────────────────────────────────────────┐
    47 		│**************** INPUT ****************   │
    48 		│"Look!John, over there!"                  │
    49 		│**************** EXPECTED ****************│
    50 		│                                          │
    51 		│"Look!John, over there!"                  │
    52 		│    Line 1 column 6 - Missing space?      │
    53 		└──────────────────────────────────────────┘
    54 
    55 The sixteen asterisks in this example form what is known as the "flag". This
    56 flag must come before and after all tags (eg., INPUT and EXPECTED). In the
    57 unlikely event that you need sixteen asterisks at the start of a line of text,
    58 then simply choose a different flag and use it throughout the file (flags
    59 can be any sequence of ASCII characters except control codes and space).
    60 
    61 Note that the header that bookloupe and gutcheck normally output is not
    62 included in the expected output. This avoids problems with not knowing
    63 beforehand the name of the file that bookloupe/gutcheck will be asked to
    64 look at (and saves typing!). bookloupe (and gutcheck) prints a blank line
    65 before each warning. These are not part of the header and so do need to
    66 be included.
    67 
    68 To test that bookloupe produces no output, you still need to include
    69 an EXPECTED tag, just with no text following it. If there is no EXPECTED
    70 tag, then loupe-test will consider that no expectation exists and won't
    71 check the output at all.
    72 
    73 Non-ASCII testcases
    74 -------------------
    75 
    76 The testcase definitions (the .tst files) are always written in UTF-8
    77 which is a superset of ASCII. Since gutcheck does not understand UTF-8
    78 this causes a problem when it is desired to include characters that
    79 are not in ASCII in a testcase. To solve this problem it is possible
    80 to specify an encoding to use for the test. It is very important to
    81 undertand that this specifies the encoding that loupe-test will use to
    82 talk to bookloupe/gutcheck and _not_ the encoding of the .tst file
    83 (which remains UTF-8). gutcheck understands Latin-1 (at least to a
    84 limited extent), the canonical name for which is ISO-8859-1:
    85 
    86       ┌─────────────────────────────────────────────────────────────────┐
    87       │**************** ENCODING ****************                       │
    88       │ISO-8859-1                                                       │
    89       │**************** INPUT ****************                          │
    90       │"Hello," he said, "I wanted to bave a tête-à-tête with you."     │
    91       │**************** EXPECTED ****************                       │
    92       │                                                                 │
    93       │"Hello," he said, "I wanted to bave a tête-à-tête with you."     │
    94       │    Line 1 column 31 - Query word bave - not reporting duplicates│
    95       └─────────────────────────────────────────────────────────────────┘
    96 
    97 Embedded linefeeds
    98 ------------------
    99 
   100 One of the tests that bookloupe/gutcheck need to do is check that all
   101 lines are ended with CR LF (as required by PG) rather than the UNIX
   102 standard LF. loupe-test deliberately ignores the line endings in testcase
   103 definition files and uses the expected CR LF. Thus there is needed a means
   104 to embed a linefeed (aka newline) character into the input to be sent
   105 to bookloupe/gutcheck to test that it correctly identified the problem.
   106 loupe-test recognises the unicode symbol for linefeed (U+240A): ␊ which
   107 can be used for this purpose instead of a normal newline.
   108 
   109 UNIX-style newlines
   110 -------------------
   111 
   112 To make life easier for users on UNIX and similar platforms, bookloupe
   113 recognises the case of all lines terminated with UNIX-style newlines.
   114 It notes this in the summary but does not issue any warnings. We thus
   115 need some way to test this case which we do by the NEWLINES tag:
   116 
   117   ┌──────────────────────────────────────────────────────────────────────────┐
   118   │**************** NEWLINES ****************                                │
   119   │LF                                                                        │
   120   │**************** INPUT ****************                                   │
   121   │Katherine was assailed by a sudden doubt. Had she mailed that letter? Yes,│
   122   │she was certain of that. She had run out to the mail box at ten o'clock   │
   123   │at night especially to mail it. What had gone wrong? Why wasn't there     │
   124   │someone to meet her?                                                      │
   125   └──────────────────────────────────────────────────────────────────────────┘
   126 
   127 The possible options are CRLF for DOS-style newlines (the default) and
   128 LF for UNIX-style newlines.
   129 
   130 Passing command line options
   131 ----------------------------
   132 
   133 Some of bookloupe's functionality is only available using command line
   134 options. loupe-test provides a means of specifying these with the
   135 OPTIONS tag:
   136 
   137 		┌──────────────────────────────────────────┐
   138                 │**************** OPTIONS **************** │
   139                 │-m                                        │
   140                 │-d                                        │
   141                 │**************** INPUT ****************   │
   142                 │&ldquo;He went <i>thataway!</i>&rdquo;    │
   143                 │**************** EXPECTED ****************│
   144 		└──────────────────────────────────────────┘
   145 
   146 Extra input files
   147 -----------------
   148 
   149 Under certain circumstances, bookloupe reads other input files than just
   150 the ebook. These can be specified in the testcase definition file by
   151 adding the name of the file to the INPUT tag:
   152 
   153        ┌───────────────────────────────────────────────────────────────┐
   154        │**************** OPTIONS ****************                      │
   155        │-u                                                             │
   156        │**************** INPUT(gutcheck.typ) ****************          │
   157        │arid                                                           │
   158        │**************** INPUT ****************                        │
   159        │I am the very model of a modern Major-General,                 │
   160        │I've information vegetable, animal, and mineral,               │
   161        │I know the kings of England, arid I quote the fights historical│
   162        │From Marathon to Waterloo, in order categorical;               │
   163        │I'm very well acquainted, too, with matters mathematical,      │
   164        │I understand equations, both the simple and quadratical,       │
   165        │About binomial theorem I'm teeming with a lot o' news--        │
   166        │With many cheerful facts about the square of the hypotenuse.   │
   167        │**************** EXPECTED ****************                     │
   168        │                                                               │
   169        │I know the kings of England, arid I quote the fights historical│
   170        │    Line 3 column 29 - Query possible scanno arid              │
   171        └───────────────────────────────────────────────────────────────┘
   172 
   173 Non standard output
   174 -------------------
   175 
   176 Bookloupe normally follows a standard pattern when printing warnings which
   177 loupe-test knows how to interpret. Occasionally this is not suitable and
   178 the testcase needs to specify exactly what should be printed. This can
   179 be done by adding a literal stdout to the EXPECTED tag:
   180 
   181        ┌───────────────────────────────────────────────────────────────┐
   182        │**************** OPTIONS ****************                      │
   183        │--dump-config                                                  │
   184        │**************** EXPECTED(stdout) ****************             │
   185        │# Trivial configuration                                        │
   186        │                                                               │
   187        │[options]                                                      │
   188        │dp=true                                                        │
   189        └───────────────────────────────────────────────────────────────┘
   190 
   191 False-positives
   192 ---------------
   193 
   194 Most of the time, the input can be tweaked so that all warnings bookloupe
   195 reports represent real errors in the text. Sometimes, however, this either
   196 cannot be done and still test what we need to. In these cases we need a
   197 means to describe these false-positives (warnings that do not describe
   198 a real error). This is important so that a later version of bookloupe can
   199 be improved to not issue the false-positive warning and still pass the
   200 test. In order to do this, we need to describe the warnings in a more
   201 structures manner, like this:
   202 
   203        ┌───────────────────────────────────────────────────────────────┐
   204        │**************** OPTIONS ****************                      │
   205        │-s                                                             │
   206        │**************** INPUT ****************                        │
   207        │'In a moment,' Peter replied,' I'm just coming.'               │
   208        │                                                               │
   209        │'Underneath the girls' scarves.                                │
   210        │                                                               │
   211        │**************** WARNINGS ****************                     │
   212        │<expected>                                                     │
   213        │  <error>                                                      │
   214        │    <at line="1" column="30"/>                                 │
   215        │    <text>Wrongspaced singlequotes?</text>                     │
   216        │  </error>                                                     │
   217        │  <false-positive>                                             │
   218        │    <at line="2"/>                                             │
   219        │    <text>Mismatched singlequotes?</text>                      │
   220        │  </false-positive>                                            │
   221        │  <false-negative>                                             │
   222        │    <at line="3" column="1"/>                                  │
   223        │    <at line="4"/>                                             │
   224        │    <text>Mismatched singlequotes?</text>                      │
   225        │  </false-negative>                                            │
   226        │</expected>                                                    │
   227        └───────────────────────────────────────────────────────────────┘
   228 
   229 Here, we use the "WARNINGS" tag instead of "EXPECTED" to denote that we
   230 wish to use structured warnings and the list of warnings is enclosed in
   231 an <expected> ... </expected> node.
   232 
   233 Each warning, or potential warnings is then described using either an
   234 "error" node (for warnings that represent real errors in the text), a
   235 "false-positive" node (for warnings that do not represent real errors),
   236 or a "false-negative" node (for warnings that should be issued, but that
   237 are not yet detected by bookloupe).
   238 
   239 Within each warning node, there are then one or more "at" nodes which
   240 list the acceptable locations for the warning to be reported at (the
   241 first listed should be the preferred location) and exactly one "text"
   242 node which must match the text of the warning issued.
   243 
   244 A testcase will pass if all the warnings marked as errors were issued and
   245 if no warnings were issued that are not listed in one form or another.
   246 If the testcase passes with an expected failure (ie., issues a warning
   247 for a false positive or does not issue a warning for a false negative),
   248 then the test is counted as passed, but a note will be printed describing
   249 this, eg.:
   250 
   251 sample: PASS (with 1 of 1 false positives and 1 of 1 false negatives)
   252 
   253 The summary
   254 -----------
   255 
   256 As part of the header (the first section of output), bookloupe may display
   257 a number of summary lines. These are characterized by a leading ASCII
   258 long arrow (-->) and generally say something about the ebook as a whole
   259 rather than individual lines. Where it is desired to test for the presence
   260 of a summary line, a "summary" node can be included within the "expected"
   261 node of a testcase using structured warnings. The "summary" node can contain
   262 one or more "text" nodes which indicate the text of lines that must be
   263 present in the summary section in order for the test to pass. No account is
   264 taken of the order of such lines and other summary lines may also be present.