1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
Tests for vis - structural regular expression support
-----------------------------------------------------
We test the structural regular expression implementation by supplying
the same command to both vis and [sam](http://sam.cat-v.org/). More
concretely, we use `ssam(1)` the non-graphical streaming interface to
sam. These tests are intended to be run on a system with
[9base](http://tools.suckless.org/9base) or
[plan9port](https://swtch.com/plan9port/) installed.
However, be aware that there exist some incompatibilities between the
implementation in sam and vis which need to be taken into account
when writing tests:
* _missing commands_: vis does currently deliberately not implement
some commands available in sam (e.g. `m`, `t`, `=` `=#`, `k`, `u`).
Additionally the commands operating on multiple files are either
not implemented or currently not supported by the testing
infrastructure.
* _different semantics_: some language constructs have slightly
different semantics. Of particular relevance is the different grouping
implementation. In sam each command of a group is executed with
the same initial file state and all changes are later applied in parallel
(if no conflict occurred and all changes were in sequence). Whereas
vis applies the changes immediately and subsequent commands will
operate on the modified file content.
As a consequence the following snippet to swap two words does currently
not work in vis:
```
,x/[a-zA-Z]+/{
g/Emacs/ v/....../ c/vi/
g/vi/ v/.../ c/Emacs/
}
```
This is particularly relevant for the tests because they are all
executed in an implicit group.
* _changes need to be in sequence_: sam will reject changes which are not
in sequence (i.e. all changes need to be performed in ascending file
position). The following will not work:
```
{
10d
5d
}
?changes not in sequence
```
However, due to the aforementioned vis grouping semantics, swapping
the line numbers around, will not produce the same result either
(line 5 will already be deleted by the time the address of line 10
is evaluated, thus the original line 11 will be deleted instead).
* _spurious white spaces_: in sam an empty line/command affects the
dot (current range to operate on), namely it is extended to cover
the whole line. However in vis we ignore all white space between
commands. In order to avoid differing behavior avoid spurious white
space between your commands in the test cases.
For now the tests need to take these quirks into account, some of the
vis behavior might be changed in the future.
A test constitutes of 3 files, the first 2 of which are mandatory:
* `test.in` the file/buffer content with which the editor is started
* `test.cmd` a file containing the structural regular expression
command as you would type it in vis at the `:`-prompt or pass to
`ssam(1)`.
* `test.ref` if omitted, the output from sam will be considered as
reference.
The top level shell script `test.sh` looks for these files in sub
directories, executes both editors and compares the resulting output.
Type `make` to run all tests.
|