xref: /Universal-ctags/docs/testing-parser.rst (revision 8c31bb07cae649f474bc4eab644d201c72b6886f)
1*8c31bb07SMasatake YAMATO.. _testing_parser:
2*8c31bb07SMasatake YAMATO
3*8c31bb07SMasatake YAMATO=============================================================================
4*8c31bb07SMasatake YAMATOTesting a parser
5*8c31bb07SMasatake YAMATO=============================================================================
6*8c31bb07SMasatake YAMATO
7*8c31bb07SMasatake YAMATO
8*8c31bb07SMasatake YAMATO.. contents:: `Table of contents`
9*8c31bb07SMasatake YAMATO	:depth: 3
10*8c31bb07SMasatake YAMATO	:local:
11*8c31bb07SMasatake YAMATO
12*8c31bb07SMasatake YAMATOIt is difficult for us to know syntax of all languages supported in ctags. Test
13*8c31bb07SMasatake YAMATOfacility and test cases are quite important for maintaining ctags with limited
14*8c31bb07SMasatake YAMATOresources.
15*8c31bb07SMasatake YAMATO
16*8c31bb07SMasatake YAMATO..	_units:
17*8c31bb07SMasatake YAMATO
18*8c31bb07SMasatake YAMATO*Units* test facility
19*8c31bb07SMasatake YAMATO---------------------------------------------------------------------
20*8c31bb07SMasatake YAMATO
21*8c31bb07SMasatake YAMATO:Maintainer: Masatake YAMATO <yamato@redhat.com>
22*8c31bb07SMasatake YAMATO
23*8c31bb07SMasatake YAMATO----
24*8c31bb07SMasatake YAMATO
25*8c31bb07SMasatake YAMATO**Test facility**
26*8c31bb07SMasatake YAMATO
27*8c31bb07SMasatake YAMATOExuberant Ctags has a test facility. The test case were *Test*
28*8c31bb07SMasatake YAMATOdirectory. So Here I call it *Test*.
29*8c31bb07SMasatake YAMATO
30*8c31bb07SMasatake YAMATOMain aim of the facility is detecting regression. All files under Test
31*8c31bb07SMasatake YAMATOdirectory are given as input for old and new version of ctags
32*8c31bb07SMasatake YAMATOcommands.  The output tags files of both versions are compared. If any
33*8c31bb07SMasatake YAMATOdifference is found the check fails. *Test* expects the older ctags
34*8c31bb07SMasatake YAMATObinary to be correct.
35*8c31bb07SMasatake YAMATO
36*8c31bb07SMasatake YAMATOThis expectation is not always met. Consider that a parser for a new
37*8c31bb07SMasatake YAMATOlanguage is added. You may want to add a sample source code for that
38*8c31bb07SMasatake YAMATOlanguage to *Test*. An older ctags version is unable to generate a
39*8c31bb07SMasatake YAMATOtags file for that sample code, but the newer ctags version does. At
40*8c31bb07SMasatake YAMATOthis point a difference is found and *Test* reports failure.
41*8c31bb07SMasatake YAMATO
42*8c31bb07SMasatake YAMATO**Units facility**
43*8c31bb07SMasatake YAMATO
44*8c31bb07SMasatake YAMATOThe units test facility (*Units*) I describe here takes a different
45*8c31bb07SMasatake YAMATOapproach. An input file and an expected output file are given by a
46*8c31bb07SMasatake YAMATOcontributor of a language parser. The units test facility runs ctags
47*8c31bb07SMasatake YAMATOcommand with the input file and compares its output and the expected
48*8c31bb07SMasatake YAMATOoutput file. The expected output doesn't depend on ctags.
49*8c31bb07SMasatake YAMATO
50*8c31bb07SMasatake YAMATOIf a contributor sends a patch which may improve a language parser,
51*8c31bb07SMasatake YAMATOand if a reviewer is not familiar with that language, s/he cannot
52*8c31bb07SMasatake YAMATOevaluate it.
53*8c31bb07SMasatake YAMATO
54*8c31bb07SMasatake YAMATO*Unit* test files, the pair of input file and expected output file may
55*8c31bb07SMasatake YAMATObe able to explain the intent of patch well; and may help the
56*8c31bb07SMasatake YAMATOreviewer.
57*8c31bb07SMasatake YAMATO
58*8c31bb07SMasatake YAMATOHow to write a test case
59*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
60*8c31bb07SMasatake YAMATO
61*8c31bb07SMasatake YAMATOThe test facility recognizes an input file and an expected
62*8c31bb07SMasatake YAMATOoutput file by patterns of file name. Each test case should
63*8c31bb07SMasatake YAMATOhave its own directory under Units directory.
64*8c31bb07SMasatake YAMATO
65*8c31bb07SMasatake YAMATO*Units/TEST/input.\** **requisite**
66*8c31bb07SMasatake YAMATO
67*8c31bb07SMasatake YAMATO	Input file name must have a *input* as basename. *TEST*
68*8c31bb07SMasatake YAMATO	part should explain the test case well.
69*8c31bb07SMasatake YAMATO
70*8c31bb07SMasatake YAMATO*Units/TEST/input[-_][0-9].\** *Units/TEST/input[-_][0-9][-_]\*.\** **optional**
71*8c31bb07SMasatake YAMATO
72*8c31bb07SMasatake YAMATO	Optional input file names. They are put next to *input.\** in
73*8c31bb07SMasatake YAMATO	testing command line.
74*8c31bb07SMasatake YAMATO
75*8c31bb07SMasatake YAMATO*Units/TEST/expected.tags* **optional**
76*8c31bb07SMasatake YAMATO
77*8c31bb07SMasatake YAMATO	Expected output file must have a name *expected.tags*. It
78*8c31bb07SMasatake YAMATO	should be the same directory of the input file.
79*8c31bb07SMasatake YAMATO
80*8c31bb07SMasatake YAMATO	If this file is not given, the exit status of ctags process
81*8c31bb07SMasatake YAMATO	is just checked; the output is ignored.
82*8c31bb07SMasatake YAMATO
83*8c31bb07SMasatake YAMATO	If you want to test etags output (specified with ``-e`` ),
84*8c31bb07SMasatake YAMATO	Use **.tags-e** as suffix instead of **.tags**.
85*8c31bb07SMasatake YAMATO	In such a case you don't have to write ``-e`` to ``args.ctags``.
86*8c31bb07SMasatake YAMATO	The test facility sets ``-e`` automatically.
87*8c31bb07SMasatake YAMATO
88*8c31bb07SMasatake YAMATO	If you want to test cross reference output (specified with ``-x`` ),
89*8c31bb07SMasatake YAMATO	Use **.tags-x** as suffix instead of **.tags**.
90*8c31bb07SMasatake YAMATO	In such a case you don't have to write ``-x`` to ``args.ctags``.
91*8c31bb07SMasatake YAMATO	The test facility sets ``-x`` automatically.
92*8c31bb07SMasatake YAMATO
93*8c31bb07SMasatake YAMATO	If you want to test json output (specified with ``--output-format=json`` ),
94*8c31bb07SMasatake YAMATO	Use **.tags-json** as suffix instead of **.tags**.
95*8c31bb07SMasatake YAMATO	In such a case you don't have to write ``--output-format=json`` to ``args.ctags``,
96*8c31bb07SMasatake YAMATO	and add ``json`` to ``features`` as described below.
97*8c31bb07SMasatake YAMATO	The test facility sets the option and the feature automatically.
98*8c31bb07SMasatake YAMATO
99*8c31bb07SMasatake YAMATO*Units/TEST/args.ctags* **optional**
100*8c31bb07SMasatake YAMATO
101*8c31bb07SMasatake YAMATO	``-o -`` is used as default optional argument when running a
102*8c31bb07SMasatake YAMATO	unit test ctags. If you want to add more options, enumerate
103*8c31bb07SMasatake YAMATO	options in **args.ctags** file.
104*8c31bb07SMasatake YAMATO
105*8c31bb07SMasatake YAMATO	Remember you have to put one option in one line; don't
106*8c31bb07SMasatake YAMATO	put multiple options to one line. Multiple options in
107*8c31bb07SMasatake YAMATO	one line doesn't work.
108*8c31bb07SMasatake YAMATO
109*8c31bb07SMasatake YAMATO*Units/TEST/filter* **optional**
110*8c31bb07SMasatake YAMATO
111*8c31bb07SMasatake YAMATO	You can rearrange the output of ctags with this command
112*8c31bb07SMasatake YAMATO	before comparing with *executed.tags*.
113*8c31bb07SMasatake YAMATO	This command is invoked with no argument. The output
114*8c31bb07SMasatake YAMATO	ctags is given via stdin. Rearrange data should be
115*8c31bb07SMasatake YAMATO	written to stdout.
116*8c31bb07SMasatake YAMATO
117*8c31bb07SMasatake YAMATO*Units/TEST/features* **optional**
118*8c31bb07SMasatake YAMATO
119*8c31bb07SMasatake YAMATO	If a unit test case requires special features of ctags,
120*8c31bb07SMasatake YAMATO	enumerate them in this file line by line. If a target ctags
121*8c31bb07SMasatake YAMATO	doesn't have one of the features, the test is skipped.
122*8c31bb07SMasatake YAMATO
123*8c31bb07SMasatake YAMATO	If a file line is started with ``!``, the effect is inverted;
124*8c31bb07SMasatake YAMATO	if a target ctags has the feature specified with ``!``, the
125*8c31bb07SMasatake YAMATO	test is skipped.
126*8c31bb07SMasatake YAMATO
127*8c31bb07SMasatake YAMATO	All features built-in can be listed with passing
128*8c31bb07SMasatake YAMATO	``--list-features`` to ctags.
129*8c31bb07SMasatake YAMATO
130*8c31bb07SMasatake YAMATO*Units/TEST/languages* **optional**
131*8c31bb07SMasatake YAMATO
132*8c31bb07SMasatake YAMATO	If a unit test case requires that language parsers are enabled/available,
133*8c31bb07SMasatake YAMATO	enumerate them in this file line by line. If one of them is
134*8c31bb07SMasatake YAMATO	disabled/unavailable, the test is skipped.
135*8c31bb07SMasatake YAMATO
136*8c31bb07SMasatake YAMATO	language parsers enabled/available can be checked with passing
137*8c31bb07SMasatake YAMATO	``--list-languages`` to ctags.
138*8c31bb07SMasatake YAMATO
139*8c31bb07SMasatake YAMATONote for importing a test case from Test directory
140*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
141*8c31bb07SMasatake YAMATO
142*8c31bb07SMasatake YAMATOI think all test cases under Test directory should be converted to
143*8c31bb07SMasatake YAMATOUnits.
144*8c31bb07SMasatake YAMATO
145*8c31bb07SMasatake YAMATOIf you convert use following TEST name convention.
146*8c31bb07SMasatake YAMATO
147*8c31bb07SMasatake YAMATO* use *.t* instead of *.d* as suffix for the name
148*8c31bb07SMasatake YAMATO
149*8c31bb07SMasatake YAMATOHere is an example::
150*8c31bb07SMasatake YAMATO
151*8c31bb07SMasatake YAMATO	Test/simple.sh
152*8c31bb07SMasatake YAMATO
153*8c31bb07SMasatake YAMATOThis should be::
154*8c31bb07SMasatake YAMATO
155*8c31bb07SMasatake YAMATO	Units/simple.sh.t
156*8c31bb07SMasatake YAMATO
157*8c31bb07SMasatake YAMATOWith this name convention we can track which test case is converted or
158*8c31bb07SMasatake YAMATOnot.
159*8c31bb07SMasatake YAMATO
160*8c31bb07SMasatake YAMATOExample of files
161*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
162*8c31bb07SMasatake YAMATO
163*8c31bb07SMasatake YAMATOSee `Units/parser-c.r/c-sample.d
164*8c31bb07SMasatake YAMATO<https://github.com/universal-ctags/ctags/tree/master/Units/parser-c.r/c-sample.d>`_.
165*8c31bb07SMasatake YAMATO
166*8c31bb07SMasatake YAMATOHow to run unit tests
167*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
168*8c31bb07SMasatake YAMATO
169*8c31bb07SMasatake YAMATO*test* make target::
170*8c31bb07SMasatake YAMATO
171*8c31bb07SMasatake YAMATO	 $ make units
172*8c31bb07SMasatake YAMATO
173*8c31bb07SMasatake YAMATOThe result of unit tests is reported by lines. You can specify
174*8c31bb07SMasatake YAMATOtest cases with ``UNITS=``.
175*8c31bb07SMasatake YAMATO
176*8c31bb07SMasatake YAMATOAn example to run *vim-command.d* only::
177*8c31bb07SMasatake YAMATO
178*8c31bb07SMasatake YAMATO	$ make units UNITS=vim-command
179*8c31bb07SMasatake YAMATO
180*8c31bb07SMasatake YAMATOAnother example to run *vim-command.d* and *parser-python.r/bug1856363.py.d*::
181*8c31bb07SMasatake YAMATO
182*8c31bb07SMasatake YAMATO	$ make units UNITS=vim-command,bug1856363.py
183*8c31bb07SMasatake YAMATO
184*8c31bb07SMasatake YAMATODuring testing *OUTPUT.tmp*, *EXPECTED.tmp* and *DIFF.tmp* files are
185*8c31bb07SMasatake YAMATOgenerated for each test case directory. These are removed when the
186*8c31bb07SMasatake YAMATOunit test is **passed**.  If the result is **FAILED**, it is kept for
187*8c31bb07SMasatake YAMATOdebugging. Following command line can clean up these generated files
188*8c31bb07SMasatake YAMATOat once::
189*8c31bb07SMasatake YAMATO
190*8c31bb07SMasatake YAMATO	$ make clean-units
191*8c31bb07SMasatake YAMATO
192*8c31bb07SMasatake YAMATOOther than **FAILED** and **passed** two types of result are
193*8c31bb07SMasatake YAMATOdefined.
194*8c31bb07SMasatake YAMATO
195*8c31bb07SMasatake YAMATO
196*8c31bb07SMasatake YAMATO**skipped**
197*8c31bb07SMasatake YAMATO
198*8c31bb07SMasatake YAMATO	means running the test case is skipped in some reason.
199*8c31bb07SMasatake YAMATO
200*8c31bb07SMasatake YAMATO**failed (KNOWN bug)**
201*8c31bb07SMasatake YAMATO
202*8c31bb07SMasatake YAMATO	means the result was failed but the failure is expected.
203*8c31bb07SMasatake YAMATO	See ":ref:`gathering_test`".
204*8c31bb07SMasatake YAMATO
205*8c31bb07SMasatake YAMATOExample of running
206*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
207*8c31bb07SMasatake YAMATO::
208*8c31bb07SMasatake YAMATO
209*8c31bb07SMasatake YAMATO	$ make units
210*8c31bb07SMasatake YAMATO	Category: ROOT
211*8c31bb07SMasatake YAMATO	-------------------------------------------------------------------------
212*8c31bb07SMasatake YAMATO	Testing 1795612.js as JavaScript                            passed
213*8c31bb07SMasatake YAMATO	Testing 1850914.js as JavaScript                            passed
214*8c31bb07SMasatake YAMATO	Testing 1878155.js as JavaScript                            passed
215*8c31bb07SMasatake YAMATO	Testing 1880687.js as JavaScript                            passed
216*8c31bb07SMasatake YAMATO	Testing 2023624.js as JavaScript                            passed
217*8c31bb07SMasatake YAMATO	Testing 3184782.sql as SQL                                  passed
218*8c31bb07SMasatake YAMATO	...
219*8c31bb07SMasatake YAMATO
220*8c31bb07SMasatake YAMATORunning unit tests for specific languages
221*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
222*8c31bb07SMasatake YAMATO
223*8c31bb07SMasatake YAMATOYou can run only the tests for specific languages by setting
224*8c31bb07SMasatake YAMATO``LANGUAGES`` to parsers as reported by
225*8c31bb07SMasatake YAMATO``ctags --list-languages``::
226*8c31bb07SMasatake YAMATO
227*8c31bb07SMasatake YAMATO	make units LANGUAGES=PHP,C
228*8c31bb07SMasatake YAMATO
229*8c31bb07SMasatake YAMATOMultiple languages can be selected using a comma separated list.
230*8c31bb07SMasatake YAMATO
231*8c31bb07SMasatake YAMATO.. _gathering_test:
232*8c31bb07SMasatake YAMATO
233*8c31bb07SMasatake YAMATOGathering test cases for known bugs
234*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
235*8c31bb07SMasatake YAMATO
236*8c31bb07SMasatake YAMATOWhen we meet a bug, it is an important development activity to make a small test
237*8c31bb07SMasatake YAMATOcase that triggers the bug.
238*8c31bb07SMasatake YAMATOEven the bug cannot be fixed in soon,
239*8c31bb07SMasatake YAMATOthe test case is an important result of work. Such result should
240*8c31bb07SMasatake YAMATObe merged to the source tree. However, we don't love **FAILED**
241*8c31bb07SMasatake YAMATOmessage, too. What we should do?
242*8c31bb07SMasatake YAMATO
243*8c31bb07SMasatake YAMATOIn such a case, merge as usually but use *.b* as suffix for
244*8c31bb07SMasatake YAMATOthe directory of test case instead of *.d*.
245*8c31bb07SMasatake YAMATO
246*8c31bb07SMasatake YAMATO``parser-autoconf.r/nested-block.ac.b/`` is an example
247*8c31bb07SMasatake YAMATOof ``.b``*`` suffix usage.
248*8c31bb07SMasatake YAMATO
249*8c31bb07SMasatake YAMATOWhen you run test.units target, you will see::
250*8c31bb07SMasatake YAMATO
251*8c31bb07SMasatake YAMATO    Testing c-sample as C                                 passed
252*8c31bb07SMasatake YAMATO    Testing css-singlequote-in-comment as CSS             failed (KNOWN bug)
253*8c31bb07SMasatake YAMATO    Testing ctags-simple as ctags                         passed
254*8c31bb07SMasatake YAMATO
255*8c31bb07SMasatake YAMATOSuffix *.i* is a variant of *.b*. *.i* is for merging/gathering input
256*8c31bb07SMasatake YAMATOwhich lets ctags process enter an infinite loop. Different from *.b*,
257*8c31bb07SMasatake YAMATOtest cases marked as *.i* are never executed. They are just skipped
258*8c31bb07SMasatake YAMATObut reported the skips::
259*8c31bb07SMasatake YAMATO
260*8c31bb07SMasatake YAMATO    Testing ada-ads as Ada                                passed
261*8c31bb07SMasatake YAMATO    Testing ada-function as Ada                           skipped (may cause an infinite loop)
262*8c31bb07SMasatake YAMATO    Testing ada-protected as Ada                          passed
263*8c31bb07SMasatake YAMATO    ...
264*8c31bb07SMasatake YAMATO
265*8c31bb07SMasatake YAMATO    Summary (see CMDLINE.tmp to reproduce without test harness)
266*8c31bb07SMasatake YAMATO    ------------------------------------------------------------
267*8c31bb07SMasatake YAMATO      #passed:                                347
268*8c31bb07SMasatake YAMATO      #FIXED:                                 0
269*8c31bb07SMasatake YAMATO      #FAILED (unexpected-exit-status):       0
270*8c31bb07SMasatake YAMATO      #FAILED (unexpected-output):            0
271*8c31bb07SMasatake YAMATO      #skipped (features):                    0
272*8c31bb07SMasatake YAMATO      #skipped (languages):                   0
273*8c31bb07SMasatake YAMATO      #skipped (infinite-loop):               1
274*8c31bb07SMasatake YAMATO        ada-protected
275*8c31bb07SMasatake YAMATO      ...
276*8c31bb07SMasatake YAMATO
277*8c31bb07SMasatake YAMATORunning under valgrind and timeout
278*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
279*8c31bb07SMasatake YAMATOIf ``VG=1`` is given, each test cases are run under valgrind.
280*8c31bb07SMasatake YAMATOIf valgrind detects an error, it is reported as::
281*8c31bb07SMasatake YAMATO
282*8c31bb07SMasatake YAMATO    $ make units VG=1
283*8c31bb07SMasatake YAMATO    Testing css-singlequote-in-comment as CSS             failed (valgrind-error)
284*8c31bb07SMasatake YAMATO    ...
285*8c31bb07SMasatake YAMATO    Summary (see CMDLINE.tmp to reproduce without test harness)
286*8c31bb07SMasatake YAMATO    ------------------------------------------------------------
287*8c31bb07SMasatake YAMATO    ...
288*8c31bb07SMasatake YAMATO    #valgrind-error:                        1
289*8c31bb07SMasatake YAMATO      css-singlequote-in-comment
290*8c31bb07SMasatake YAMATO    ...
291*8c31bb07SMasatake YAMATO
292*8c31bb07SMasatake YAMATOIn this case the report of valgrind is recorded to
293*8c31bb07SMasatake YAMATO``Units/css-singlequote-in-comment/VALGRIND-CSS.tmp``.
294*8c31bb07SMasatake YAMATO
295*8c31bb07SMasatake YAMATONOTE: ``/bin/bash`` is needed to report the result. You can specify a shell
296*8c31bb07SMasatake YAMATOrunning test with SHELL macro like::
297*8c31bb07SMasatake YAMATO
298*8c31bb07SMasatake YAMATO    $ make units VG=1 SHELL=/bin/bash
299*8c31bb07SMasatake YAMATO
300*8c31bb07SMasatake YAMATO
301*8c31bb07SMasatake YAMATOIf ``TIMEOUT=N`` is given, each test cases are run under timeout
302*8c31bb07SMasatake YAMATOcommand. If ctags doesn't stop in ``N`` second, it is stopped
303*8c31bb07SMasatake YAMATOby timeout command and reported as::
304*8c31bb07SMasatake YAMATO
305*8c31bb07SMasatake YAMATO    $ make units TIMEOUT=1
306*8c31bb07SMasatake YAMATO    Testing css-singlequote-in-comment as CSS             failed (TIMED OUT)
307*8c31bb07SMasatake YAMATO    ...
308*8c31bb07SMasatake YAMATO    Summary (see CMDLINE.tmp to reproduce without test harness)
309*8c31bb07SMasatake YAMATO    ------------------------------------------------------------
310*8c31bb07SMasatake YAMATO    ...
311*8c31bb07SMasatake YAMATO    #TIMED-OUT:                             1
312*8c31bb07SMasatake YAMATO      css-singlequote-in-comment
313*8c31bb07SMasatake YAMATO    ...
314*8c31bb07SMasatake YAMATO
315*8c31bb07SMasatake YAMATOIf ``TIMEOUT=N`` is given, *.i* test cases are run. They will be
316*8c31bb07SMasatake YAMATOreported as *TIMED-OUT*.
317*8c31bb07SMasatake YAMATO
318*8c31bb07SMasatake YAMATOCategories
319*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
320*8c31bb07SMasatake YAMATO
321*8c31bb07SMasatake YAMATO.. NOT REVIEWED
322*8c31bb07SMasatake YAMATO
323*8c31bb07SMasatake YAMATOWith *.r* suffix, you can put test cases under a sub directory
324*8c31bb07SMasatake YAMATOof *Units*. ``Units/parser-ada.r`` is an example. If *misc/units*
325*8c31bb07SMasatake YAMATOtest harness, the sub directory is called a category. ``parser-ada.r``
326*8c31bb07SMasatake YAMATOis the name category in the above example.
327*8c31bb07SMasatake YAMATO
328*8c31bb07SMasatake YAMATO*CATEGORIES* macro of make is for running units in specified categories.
329*8c31bb07SMasatake YAMATOFollowing command line is for running units in
330*8c31bb07SMasatake YAMATO``Units/parser-sh.r`` and ``Units/parser-ada.r``::
331*8c31bb07SMasatake YAMATO
332*8c31bb07SMasatake YAMATO  $ make units CATEGORIES='parser-sh,parser-ada'
333*8c31bb07SMasatake YAMATO
334*8c31bb07SMasatake YAMATO
335*8c31bb07SMasatake YAMATOFinding minimal bad input
336*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
337*8c31bb07SMasatake YAMATO
338*8c31bb07SMasatake YAMATOWhen a test case is failed, the input causing ``FAILED`` result is
339*8c31bb07SMasatake YAMATOpassed to *misc/units shrink*.  *misc/units shrink* tries to make the
340*8c31bb07SMasatake YAMATOshortest input which makes ctags exits with non-zero status.  The
341*8c31bb07SMasatake YAMATOresult is reported to ``Units/\*/SHRINK-${language}.tmp``.  Maybe
342*8c31bb07SMasatake YAMATOuseful to debug.
343*8c31bb07SMasatake YAMATO
344*8c31bb07SMasatake YAMATOAcknowledgments
345*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
346*8c31bb07SMasatake YAMATO
347*8c31bb07SMasatake YAMATOThe file name rule is suggested by Maxime Coste <frrrwww@gmail.com>.
348*8c31bb07SMasatake YAMATO
349*8c31bb07SMasatake YAMATOReviewing the result of Units test
350*8c31bb07SMasatake YAMATO------------------------------------------------------------
351*8c31bb07SMasatake YAMATO
352*8c31bb07SMasatake YAMATOTry misc/review.
353*8c31bb07SMasatake YAMATO
354*8c31bb07SMasatake YAMATO.. code-block:: console
355*8c31bb07SMasatake YAMATO
356*8c31bb07SMasatake YAMATO    $ misc/review --help
357*8c31bb07SMasatake YAMATO    Usage:
358*8c31bb07SMasatake YAMATO            misc/review          help|--help|-h                 show this message
359*8c31bb07SMasatake YAMATO            misc/review          [list] [-b]                    list failed Units and Tmain
360*8c31bb07SMasatake YAMATO                                 -b                             list .b (known bug) marked cases
361*8c31bb07SMasatake YAMATO            misc/review          inspect [-b]                   inspect difference interactively
362*8c31bb07SMasatake YAMATO                                 -b                             inspect .b (known bug) marked cases
363*8c31bb07SMasatake YAMATO    $
364*8c31bb07SMasatake YAMATO
365*8c31bb07SMasatake YAMATOSemi-fuzz(*Fuzz*) testing
366*8c31bb07SMasatake YAMATO---------------------------------------------------------------------
367*8c31bb07SMasatake YAMATO
368*8c31bb07SMasatake YAMATOUnexpected input can lead ctags to enter an infinite loop. The fuzz
369*8c31bb07SMasatake YAMATOtarget tries to identify these conditions by passing
370*8c31bb07SMasatake YAMATOsemi-random (semi-broken) input to ctags.
371*8c31bb07SMasatake YAMATO
372*8c31bb07SMasatake YAMATO::
373*8c31bb07SMasatake YAMATO
374*8c31bb07SMasatake YAMATO	$ make fuzz LANGUAGES=LANG1[,LANG2,...]
375*8c31bb07SMasatake YAMATO
376*8c31bb07SMasatake YAMATOWith this command line, ctags is run for random variations of all test
377*8c31bb07SMasatake YAMATOinputs under *Units/\*/input.\** of languages defined by ``LANGUAGES``
378*8c31bb07SMasatake YAMATOmacro variable. In this target, the output of ctags is ignored and
379*8c31bb07SMasatake YAMATOonly the exit status is analyzed. The ctags binary is also run under
380*8c31bb07SMasatake YAMATOtimeout command, such that if an infinite loop is found it will exit
381*8c31bb07SMasatake YAMATOwith a non-zero status. The timeout will be reported as following::
382*8c31bb07SMasatake YAMATO
383*8c31bb07SMasatake YAMATO	[timeout C]                Units/test.vhd.t/input.vhd
384*8c31bb07SMasatake YAMATO
385*8c31bb07SMasatake YAMATOThis means that if C parser doesn't stop within N seconds when
386*8c31bb07SMasatake YAMATO*Units/test.vhd.t/input.vhd* is given as an input, timeout will
387*8c31bb07SMasatake YAMATOinterrupt ctags. The default duration can be changed using
388*8c31bb07SMasatake YAMATO``TIMEOUT=N`` argument in *make* command. If there is no timeout but
389*8c31bb07SMasatake YAMATOthe exit status is non-zero, the target reports it as following::
390*8c31bb07SMasatake YAMATO
391*8c31bb07SMasatake YAMATO	[unexpected-status(N) C]                Units/test.vhd.t/input.vhd
392*8c31bb07SMasatake YAMATO
393*8c31bb07SMasatake YAMATOThe list of parsers which can be used as a value for ``LANGUAGES`` can
394*8c31bb07SMasatake YAMATObe obtained with following command line
395*8c31bb07SMasatake YAMATO
396*8c31bb07SMasatake YAMATO::
397*8c31bb07SMasatake YAMATO
398*8c31bb07SMasatake YAMATO	$ ctags --list-languages
399*8c31bb07SMasatake YAMATO
400*8c31bb07SMasatake YAMATOBesides ``LANGUAGES`` and ``TIMEOUT``, fuzz target also takes the
401*8c31bb07SMasatake YAMATOfollowing parameters:
402*8c31bb07SMasatake YAMATO
403*8c31bb07SMasatake YAMATO	``VG=1``
404*8c31bb07SMasatake YAMATO
405*8c31bb07SMasatake YAMATO		Run ctags under valgrind. If valgrind finds a memory
406*8c31bb07SMasatake YAMATO		error it is reported as::
407*8c31bb07SMasatake YAMATO
408*8c31bb07SMasatake YAMATO			[valgrind-error Verilog]                Units/array_spec.f90.t/input.f90
409*8c31bb07SMasatake YAMATO
410*8c31bb07SMasatake YAMATO		The valgrind report is recorded at
411*8c31bb07SMasatake YAMATO		``Units/\*/VALGRIND-${language}.tmp``.
412*8c31bb07SMasatake YAMATO
413*8c31bb07SMasatake YAMATOAs the same as units target, this semi-fuzz test target also calls
414*8c31bb07SMasatake YAMATO*misc/units shrink* when a test case is failed. See "*Units* test facility"
415*8c31bb07SMasatake YAMATOabout the shrunk result.
416*8c31bb07SMasatake YAMATO
417*8c31bb07SMasatake YAMATO*Noise* testing
418*8c31bb07SMasatake YAMATO---------------------------------------------------------------------
419*8c31bb07SMasatake YAMATO
420*8c31bb07SMasatake YAMATOAfter enjoying developing Semi-fuzz testing, I'm looking for a more unfair
421*8c31bb07SMasatake YAMATOapproach. Run
422*8c31bb07SMasatake YAMATO
423*8c31bb07SMasatake YAMATO::
424*8c31bb07SMasatake YAMATO
425*8c31bb07SMasatake YAMATO	$ make noise LANGUAGES=LANG1[,LANG2,...]
426*8c31bb07SMasatake YAMATO
427*8c31bb07SMasatake YAMATOThe noise target generates test cases by inserting or deleting one
428*8c31bb07SMasatake YAMATOcharacter to the test cases of *Units*.
429*8c31bb07SMasatake YAMATO
430*8c31bb07SMasatake YAMATOIt takes a long time, even without ``VG=1``, so this cannot be run
431*8c31bb07SMasatake YAMATOunder Travis CI. However, it is a good idea to run it locally.
432*8c31bb07SMasatake YAMATO
433*8c31bb07SMasatake YAMATO*Chop* and *slap* testing
434*8c31bb07SMasatake YAMATO---------------------------------------------------------------------
435*8c31bb07SMasatake YAMATO
436*8c31bb07SMasatake YAMATOAfter reviving many bug reports, we recognized some of them spot
437*8c31bb07SMasatake YAMATOunexpected EOF. The chop target was developed based on this recognition.
438*8c31bb07SMasatake YAMATO
439*8c31bb07SMasatake YAMATOThe chop target generates many input files from an existing input file
440*8c31bb07SMasatake YAMATOunder *Units* by truncating the existing input file at variety file
441*8c31bb07SMasatake YAMATOpositions.
442*8c31bb07SMasatake YAMATO
443*8c31bb07SMasatake YAMATO::
444*8c31bb07SMasatake YAMATO
445*8c31bb07SMasatake YAMATO   $ make chop  LANGUAGES=LANG1[,LANG2,...]
446*8c31bb07SMasatake YAMATO
447*8c31bb07SMasatake YAMATOIt takes a long time, especially with ``VG=1``, so this cannot be run
448*8c31bb07SMasatake YAMATOunder Travis CI. However, it is a good idea to run it locally.
449*8c31bb07SMasatake YAMATO
450*8c31bb07SMasatake YAMATOslap target is derived from chop target. While chop target truncates
451*8c31bb07SMasatake YAMATOthe existing input files from tail, the slap target does the same
452*8c31bb07SMasatake YAMATOfrom head.
453*8c31bb07SMasatake YAMATO
454*8c31bb07SMasatake YAMATO..	_input-validation:
455*8c31bb07SMasatake YAMATO
456*8c31bb07SMasatake YAMATOInput validation for *Units*
457*8c31bb07SMasatake YAMATO---------------------------------------------------------------------
458*8c31bb07SMasatake YAMATO
459*8c31bb07SMasatake YAMATOWe have to maintain parsers for languages that we don't know well.  We
460*8c31bb07SMasatake YAMATOdon't have enough time to learn the languages.
461*8c31bb07SMasatake YAMATO
462*8c31bb07SMasatake YAMATO*Units* test cases help us not introduce wrong changes to a parser.
463*8c31bb07SMasatake YAMATO
464*8c31bb07SMasatake YAMATOHowever, there is still an issue; a developer who doesn't know a
465*8c31bb07SMasatake YAMATOtarget language well may write a broken test input file for the
466*8c31bb07SMasatake YAMATOlanguage.  Here comes "Input validation."
467*8c31bb07SMasatake YAMATO
468*8c31bb07SMasatake YAMATOHow to run an example session of input validation
469*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
470*8c31bb07SMasatake YAMATO
471*8c31bb07SMasatake YAMATOYou can validate the test input files of *Units* with *validate-input*
472*8c31bb07SMasatake YAMATOmake target if a validator or a language is defined.
473*8c31bb07SMasatake YAMATO
474*8c31bb07SMasatake YAMATOHere is an example validating an input file for JSON.
475*8c31bb07SMasatake YAMATO
476*8c31bb07SMasatake YAMATO.. code-block:: console
477*8c31bb07SMasatake YAMATO
478*8c31bb07SMasatake YAMATO  $ make validate-input VALIDATORS=jq
479*8c31bb07SMasatake YAMATO  ...
480*8c31bb07SMasatake YAMATO  Category: ROOT
481*8c31bb07SMasatake YAMATO  ------------------------------------------------------------
482*8c31bb07SMasatake YAMATO  simple-json.d/input.json with jq                                 valid
483*8c31bb07SMasatake YAMATO
484*8c31bb07SMasatake YAMATO  Summary
485*8c31bb07SMasatake YAMATO  ------------------------------------------------------------
486*8c31bb07SMasatake YAMATO    #valid:                                 1
487*8c31bb07SMasatake YAMATO    #invalid:                               0
488*8c31bb07SMasatake YAMATO    #skipped (known invalidation)           0
489*8c31bb07SMasatake YAMATO    #skipped (validator unavailable)        0
490*8c31bb07SMasatake YAMATO
491*8c31bb07SMasatake YAMATO
492*8c31bb07SMasatake YAMATOThis example shows validating *simple-json.d/input.json* as an input
493*8c31bb07SMasatake YAMATOfile with *jq* validator. With VALIDATORS variable passed via
494*8c31bb07SMasatake YAMATOcommand-line, you can specify validators to run. Multiple validators
495*8c31bb07SMasatake YAMATOcan be specified using a comma-separated list.  If you don't give
496*8c31bb07SMasatake YAMATOVALIDATORS, the make target tries to use all available validators.
497*8c31bb07SMasatake YAMATO
498*8c31bb07SMasatake YAMATOThe meanings of "valid" and "invalid" in "Summary" are apparent.  In
499*8c31bb07SMasatake YAMATOtwo cases, the target skips validating input files:
500*8c31bb07SMasatake YAMATO
501*8c31bb07SMasatake YAMATO#skipped (known invalidation)
502*8c31bb07SMasatake YAMATO
503*8c31bb07SMasatake YAMATO    A test case specifies KNOWN-INVALIDATION in its *validator* file.
504*8c31bb07SMasatake YAMATO
505*8c31bb07SMasatake YAMATO#skipped (validator unavailable)
506*8c31bb07SMasatake YAMATO
507*8c31bb07SMasatake YAMATO    A command for a validator is not available.
508*8c31bb07SMasatake YAMATO
509*8c31bb07SMasatake YAMATO*validator* file
510*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
511*8c31bb07SMasatake YAMATO
512*8c31bb07SMasatake YAMATO*validator* file in a *Units* test directory specifies which
513*8c31bb07SMasatake YAMATOvalidator the make target should use.
514*8c31bb07SMasatake YAMATO
515*8c31bb07SMasatake YAMATO.. code-block:: console
516*8c31bb07SMasatake YAMATO
517*8c31bb07SMasatake YAMATO  $ cat Units/simple-json.d/validator
518*8c31bb07SMasatake YAMATO  jq
519*8c31bb07SMasatake YAMATO
520*8c31bb07SMasatake YAMATOIf you put *validator* file to a category directory (a directory
521*8c31bb07SMasatake YAMATOhaving *.r* suffix), the make target uses the validator specified in
522*8c31bb07SMasatake YAMATOthe file as default.  The default validator can be overridden with a
523*8c31bb07SMasatake YAMATO*validator* file in a subdirectory.
524*8c31bb07SMasatake YAMATO
525*8c31bb07SMasatake YAMATO.. code-block:: console
526*8c31bb07SMasatake YAMATO
527*8c31bb07SMasatake YAMATO  $ cat Units/parser-puppetManifest.r/validator
528*8c31bb07SMasatake YAMATO  puppet
529*8c31bb07SMasatake YAMATO  # cat Units/parser-puppetManifest.r/puppet-append.d/validator
530*8c31bb07SMasatake YAMATO  KNOWN-INVALIDATION
531*8c31bb07SMasatake YAMATO
532*8c31bb07SMasatake YAMATOIn the example, the make target uses *puppet* validator for validating
533*8c31bb07SMasatake YAMATOthe most of all input files under *Units/parser-puppetManifest.r*
534*8c31bb07SMasatake YAMATOdirectory. An exception is an input file under
535*8c31bb07SMasatake YAMATO*Units/parser-puppetManifest.r/puppet-append.d* directory.  The
536*8c31bb07SMasatake YAMATOdirectory has its specific *validator* file.
537*8c31bb07SMasatake YAMATO
538*8c31bb07SMasatake YAMATOIf a *Unit* test case doesn't have *expected.tags* file, the make
539*8c31bb07SMasatake YAMATOtarget doesn't run the validator on the file even if a default
540*8c31bb07SMasatake YAMATOvalidator is given in its category directory.
541*8c31bb07SMasatake YAMATO
542*8c31bb07SMasatake YAMATOIf a *Unit* test case specifies KNOWN-INVALIDATION in its *validator*
543*8c31bb07SMasatake YAMATOfile, the make target just increments "#skipped (known invalidation)"
544*8c31bb07SMasatake YAMATOcounter. The target reports the counter at the end of execution.
545*8c31bb07SMasatake YAMATO
546*8c31bb07SMasatake YAMATOvalidator command
547*8c31bb07SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
548*8c31bb07SMasatake YAMATO
549*8c31bb07SMasatake YAMATOA validator specified in a *validator* file is a command file put
550*8c31bb07SMasatake YAMATOunder *misc/validators* directory.  The command must have "validator-"
551*8c31bb07SMasatake YAMATOas prefix in its file name. For an example,
552*8c31bb07SMasatake YAMATO*misc/validators/validator-jq* is the command for "jq".
553*8c31bb07SMasatake YAMATO
554*8c31bb07SMasatake YAMATOThe command file must be an executable. *validate-input* make target
555*8c31bb07SMasatake YAMATOruns the command in two ways.
556*8c31bb07SMasatake YAMATO
557*8c31bb07SMasatake YAMATO*is_runnable* method
558*8c31bb07SMasatake YAMATO
559*8c31bb07SMasatake YAMATO    Before running the command as a validator, the target runs
560*8c31bb07SMasatake YAMATO    the command with "is_runnable" as the first argument.
561*8c31bb07SMasatake YAMATO    A validator command can let the target know whether the
562*8c31bb07SMasatake YAMATO    validator command is runnable or not with exit status.
563*8c31bb07SMasatake YAMATO    0 means ready to run. Non-zero means not ready to run.
564*8c31bb07SMasatake YAMATO
565*8c31bb07SMasatake YAMATO    The make target never runs the validator command for
566*8c31bb07SMasatake YAMATO    validation purpose if the exit status is non-zero.
567*8c31bb07SMasatake YAMATO
568*8c31bb07SMasatake YAMATO    For an example, *misc/validators/validator-jq* command uses *jq*
569*8c31bb07SMasatake YAMATO    command as its backend. If *jq* command is not available on a
570*8c31bb07SMasatake YAMATO    system, *validator-jq* can do nothing.  If such case,
571*8c31bb07SMasatake YAMATO    *is_runnable* method of *validator-jq* command should exit with
572*8c31bb07SMasatake YAMATO    non-zero value.
573*8c31bb07SMasatake YAMATO
574*8c31bb07SMasatake YAMATO*validate* method
575*8c31bb07SMasatake YAMATO
576*8c31bb07SMasatake YAMATO    The make target runs the command with "validate* and an input
577*8c31bb07SMasatake YAMATO    file name for validating the input file.  The command exits
578*8c31bb07SMasatake YAMATO    non-zero if the input file contains invalid syntax. This method
579*8c31bb07SMasatake YAMATO    will never run if *is_runnable* method of the command exits with
580*8c31bb07SMasatake YAMATO    non-zero.
581*8c31bb07SMasatake YAMATO
582*8c31bb07SMasatake YAMATO
583*8c31bb07SMasatake YAMATO..	_man_test:
584*8c31bb07SMasatake YAMATO
585*8c31bb07SMasatake YAMATOTesting examples in language specific man pages
586*8c31bb07SMasatake YAMATO---------------------------------------------------------------------
587*8c31bb07SMasatake YAMATO
588*8c31bb07SMasatake YAMATO:Maintainer: Masatake YAMATO <yamato@redhat.com>
589*8c31bb07SMasatake YAMATO
590*8c31bb07SMasatake YAMATO----
591*8c31bb07SMasatake YAMATO
592*8c31bb07SMasatake YAMATO`man-test` is a target for testing the examples in the language
593*8c31bb07SMasatake YAMATOspecific man pages (``man/ctags-lang-<LANG>.7.rst.in``). The command
594*8c31bb07SMasatake YAMATOline for running the target is:
595*8c31bb07SMasatake YAMATO
596*8c31bb07SMasatake YAMATO.. code-block:: console
597*8c31bb07SMasatake YAMATO
598*8c31bb07SMasatake YAMATO   $ make man-test
599*8c31bb07SMasatake YAMATO
600*8c31bb07SMasatake YAMATOAn example for testing must have following form:
601*8c31bb07SMasatake YAMATO
602*8c31bb07SMasatake YAMATO.. code-block:: ReStructuredText
603*8c31bb07SMasatake YAMATO
604*8c31bb07SMasatake YAMATO  "input.<EXT>"
605*8c31bb07SMasatake YAMATO
606*8c31bb07SMasatake YAMATO  .. code-block:: <LANG>
607*8c31bb07SMasatake YAMATO
608*8c31bb07SMasatake YAMATO    <INPUT LINES>
609*8c31bb07SMasatake YAMATO
610*8c31bb07SMasatake YAMATO  "output.tags"
611*8c31bb07SMasatake YAMATO  with "<OPTIONS FOR CTAGS>"
612*8c31bb07SMasatake YAMATO
613*8c31bb07SMasatake YAMATO  .. code-block:: tags
614*8c31bb07SMasatake YAMATO
615*8c31bb07SMasatake YAMATO    <TAGS OUTPUT LINES>
616*8c31bb07SMasatake YAMATO
617*8c31bb07SMasatake YAMATO
618*8c31bb07SMasatake YAMATOThe man-test target recognizes the form and does the same as
619*8c31bb07SMasatake YAMATOthe following shell code for each example in the man page:
620*8c31bb07SMasatake YAMATO
621*8c31bb07SMasatake YAMATO.. code-block:: console
622*8c31bb07SMasatake YAMATO
623*8c31bb07SMasatake YAMATO  $ echo <INPUT LINES> > input.<EXT>
624*8c31bb07SMasatake YAMATO  $ echo <TAGS OUTPUT LINES> > output.tags
625*8c31bb07SMasatake YAMATO  $ ctags <OPTIONS FOR CTAGS> > actual.tags
626*8c31bb07SMasatake YAMATO  $ diff output.tags actual.tags
627*8c31bb07SMasatake YAMATO
628*8c31bb07SMasatake YAMATOA backslash character at the end of ``<INPUT LINES>`` or
629*8c31bb07SMasatake YAMATO``<TAGS OUTPUT LINES>`` represents the continuation of lines;
630*8c31bb07SMasatake YAMATOa subsequent newline is ignored.
631*8c31bb07SMasatake YAMATO
632*8c31bb07SMasatake YAMATO.. code-block:: ReStructuredText
633*8c31bb07SMasatake YAMATO
634*8c31bb07SMasatake YAMATO    .. code-block:: tags
635*8c31bb07SMasatake YAMATO
636*8c31bb07SMasatake YAMATO       very long\
637*8c31bb07SMasatake YAMATO            line
638*8c31bb07SMasatake YAMATO
639*8c31bb07SMasatake YAMATOis read as:
640*8c31bb07SMasatake YAMATO
641*8c31bb07SMasatake YAMATO.. code-block:: ReStructuredText
642*8c31bb07SMasatake YAMATO
643*8c31bb07SMasatake YAMATO    .. code-block:: tags
644*8c31bb07SMasatake YAMATO
645*8c31bb07SMasatake YAMATO       very long     line
646*8c31bb07SMasatake YAMATO
647*8c31bb07SMasatake YAMATOHere is an example of a test case taken from
648*8c31bb07SMasatake YAMATO``ctags-lang-python.7.rst.in``:
649*8c31bb07SMasatake YAMATO
650*8c31bb07SMasatake YAMATO.. code-block:: ReStructuredText
651*8c31bb07SMasatake YAMATO
652*8c31bb07SMasatake YAMATO	"input.py"
653*8c31bb07SMasatake YAMATO
654*8c31bb07SMasatake YAMATO	.. code-block:: Python
655*8c31bb07SMasatake YAMATO
656*8c31bb07SMasatake YAMATO	   import X0
657*8c31bb07SMasatake YAMATO
658*8c31bb07SMasatake YAMATO	"output.tags"
659*8c31bb07SMasatake YAMATO	with "--options=NONE -o - --extras=+r --fields=+rzK input.py"
660*8c31bb07SMasatake YAMATO
661*8c31bb07SMasatake YAMATO	.. code-block:: tags
662*8c31bb07SMasatake YAMATO
663*8c31bb07SMasatake YAMATO		X0	input.py	/^import X0$/;"	kind:module	roles:imported
664*8c31bb07SMasatake YAMATO
665*8c31bb07SMasatake YAMATO``make man-test`` returns 0 if the all test cases in the all language
666*8c31bb07SMasatake YAMATOspecific man pages are passed.
667*8c31bb07SMasatake YAMATO
668*8c31bb07SMasatake YAMATOHere is an example output of the man-test target.
669*8c31bb07SMasatake YAMATO
670*8c31bb07SMasatake YAMATO.. code-block:: console
671*8c31bb07SMasatake YAMATO
672*8c31bb07SMasatake YAMATO	$ make man-test
673*8c31bb07SMasatake YAMATO	  RUN      man-test
674*8c31bb07SMasatake YAMATO	# Run test cases in ./man/ctags-lang-julia.7.rst.in
675*8c31bb07SMasatake YAMATO	```
676*8c31bb07SMasatake YAMATO	./man/ctags-lang-julia.7.rst.in[0]:75...passed
677*8c31bb07SMasatake YAMATO	./man/ctags-lang-julia.7.rst.in[1]:93...passed
678*8c31bb07SMasatake YAMATO	```
679*8c31bb07SMasatake YAMATO	# Run test cases in ./man/ctags-lang-python.7.rst.in
680*8c31bb07SMasatake YAMATO	```
681*8c31bb07SMasatake YAMATO	./man/ctags-lang-python.7.rst.in[0]:116...passed
682*8c31bb07SMasatake YAMATO	./man/ctags-lang-python.7.rst.in[1]:133...passed
683*8c31bb07SMasatake YAMATO	./man/ctags-lang-python.7.rst.in[2]:154...passed
684*8c31bb07SMasatake YAMATO	./man/ctags-lang-python.7.rst.in[3]:170...passed
685*8c31bb07SMasatake YAMATO	./man/ctags-lang-python.7.rst.in[4]:187...passed
686*8c31bb07SMasatake YAMATO	./man/ctags-lang-python.7.rst.in[5]:230...passed
687*8c31bb07SMasatake YAMATO	```
688*8c31bb07SMasatake YAMATO	# Run test cases in ./man/ctags-lang-verilog.7.rst.in
689*8c31bb07SMasatake YAMATO	```
690*8c31bb07SMasatake YAMATO	./man/ctags-lang-verilog.7.rst.in[0]:51...passed
691*8c31bb07SMasatake YAMATO	```
692*8c31bb07SMasatake YAMATO	OK
693*8c31bb07SMasatake YAMATO
694*8c31bb07SMasatake YAMATONOTE: keep examples in the man pages simple. If you want to test ctags
695*8c31bb07SMasatake YAMATOcomplicated (and or subtle) input, use the units target. The main
696*8c31bb07SMasatake YAMATOpurpose of the examples is for explaining the parser.
697