2011-06-12 16:57:14 -04:00
|
|
|
zsh-syntax-highlighting / tests
|
|
|
|
===============================
|
|
|
|
|
|
|
|
Utility scripts for testing zsh-syntax-highlighting highlighters.
|
|
|
|
|
2015-11-16 17:31:18 -05:00
|
|
|
The tests harness expects the highlighter directory to contain a `test-data`
|
|
|
|
directory with test data files.
|
|
|
|
See the [main highlighter](../highlighters/main/test-data) for examples.
|
2011-06-12 16:57:14 -04:00
|
|
|
|
2020-02-28 17:26:49 -05:00
|
|
|
Tests should set the following variables:
|
|
|
|
|
|
|
|
1.
|
2016-05-12 23:09:45 -04:00
|
|
|
Each test should define the string `$BUFFER` that is to be highlighted and the
|
|
|
|
array parameter `$expected_region_highlight`.
|
2015-11-16 22:02:39 -05:00
|
|
|
The value of that parameter is a list of strings of the form `"$i $j $style"`.
|
|
|
|
or `"$i $j $style $todo"`.
|
2015-09-12 16:29:04 -04:00
|
|
|
Each string specifies the highlighting that `$BUFFER[$i,$j]` should have;
|
|
|
|
that is, `$i` and `$j` specify a range, 1-indexed, inclusive of both endpoints.
|
2018-02-06 20:14:26 -05:00
|
|
|
`$style` is a key of `$ZSH_HIGHLIGHT_STYLES`.
|
2015-11-16 22:02:39 -05:00
|
|
|
If `$todo` exists, the test point is marked as TODO (the failure of that test
|
|
|
|
point will not fail the test), and `$todo` is used as the explanation.
|
2020-02-28 17:26:49 -05:00
|
|
|
|
|
|
|
2.
|
2017-11-06 08:08:53 -05:00
|
|
|
If a test sets `$skip_test` to a non-empty string, the test will be skipped
|
|
|
|
with the provided string as the reason.
|
2020-02-28 17:26:49 -05:00
|
|
|
|
|
|
|
3.
|
2018-02-06 20:14:26 -05:00
|
|
|
If a test sets `unsorted=1` the order of highlights in `$expected_region_highlight`
|
|
|
|
need not match the order in `$region_highlight`.
|
2015-09-12 16:29:04 -04:00
|
|
|
|
2020-02-28 17:26:49 -05:00
|
|
|
4.
|
2018-12-29 06:31:18 -05:00
|
|
|
Normally, tests fail if `$expected_region_highlight` and `$region_highlight`
|
|
|
|
have different numbers of elements. Tests may set `$expected_mismatch` to an
|
2019-11-10 06:29:20 -05:00
|
|
|
explanation string (like `$todo`) to avoid this and skip the cardinality check.
|
tests: Skip cardinality tests whenever any test point is expected to fail.
When writing an expected-to-fail test case, the cardinality of $region_highlight
at the time the test is written may differ from the cardinality it will have
once the bug is fixed. For example, with issue #641.5, the current highlighting
is ['nice', 'x=y', 'y', 'ls'] — four elements — but the correct highlighting
would have three elements: ['nice', 'x=y', 'ls']. There is no point in reporting
a separate test failure for the cardinality check in this case, nor for 'ls' being
highlighted as 'command' rather than 'default'.
At the same time, in other cases the current and correct highlighting may have the
same number of elements (for example, this would be the case for a hypothetical
"the command word is highlighted as an alias rather than a function" bug). Thus,
the previous commit, q.v..
2019-11-10 06:35:21 -05:00
|
|
|
`$expected_mismatch` is set implicitly if the `$todo` component is present.
|
2018-12-29 06:31:18 -05:00
|
|
|
|
2015-11-16 22:02:39 -05:00
|
|
|
**Note**: `$region_highlight` uses the same `"$i $j $style"` syntax but
|
|
|
|
interprets the indexes differently.
|
2015-09-12 16:29:04 -04:00
|
|
|
|
2017-11-04 12:19:00 -04:00
|
|
|
**Note**: Tests are run with `setopt NOUNSET WARN_CREATE_GLOBAL`, so any
|
|
|
|
variables the test creates must be declared local.
|
|
|
|
|
2015-11-16 22:02:39 -05:00
|
|
|
**Isolation**: Each test is run in a separate subshell, so any variables,
|
|
|
|
aliases, functions, etc., it defines will be visible to the tested code (that
|
|
|
|
computes `$region_highlight`), but will not affect subsequent tests. The
|
|
|
|
current working directory of tests is set to a newly-created empty directory,
|
2016-05-06 00:31:58 -04:00
|
|
|
which is automatically cleaned up after the test exits. For example:
|
2015-11-16 17:31:18 -05:00
|
|
|
|
2019-01-13 03:12:41 -05:00
|
|
|
```zsh
|
|
|
|
setopt PATH_DIRS
|
|
|
|
mkdir -p foo/bar
|
|
|
|
touch foo/bar/testing-issue-228
|
|
|
|
chmod +x foo/bar/testing-issue-228
|
|
|
|
path+=( "$PWD"/foo )
|
2016-05-06 00:31:58 -04:00
|
|
|
|
2019-01-13 03:12:41 -05:00
|
|
|
BUFFER='bar/testing-issue-228'
|
2016-05-06 00:31:58 -04:00
|
|
|
|
2019-01-13 03:12:41 -05:00
|
|
|
expected_region_highlight=(
|
|
|
|
"1 21 command" # bar/testing-issue-228
|
|
|
|
)
|
|
|
|
```
|
2011-06-12 16:57:14 -04:00
|
|
|
|
2016-07-28 19:15:32 -04:00
|
|
|
|
|
|
|
Writing new tests
|
|
|
|
-----------------
|
|
|
|
|
|
|
|
An experimental tool is available to generate test files:
|
|
|
|
|
2019-01-13 03:12:41 -05:00
|
|
|
```zsh
|
|
|
|
zsh -f tests/generate.zsh 'ls -x' acme newfile
|
|
|
|
```
|
2016-07-28 19:15:32 -04:00
|
|
|
|
2016-07-29 15:02:40 -04:00
|
|
|
This generates a `highlighters/acme/test-data/newfile.zsh` test file based on
|
|
|
|
the current highlighting of the given `$BUFFER` (in this case, `ls -x`).
|
2016-07-28 19:15:32 -04:00
|
|
|
|
|
|
|
_This tool is experimental._ Its interface may change. In particular it may
|
2016-07-29 15:02:40 -04:00
|
|
|
grow ways to set `$PREBUFFER` to inject free-form code into the generated file.
|
2016-07-28 19:15:32 -04:00
|
|
|
|
|
|
|
|
2015-11-16 22:25:03 -05:00
|
|
|
Highlighting test
|
2011-06-12 16:57:14 -04:00
|
|
|
-----------------
|
2015-11-16 21:54:53 -05:00
|
|
|
|
2015-11-16 22:02:39 -05:00
|
|
|
[`test-highlighting.zsh`](tests/test-highlighting.zsh) tests the correctness of
|
|
|
|
the highlighting. Usage:
|
2011-06-12 16:57:14 -04:00
|
|
|
|
2019-01-13 03:12:41 -05:00
|
|
|
```zsh
|
|
|
|
zsh test-highlighting.zsh <HIGHLIGHTER NAME>
|
|
|
|
```
|
2011-06-12 16:57:14 -04:00
|
|
|
|
2015-10-22 23:27:05 -04:00
|
|
|
All tests may be run with
|
|
|
|
|
2019-01-13 03:12:41 -05:00
|
|
|
```zsh
|
|
|
|
make test
|
|
|
|
```
|
2015-10-22 23:27:05 -04:00
|
|
|
|
2015-11-16 22:02:39 -05:00
|
|
|
which will run all highlighting tests and report results in [TAP format][TAP].
|
2016-01-02 16:22:01 -05:00
|
|
|
By default, the results of all tests will be printed; to show only "interesting"
|
|
|
|
results (tests that failed but were expected to succeed, or vice-versa), run
|
|
|
|
`make quiet-test` (or `make test QUIET=y`).
|
2015-11-16 22:02:39 -05:00
|
|
|
|
|
|
|
[TAP]: http://testanything.org/
|
2015-10-22 23:27:05 -04:00
|
|
|
|
2011-06-12 16:57:14 -04:00
|
|
|
|
2015-11-16 22:25:03 -05:00
|
|
|
Performance test
|
2011-06-12 16:57:14 -04:00
|
|
|
----------------
|
2015-11-16 21:54:53 -05:00
|
|
|
|
2015-11-16 22:02:39 -05:00
|
|
|
[`test-perfs.zsh`](tests/test-perfs.zsh) measures the time spent doing the
|
|
|
|
highlighting. Usage:
|
2011-06-12 16:57:14 -04:00
|
|
|
|
2019-01-13 03:12:41 -05:00
|
|
|
```zsh
|
|
|
|
zsh test-perfs.zsh <HIGHLIGHTER NAME>
|
|
|
|
```
|
2015-10-27 03:46:51 -04:00
|
|
|
|
|
|
|
All tests may be run with
|
|
|
|
|
2019-01-13 03:12:41 -05:00
|
|
|
```zsh
|
|
|
|
make perf
|
|
|
|
```
|