aboutsummaryrefslogtreecommitdiff
path: root/test/sam/README.md
blob: 64b14e2538600b54049c755557dfbcb7bca859fd (plain) (blame)
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.