5.8 KiB
JATS test markup specification
This document specifies the format tests are written in for JATS (Just Another Test Suite).
Definitions
A test file represents a file inside the ~japl/tests/japl/
directory. All of these files are parsed
to find any defined tests.
A test file can contain multiple tests. A test is a piece of JAPL source code, along with its input (given in stdin) and expected output (in stdout and stderr), or the means to construct these fields. It may also contain other metadata, such as the name of the test, or whether it is to be skipped.
The test files are parsed line by line. The parser switches modes during the parsing. The modes dictate the state of the parser, and where each line ends up (which field of which test).
There is a special mode, root mode, which describes the state of the parser when it just enters the file. It can stay in this state during parsing, can leave it by entering another mode and can return to it, by leaving any mode it has entered.
Test files
Must be utf-8 (for now only ascii was tested).
Must not contain a BOM. Line endings must be a single
\n
. Please configure your editor to support this.
Syntax
Mode syntax
The modes are constructed from modelines, which are lines starting with the character '[', or alternatively they can also start with the sequence "//[". Modelines also have to be closed by a ']' character on the end of this line. These lines may not contain whitespace before the opening '[' or "//[" nor after then ending ']' characters. Inside the brackets, letters (case insensitive), numbers, underscores and dashes form a name describing what the modeline does.
[ name ]
//[ name ]
Optionally, an argument may be passed, which is separated by a colon.
[ name : detail ]
//[name: detail]
Whitespace inside the brackets is ignored (even inside names). More than one colon, or any character that is not whitespace, a letter, a digit, a colon, an underscore or a dash inside is a syntax error, which results in a fatal error, causing the whole test file to be invalid. The user is always warned when such a fatal syntax error occurs.
It is possible for lines beginning with '[' to not be modelines. When a line starts with '[[', it escapes the opening left bracket, as if the line was a regular one (the '[[' is reduced to '['). When a line starts with '[;' it is a comment, which is not a modeline nor a line that shows up in the current mode.
A different mode can be entered and left by the following syntax.
[Modename]
[end]
A modeline that is not defined to be a legal one for the current mode is a syntax error, which invalidates the whole test file. It also raises a visible warning to the user.
Possible modes
Root mode
Inside the root mode, all lines that are not modelines are assumed to be comments.
There is one possible mode to enter from the root mode, a test mode. The test modes are entered when the "test" mode line is specified. The detail for the modeline corresponds to the name of the test.
[test: testname]
[end]
Test modes
Inside test modes, all lines that are not modelines are assumed to be comments.
There are different modelines that do actions or modes that can be entered from tests. They are all defined below.
Skipping a test
The modeline skip
skips a test. It does not enter
a different mode, so no end
is neccessary.
[skip]
Adding JAPL source to a test
The modeline source
enters the mode source, which
is useful for appending to the JAPL source of the
test.
[source]
print("Hello from JAPL!");
[end]
There are two kinds of source modes, raw and mixed.
Mixed source mode can be entered if the detail mixed
is specified. Raw source mode can be entered if the
detail raw
is specified. When no detail is specified,
raw source mode is assumed.
In raw source mode, all lines in the mode are appended as they are to the JAPL source. In mixed mode, comments inside this JAPL source can be added to add lines to the expected stdout/stderr or the stdin of the test using the legacy test format.
They are defined by the sequences //stdout:
,
//stderr:
, //stdin:
, //matchout:
and
//matcherr:
. Every character after the colon and
before the end of the line is appended to the respective
field of the test. stdout
adds a raw line to be
matched to the expected stdout of the test. matchout
adds a regex to match a line of the stdout of the test.
stderr
and matcherr
are the stderr equivalents.
stdin
adds a line to the stdin that the JAPL source
can read from.
[source: mixed]
print("Hello from JAPL!");//stdout:Hello from JAPL!
[end]
Adding expected output to the test
The mode stdout
can add standard output to expect
from the JAPL source when it is ran.
[test: hello]
[source: raw]
print("Banana.");
[end]
[stdout]
Banana.
[end]
[end]
The option re
can be added if every line is to
be a regex matched against a line of stdout.
The option nw
will strip leading and trailing
whitespace from every line in the mode before
adding it to the expected lines. The option nwre
adds regex based matching lines after stripping
whitespace.
The mode stderr
does the same as stdout
, but
for the standard error. It accepts the same options.
Adding input to the test
The mode stdin
can add standard input that the
JAPL source of the test can read from.
[test: inputtest]
[source: raw]
print(readLine());
[end]
[stdin]
Hello there
[end]
[stdout]
Hello there
[end]
Adding python to the tests
Coming soon.
Best practices
Tests should be written so that they are valid jpl code. The test title
and modes surrounding source code should be prefixed with //
. Stdin/stdout
and other raw non-jpl sources should be inside /* */
blocks. Single line
commands such as skips should be either prefixed with //
or inside a /* */
block.