This directory contains a collection of test cases that can be used for verifying the behaviour of FORM. It also has a script to run the test cases and check the results.
The test runner script is written in Ruby
and requires Ruby 1.8 or later. The script uses the so-called test/unit
library. In some Linux distributions the library is installed together with
Ruby, while some distributions may have the library as an optional package,
or one may need to manually install
test-unit via the gem
command.
Currently, the script runs only on Unix-like systems.
To use the test suite from the automatic build system (see also the INSTALL file), run
# in the root build directory
make check
which tests the executables (release versions) compiled by the build system.
Alternatively, one can run the test runner script directly:
# in the "check" directory
./check.rb
By default, it tests form
found in $PATH.
To check another executable, give the path as a command line option:
./check.rb /path/to/form
One can specify a TFORM (or ParFORM) executable in this way.
TFORM and ParFORM will be run with 4 CPUs (can be changed by the --cpu N
option).
By default, all test cases in all FORM files (*.frm
) found in the check
directory (not in subdirectories) are used. To select test cases or FORM files
to be run, give their names as command line options, for example,
./check.rb examples.frm
./check.rb Issue8
For more advanced options, see the help message shown by the --help
option.
Currently, the standard test set (run by default) consists of 3 files:
examples.frm
: Examples found in the manual.features.frm
: Test cases for newly added features.fixes.frm
: Test cases for bug fixes.
Each test case in these files should finish in a short time: the timeout is set to 10 seconds.
A test case is given as a fold in a FORM file. A simple example is:
*--#[ Test1 :
S x;
L F = (1+x)^2;
P;
.end
assert succeeded?
assert result("F") =~ expr("1 + 2*x + x^2")
*--#] Test1 :
The fold name Test1
gives the name of the test case, which should be unique.
The part before .end
is a normal FORM program. After .end
, one can write
a Ruby program to check the results. In this example, assert
method (which is
provided by some unit test class) is used for checking whether its argument is
true
. The first assertion checks succeeded?
, which gives true
if the FORM
successfully finishes. The second assertion checks the printed result of the
expression F
by a regular expression matching (=~
). In the left-hand side,
result("F")
returns the (lastly) printed output for the expression F
as
a string. In the right-hand side, expr("...")
makes a regular expression with
removing white spaces in its argument. Since expr()
removes all white spaces,
one can also put new lines, for example,
*--#[ Test2 :
S x;
L F = (1+x)^2;
P +s;
.end
assert succeeded?
assert result("F") =~ expr("
+ 1
+ 2*x
+ x^2
")
*--#] Test2 :
which is convenient to copy and paste a long output from a terminal.
- To verify that FORM finishes with a certain error, one can use
assert compile_error?
orassert runtime_error?
. - Two or more FORM programs, separated by
.end
, can be put in a test case. Then the part after the last.end
is for Ruby. - To skip a test case for some condition, one can specify it by
#pend_if
. (See the result of greppingpend_if
in the existing files.) - When a test case requires other text files, one can use
#prepare write
. (See the result of greppingprepare
in the existing files.)