git/t/chainlint
Eric Sunshine 56066523ed t/chainlint: add more chainlint.pl self-tests
During the development of chainlint.pl, numerous new self-tests were
created to verify correct functioning beyond the checks already
represented by the existing self-tests. The new checks fall into several
categories:

* behavior of the lexical analyzer for complex cases, such as line
  splicing, token pasting, entering and exiting string contexts inside
  and outside of test script bodies; for instance:

    test_expect_success 'title' '
      x=$(echo "something" |
        sed -e '\''s/\\/\\\\/g'\'' -e '\''s/[[/.*^$]/\\&/g'\''
    '

* behavior of the parser for all compound grammatical constructs, such
  as `if...fi`, `case...esac`, `while...done`, `{...}`, etc., and for
  other legal shell grammatical constructs not covered by existing
  chainlint.sed self-tests, as well as complex cases, such as:

    OUT=$( ((large_git 1>&3) | :) 3>&1 ) &&

* detection of problems, such as &&-chain breakage, from top-level to
  any depth since the existing self-tests do not cover any top-level
  context and only cover subshells one level deep due to limitations of
  chainlint.sed

* address blind spots in chainlint.sed (such as not detecting a broken
  &&-chain on a one-line for-loop in a subshell[1]) which chainlint.pl
  correctly detects

* real-world cases which tripped up chainlint.pl during its development

[1]: https://lore.kernel.org/git/dce35a47012fecc6edc11c68e91dbb485c5bc36f.1661663880.git.gitgitgadget@gmail.com/

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-09-01 10:07:41 -07:00
..
arithmetic-expansion.expect
arithmetic-expansion.test
bash-array.expect
bash-array.test
blank-line-before-esac.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
blank-line-before-esac.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
blank-line.expect
blank-line.test
block-comment.expect
block-comment.test
block.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
block.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
broken-chain.expect
broken-chain.test
case-comment.expect
case-comment.test
case.expect
case.test
chain-break-background.expect chainlint.pl: don't require & background command to end with && 2022-09-01 10:07:40 -07:00
chain-break-background.test chainlint.pl: don't require & background command to end with && 2022-09-01 10:07:40 -07:00
chain-break-continue.expect
chain-break-continue.test
chain-break-false.expect chainlint.pl: don't flag broken &&-chain if failure indicated explicitly 2022-09-01 10:07:41 -07:00
chain-break-false.test chainlint.pl: don't flag broken &&-chain if failure indicated explicitly 2022-09-01 10:07:41 -07:00
chain-break-return-exit.expect chainlint.pl: don't flag broken &&-chain if failure indicated explicitly 2022-09-01 10:07:41 -07:00
chain-break-return-exit.test chainlint.pl: don't flag broken &&-chain if failure indicated explicitly 2022-09-01 10:07:41 -07:00
chain-break-status.expect chainlint.pl: don't flag broken &&-chain if $? handled explicitly 2022-09-01 10:07:41 -07:00
chain-break-status.test chainlint.pl: don't flag broken &&-chain if $? handled explicitly 2022-09-01 10:07:41 -07:00
chained-block.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
chained-block.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
chained-subshell.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
chained-subshell.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
close-nested-and-parent-together.expect
close-nested-and-parent-together.test
close-subshell.expect
close-subshell.test
command-substitution-subsubshell.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
command-substitution-subsubshell.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
command-substitution.expect
command-substitution.test
comment.expect
comment.test
complex-if-in-cuddled-loop.expect chainlint.pl: complain about loops lacking explicit failure handling 2022-09-01 10:07:41 -07:00
complex-if-in-cuddled-loop.test
cuddled-if-then-else.expect
cuddled-if-then-else.test
cuddled-loop.expect
cuddled-loop.test
cuddled.expect
cuddled.test
double-here-doc.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
double-here-doc.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
dqstring-line-splice.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
dqstring-line-splice.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
dqstring-no-interpolate.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
dqstring-no-interpolate.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
empty-here-doc.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
empty-here-doc.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
exclamation.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
exclamation.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
exit-loop.expect
exit-loop.test
exit-subshell.expect
exit-subshell.test
for-loop-abbreviated.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
for-loop-abbreviated.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
for-loop.expect chainlint.pl: complain about loops lacking explicit failure handling 2022-09-01 10:07:41 -07:00
for-loop.test
function.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
function.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
here-doc-close-subshell.expect
here-doc-close-subshell.test
here-doc-indent-operator.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
here-doc-indent-operator.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
here-doc-multi-line-command-subst.expect
here-doc-multi-line-command-subst.test
here-doc-multi-line-string.expect
here-doc-multi-line-string.test
here-doc.expect
here-doc.test
if-condition-split.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
if-condition-split.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
if-in-loop.expect chainlint.pl: don't flag broken &&-chain if failure indicated explicitly 2022-09-01 10:07:41 -07:00
if-in-loop.test chainlint.pl: don't flag broken &&-chain if failure indicated explicitly 2022-09-01 10:07:41 -07:00
if-then-else.expect
if-then-else.test
incomplete-line.expect
incomplete-line.test
inline-comment.expect
inline-comment.test
loop-detect-failure.expect chainlint.pl: complain about loops lacking explicit failure handling 2022-09-01 10:07:41 -07:00
loop-detect-failure.test chainlint.pl: complain about loops lacking explicit failure handling 2022-09-01 10:07:41 -07:00
loop-detect-status.expect chainlint.pl: complain about loops lacking explicit failure handling 2022-09-01 10:07:41 -07:00
loop-detect-status.test chainlint.pl: complain about loops lacking explicit failure handling 2022-09-01 10:07:41 -07:00
loop-in-if.expect chainlint.pl: complain about loops lacking explicit failure handling 2022-09-01 10:07:41 -07:00
loop-in-if.test
loop-upstream-pipe.expect chainlint.pl: allow || echo to signal failure upstream of a pipe 2022-09-01 10:07:41 -07:00
loop-upstream-pipe.test chainlint.pl: allow || echo to signal failure upstream of a pipe 2022-09-01 10:07:41 -07:00
multi-line-nested-command-substitution.expect
multi-line-nested-command-substitution.test
multi-line-string.expect
multi-line-string.test
negated-one-liner.expect
negated-one-liner.test
nested-cuddled-subshell.expect
nested-cuddled-subshell.test
nested-here-doc.expect
nested-here-doc.test
nested-loop-detect-failure.expect chainlint.pl: complain about loops lacking explicit failure handling 2022-09-01 10:07:41 -07:00
nested-loop-detect-failure.test chainlint.pl: complain about loops lacking explicit failure handling 2022-09-01 10:07:41 -07:00
nested-subshell-comment.expect
nested-subshell-comment.test
nested-subshell.expect
nested-subshell.test
not-heredoc.expect
not-heredoc.test
one-liner-for-loop.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
one-liner-for-loop.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
one-liner.expect
one-liner.test
p4-filespec.expect
p4-filespec.test
pipe.expect
pipe.test
return-loop.expect
return-loop.test
semicolon.expect chainlint.pl: complain about loops lacking explicit failure handling 2022-09-01 10:07:41 -07:00
semicolon.test
sqstring-in-sqstring.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
sqstring-in-sqstring.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
subshell-here-doc.expect
subshell-here-doc.test
subshell-one-liner.expect
subshell-one-liner.test
t7900-subtree.expect
t7900-subtree.test
token-pasting.expect t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
token-pasting.test t/chainlint: add more chainlint.pl self-tests 2022-09-01 10:07:41 -07:00
while-loop.expect chainlint.pl: complain about loops lacking explicit failure handling 2022-09-01 10:07:41 -07:00
while-loop.test