blob: 3b1b9ae4f845ab64014ef55e351fce4a10077c69 [file] [log] [blame]
Bram Moolenaar46acad72023-06-11 19:04:18 +01001Tests for syntax highlighting plugins
2=====================================
3
4Summary: Files in the "input" directory are edited by Vim with syntax
5highlighting enabled. Screendumps are generated and compared with the
6expected screendumps in the "dumps" directory. This will uncover any
7character attributes that differ.
8
Aliaksei Budaveib5a92d72024-07-07 20:51:14 +02009The dumps are normally 20 screen lines tall. Without any further setup
10a screendump is made at the top of the file (using _00.dump) and another
11screendump is made if there are more lines (using _01.dump), and so on.
Bram Moolenaar46acad72023-06-11 19:04:18 +010012
13When the screendumps are OK an empty "done/{name}" file is created. This
14avoids running the test again until "make clean" is used. Thus you can run
15"make test", see one test fail, try to fix the problem, then run "make test"
16again to only repeat the failing test.
17
18When a screendump differs it is stored in the "failed" directory. This allows
19for comparing it with the expected screendump, using a command like:
20
Aliaksei Budaveib5a92d72024-07-07 20:51:14 +020021 let fname = '{name}_00.dump'
Bram Moolenaar46acad72023-06-11 19:04:18 +010022 call term_dumpdiff('failed/' .. fname, 'dumps/' .. fname)
23
24
25Creating a syntax plugin test
26-----------------------------
27
28Create a source file in the language you want to test in the "input"
Aliaksei Budavei93edd252024-03-05 22:34:36 +030029directory. Use the filetype name as the base and a file name extension
Aliaksei Budavei84184462024-05-21 01:10:26 +030030matching the filetype. Let's use Java as an example. The file would then be
Bram Moolenaar46acad72023-06-11 19:04:18 +010031"input/java.java".
32
Aliaksei Budavei93edd252024-03-05 22:34:36 +030033Make sure to include some interesting constructs with plenty of complicated
34highlighting. Optionally, pre-configure the testing environment by including
Aliaksei Budavei84184462024-05-21 01:10:26 +030035setup commands at the top of the input file. The format for these lines is:
Aliaksei Budavei93edd252024-03-05 22:34:36 +030036
Aliaksei Budaveia2addeb2024-03-18 20:39:32 +010037 VIM_TEST_SETUP {command}
Aliaksei Budavei93edd252024-03-05 22:34:36 +030038
39where {command} is any valid Ex command, which extends to the end of the line.
40The first 20 lines of the input file are ALWAYS scanned for setup commands and
41these will be executed before the syntax highlighting is enabled. Typically,
42these lines would be included as comments so as not to introduce any syntax
43errors in the input file but this is not required.
44
45Continuing the Java example:
46
Aliaksei Budaveia2addeb2024-03-18 20:39:32 +010047 // VIM_TEST_SETUP let g:java_space_errors = 1
48 // VIM_TEST_SETUP let g:java_minlines = 5
Aliaksei Budavei93edd252024-03-05 22:34:36 +030049 class Test { }
50
Aliaksei Budaveif6069a72024-03-05 22:34:36 +030051As an alternative, setup commands can be included in an external Vim script
52file in the "input/setup" directory. This script file must have the same base
53name as the input file.
54
55So, the equivalent example configuration using this method would be to create
56an "input/setup/java.vim" script file with the following lines:
57
58 let g:java_space_errors = 1
59 let g:java_minlines = 5
60
61Both inline setup commands and setup scripts may be used at the same time, the
Aliaksei Budaveia2addeb2024-03-18 20:39:32 +010062script file will be sourced before any VIM_TEST_SETUP commands are executed.
Aliaksei Budaveif6069a72024-03-05 22:34:36 +030063
Aliaksei Budavei84184462024-05-21 01:10:26 +030064Every line of a source file must not be longer than 1425 (19 x 75) characters.
65
Bram Moolenaar46acad72023-06-11 19:04:18 +010066If there is no further setup required, you can now run the tests:
Aliaksei Budavei93edd252024-03-05 22:34:36 +030067
Bram Moolenaar46acad72023-06-11 19:04:18 +010068 make test
69
70The first time this will fail with an error for a missing screendump. The
71newly created screendumps will be "failed/java_00.dump",
72"failed/java_01.dump", etc. You can inspect each with:
73
74 call term_dumpload('failed/java_00.dump')
75 call term_dumpload('failed/java_01.dump')
76 ...
Bram Moolenaar46acad72023-06-11 19:04:18 +010077
78If they look OK, move them to the "dumps" directory:
79
80 :!mv failed/java_00.dump dumps
81 :!mv failed/java_01.dump dumps
82 ...
Bram Moolenaar46acad72023-06-11 19:04:18 +010083
84If you now run the test again, it will succeed.
85
86
87Adjusting a syntax plugin test
88------------------------------
89
90If you make changes to the syntax plugin, you should add code to the input
91file to see the effect of these changes. So that the effect of the changes
92are covered by the test. You can follow these steps:
93
941. Edit the syntax plugin somewhere in your personal setup. Use a file
95 somewhere to try out the changes.
962. Go to the directory where you have the Vim code checked out and replace the
97 syntax plugin. Run the tests: "make test". Usually the tests will still
98 pass, but if you fixed syntax highlighting that was already visible in the
99 input file, carefully check that the changes in the screendump are
100 intentional:
Aliaksei Budavei93edd252024-03-05 22:34:36 +0300101
Aliaksei Budaveib5a92d72024-07-07 20:51:14 +0200102 let fname = '{name}_00.dump'
Bram Moolenaar46acad72023-06-11 19:04:18 +0100103 call term_dumpdiff('failed/' .. fname, 'dumps/' .. fname)
Aliaksei Budavei93edd252024-03-05 22:34:36 +0300104
Bram Moolenaar46acad72023-06-11 19:04:18 +0100105 Fix the syntax plugin until the result is good.
1062. Edit the input file for your language to add the items you have improved.
107 (TODO: how to add another screendump?).
108 Run the tests and you should get failures. Like with the previous step,
109 carefully check that the new screendumps in the "failed" directory are
110 good. Update the syntax plugin and the input file until the highlighting
111 is good and you can see the effect of the syntax plugin improvements. Then
112 move the screendumps from the "failed" to the "dumps" directory. Now "make
113 test" should succeed.
1143. Prepare a pull request with the modified files:
115 - syntax plugin: syntax/{name}.vim
Aliaksei Budaveif6069a72024-03-05 22:34:36 +0300116 - Vim setup file: syntax/testdir/input/setup/{name}.vim (if any)
Bram Moolenaar46acad72023-06-11 19:04:18 +0100117 - test input file: syntax/testdir/input/{name}.{ext}
Aliaksei Budaveib5a92d72024-07-07 20:51:14 +0200118 - test dump files: syntax/testdir/dumps/{name}_00.dump
119 syntax/testdir/dumps/{name}_01.dump (if any)
120 ...
Bram Moolenaar46acad72023-06-11 19:04:18 +0100121
122As an extra check you can temporarily put back the old syntax plugin and
123verify that the tests fail. Then you know your changes are covered by the
124test.
125
126
Aliaksei Budaveid33afe12024-08-12 18:37:15 +0200127Viewing generated screendumps
128-----------------------------
129
130You may also wish to look at the whole batch of failed screendumps after
131running "make test". Source the "viewdumps.vim" script for this task:
132
133 [VIMRUNTIME=../..] \
134 ../../src/vim --clean -S testdir/viewdumps.vim \
135 [testdir/dumps/java_*.dump ...]
136
137By default, all screendumps found in the "failed" directory will be added to
138the argument list and then the first one will be loaded. Loaded screendumps
139that bear filenames of screendumps found in the "dumps" directory will be
140rendering the contents of any such pair of files and the difference between
141them (:help term_dumpdiff()); otherwise, they will be rendering own contents
142(:help term_dumpload()). Remember to execute :edit when occasionally you see
143raw file contents instead of rendered.
144
145At any time, you can add, list, and abandon other screendumps:
146
147 :$argedit testdir/dumps/java_*.dump
148 :args
149 :qall
150
151The listing of argument commands can be found under :help buffer-list.
Bram Moolenaar46acad72023-06-11 19:04:18 +0100152
Bram Moolenaar46acad72023-06-11 19:04:18 +0100153
Aliaksei Budavei93edd252024-03-05 22:34:36 +0300154TODO: run test for one specific filetype
Bram Moolenaar46acad72023-06-11 19:04:18 +0100155TODO: test syncing by jumping around