# WhileyLanguageTests
A suite of acceptance tests for tools (e.g. compilers / verifiers) working with Whiley. These test clarify expected semantics of the language, as well as expectations regarding verification performance.
## Overview
Tests are written using the test file format setout in
[RFC#110](https://github.com/Whiley/RFCs/blob/master/text/0110-test-file-format.md).
This means test can cover various aspects of the language:
* **Multiple Files**. An individual test is not limited to a
single `whiley` file, but can describe multiple files spread
across an arbitrary directory structure.
* **Frames**. An individual test is made up of one or more
_frames_. In the first frame, the initial state of files is set
out. After that, frames can include incremental updates to
specific files, deletion of files, etc.
* **Errors**. After each frame in a test, the expected set of
errors are listed (if any are expected). This means, for
example, a test can start out with an initial file that fails to
compile, and then update that file (one or more times) to the
point where it now compiles. Errors are listed based on the
error codes set out in the [language
specification](https://github.com/Whiley/WhileyDocs/tree/master/WhileyLanguageSpecification).
* **Static / Dynamic**. Testing covers the static checking aspects
of the language (e.g. type checking), but also runtime execution.
This means tests can be used to clarify the expected language
[semantics](https://en.wikipedia.org/wiki/Semantics_(computer_science)).
* **Ignores**. Tests can be marked as _ignored_ with respect to
the compiler as a whole, or a specific backend. For example, if
a test does not compile correctly on the JavaScript backend, it
can be marked as ignored for that backend only.
Overall, the test file format has proved remarkably flexible to date.
Some aspects, however, are not covered. For example, there is no
mechanism for performance regression testing, etc.
## Example
An example test (`001024.test`) is
```
original.name="MethodCall_Invalid_8"
======
>>> main.whiley
function f() -> int:
&int x = new 1
return 1
---
E607 main.whiley 2,13:17
```
This is about the simplest possible test, and consists of only one
frame. Meta-data for the test is given before the first frame begins
(which in this case identifies the original name given to this test).
This test expects the given file to fail compilation with an error
`E607` (as memory allocation is not permitted in a `function`).
Another more detailed test (`001398.test`) is the following:
```
js.compile.ignore=true
=====
>>> main.whiley
type Rec is {int f, int g}
public export method test():
Rec xs = Rec{f:123, g:456}
assert xs == {f:223, g:789}
---
E705 main.whiley 5,10:29
E722 main.whiley 5,10:29
=====
>>> main.whiley 5:6
assert xs{g:=789}{f:=223} == {f:223, g:789}
---
```
In this case, the metadata provided indicates that we cannot yet
compiler this on the JavaScript backend. The test consists of two
frames. Initially, the file `main.whiley` is expected to fail at
runtime with (`E705`) and also to fail verification (`E722`). Then,
in the second frame, line `5` from the original file is replaced with
a different assertion and test now compiles, verifies and executes
without problem.