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