#!/bin/sh
#
# rawhide - find files using pretty C expressions
# https://raf.org/rawhide
# https://github.com/raforg/rawhide
# https://codeberg.org/raforg/rawhide
#
# Copyright (C) 1990 Ken Stauffer, 2022 raf <raf@raf.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <https://www.gnu.org/licenses/>.
#
# 20221011 raf <raf@raf.org>

. tests/.common

label="glob/pcre/sh pattern modifiers"

touch $d/f
mkdir $d/d
ln -s f $d/linkrel
ln -s $d/f $d/linkabs

test_rawhide_post_hook() { test_rh_sort_post_hook; }

test_rawhide "$rh -e '\"*\"'        $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"*\""
test_rawhide "$rh -e '\"*\".path'   $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"*\".path"
test_rawhide "$rh -e '\"*\".link'   $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"*\".link"
test_rawhide "$rh -e '\"$d*\"'      $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"$d*\" (assumes .path)"
test_rawhide "$rh -e '\"$d*\".path' $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"$d*\".path"
test_rawhide "$rh -e '\"$d*\".link' $d" "$d/linkabs\n"                             "" 0 "\"$d*\".link"
test_rawhide "$rh -e '\"f\"'        $d" "$d/f\n"                                   "" 0 "\"f\""
test_rawhide "$rh -e '\"f\".path'   $d" ""                                         "" 0 "\"f\".path"
test_rawhide "$rh -e '\"f\".link'   $d" "$d/linkrel\n"                             "" 0 "\"f\".link"
test_rawhide "$rh -e '\"*f\"'       $d" "$d/f\n"                                   "" 0 "\"*f\""
test_rawhide "$rh -e '\"*f\".path'  $d" "$d/f\n"                                   "" 0 "\"*f\".path"
test_rawhide "$rh -e '\"*f\".link'  $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"*f\".link"
test_rawhide "$rh -e '\"F\"'        $d" ""                                         "" 0 "\"F\""
test_rawhide "$rh -e '\"F\".path'   $d" ""                                         "" 0 "\"F\".path"
test_rawhide "$rh -e '\"F\".link'   $d" ""                                         "" 0 "\"F\".link"
test_rawhide "$rh -e '\"*F\"'       $d" ""                                         "" 0 "\"*F\""
test_rawhide "$rh -e '\"*F\".path'  $d" ""                                         "" 0 "\"*F\".path"
test_rawhide "$rh -e '\"*F\".link'  $d" ""                                         "" 0 "\"*F\".link"

test_rawhide "$rh -e '\"*\".pat'    $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"*\".pat (abbrev)"
test_rawhide "$rh -e '\"*\".pa'     $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"*\".pa (abbrev)"
test_rawhide "$rh -e '\"*\".p'      $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"*\".p (abbrev)"
test_rawhide "$rh -e '\"*\".lin'    $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"*\".lin (abbrev)"
test_rawhide "$rh -e '\"*\".li'     $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"*\".li (abbrev)"
test_rawhide "$rh -e '\"*\".l'      $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"*\".l (abbrev)"

# Test i ipath ilink if available

if $rh -h | grep -q '\.ipath'
then
	test_rawhide "$rh -e '\"*\".i'       $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"*\".i"
	test_rawhide "$rh -e '\"*\".ipath'   $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"*\".ipath"
	test_rawhide "$rh -e '\"*\".ilink'   $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"*\".ilink"
	test_rawhide "$rh -e '\"$d*\".i'     $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"$d*\".i (assumes .ipath)"
	test_rawhide "$rh -e '\"$d*\".ipath' $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"$d*\".ipath"
	test_rawhide "$rh -e '\"$d*\".ilink' $d" "$d/linkabs\n"                             "" 0 "\"$d*\".ilink"
	test_rawhide "$rh -e '\"f\".i'       $d" "$d/f\n"                                   "" 0 "\"f\".i"
	test_rawhide "$rh -e '\"f\".ipath'   $d" ""                                         "" 0 "\"f\".ipath"
	test_rawhide "$rh -e '\"f\".ilink'   $d" "$d/linkrel\n"                             "" 0 "\"f\".ilink"
	test_rawhide "$rh -e '\"*f\".i'      $d" "$d/f\n"                                   "" 0 "\"*f\".i"
	test_rawhide "$rh -e '\"*f\".ipath'  $d" "$d/f\n"                                   "" 0 "\"*f\".ipath"
	test_rawhide "$rh -e '\"*f\".ilink'  $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"*f\".ilink"
	test_rawhide "$rh -e '\"F\".i'       $d" "$d/f\n"                                   "" 0 "\"F\".i"
	test_rawhide "$rh -e '\"F\".ipath'   $d" ""                                         "" 0 "\"F\".ipath"
	test_rawhide "$rh -e '\"F\".ilink'   $d" "$d/linkrel\n"                             "" 0 "\"F\".ilink"
	test_rawhide "$rh -e '\"*F\".i'      $d" "$d/f\n"                                   "" 0 "\"*F\".i"
	test_rawhide "$rh -e '\"*F\".ipath'  $d" "$d/f\n"                                   "" 0 "\"*F\".ipath"
	test_rawhide "$rh -e '\"*F\".ilink'  $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"*F\".ilink"

	test_rawhide "$rh -e '\"*\".ipat'    $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"*\".ipat (abbrev)"
	test_rawhide "$rh -e '\"*\".ipa'     $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"*\".ipa (abbrev)"
	test_rawhide "$rh -e '\"*\".ip'      $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"*\".ip (abbrev)"
	test_rawhide "$rh -e '\"*\".ilin'    $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"*\".ilin (abbrev)"
	test_rawhide "$rh -e '\"*\".ili'     $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"*\".ili (abbrev)"
	test_rawhide "$rh -e '\"*\".il'      $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"*\".il (abbrev)"
fi

# Test re repath relink rei reipath reilink if available

if $rh -h | grep -q '\.repath'
then
	test_rawhide "$rh -e '\"\\w+\".re'         $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"\\w+\".re"
	test_rawhide "$rh -e '\"+\".re'            $d" "" "./rh: invalid regex + at offset 0: quantifier does not follow a repeatable item\n" 1 "\"+\".re with invalid re and error message"

	test_rawhide "$rh -e '\"^.*\$\".re'        $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^.*\$\".re"
	test_rawhide "$rh -e '\"^.*\$\".repath'    $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^.*\$\".repath"
	test_rawhide "$rh -e '\"^.*\$\".relink'    $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"^.*\$\".relink"
	test_rawhide "$rh -e '\"^$d.*$\".re'       $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^$d.*\$\".re (assumes .repath)"
	test_rawhide "$rh -e '\"^$d.*\$\".repath'  $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^$d.*\$\".repath"
	test_rawhide "$rh -e '\"^$d.*\$\".relink'  $d" "$d/linkabs\n"                             "" 0 "\"^$d.*\$\".relink"
	test_rawhide "$rh -e '\"^f\$\".re'         $d" "$d/f\n"                                   "" 0 "\"^f\$\".re"
	test_rawhide "$rh -e '\"^f\$\".repath'     $d" ""                                         "" 0 "\"^f\$\".repath"
	test_rawhide "$rh -e '\"^f\$\".relink'     $d" "$d/linkrel\n"                             "" 0 "\"^f\$\".relink"
	test_rawhide "$rh -e '\"^.*f\$\".re'       $d" "$d/f\n"                                   "" 0 "\"^.*f\$\".re"
	test_rawhide "$rh -e '\"^.*f\$\".repath'   $d" "$d/f\n"                                   "" 0 "\"^.*f\$\".repath"
	test_rawhide "$rh -e '\"^.*f\$\".relink'   $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"^.*f\$\".relink"
	test_rawhide "$rh -e '\"^F\$\".re'         $d" ""                                         "" 0 "\"^F\$\".re"
	test_rawhide "$rh -e '\"^F\$\".repath'     $d" ""                                         "" 0 "\"^F\$\".repath"
	test_rawhide "$rh -e '\"^F\$\".relink'     $d" ""                                         "" 0 "\"^F\$\".relink"
	test_rawhide "$rh -e '\"^.*F\$\".re'       $d" ""                                         "" 0 "\"^.*F\$\".re"
	test_rawhide "$rh -e '\"^.*F\$\".repath'   $d" ""                                         "" 0 "\"^.*F\$\".repath"
	test_rawhide "$rh -e '\"^.*F\$\".relink'   $d" ""                                         "" 0 "\"^.*F\$\".relink"

	test_rawhide "$rh -e '\"^.*\$\".repat'     $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^.*\$\".repat (abbrev)"
	test_rawhide "$rh -e '\"^.*\$\".repa'      $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^.*\$\".repa (abbrev)"
	test_rawhide "$rh -e '\"^.*\$\".rep'       $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^.*\$\".rep (abbrev)"
	test_rawhide "$rh -e '\"^.*\$\".relin'     $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"^.*\$\".relin (abbrev)"
	test_rawhide "$rh -e '\"^.*\$\".reli'      $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"^.*\$\".reli (abbrev)"
	test_rawhide "$rh -e '\"^.*\$\".rel'       $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"^.*\$\".rel (abbrev)"

	test_rawhide "$rh -e '\"^.*\$\".rei'       $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^.*\$\".rei"
	test_rawhide "$rh -e '\"^.*\$\".reipath'   $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^.*\$\".reipath"
	test_rawhide "$rh -e '\"^.*\$\".reilink'   $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"^.*\$\".reilink"
	test_rawhide "$rh -e '\"^$d.*\$\".rei'     $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^$d.*\$\".rei (assumes .reipath)"
	test_rawhide "$rh -e '\"^$d.*\$\".reipath' $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^$d.*\$\".reipath"
	test_rawhide "$rh -e '\"^$d.*\$\".reilink' $d" "$d/linkabs\n"                             "" 0 "\"^$d.*\$\".reilink"
	test_rawhide "$rh -e '\"^f\$\".rei'        $d" "$d/f\n"                                   "" 0 "\"^f\$\".rei"
	test_rawhide "$rh -e '\"^f\$\".reipath'    $d" ""                                         "" 0 "\"^f\$\".reipath"
	test_rawhide "$rh -e '\"^f\$\".reilink'    $d" "$d/linkrel\n"                             "" 0 "\"^f\$\".reilink"
	test_rawhide "$rh -e '\"^.*f\$\".rei'      $d" "$d/f\n"                                   "" 0 "\"^.*f\$\".rei"
	test_rawhide "$rh -e '\"^.*f\$\".reipath'  $d" "$d/f\n"                                   "" 0 "\"^.*f\$\".reipath"
	test_rawhide "$rh -e '\"^.*f\$\".reilink'  $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"^.*f\$\".reilink"
	test_rawhide "$rh -e '\"^F\$\".rei'        $d" "$d/f\n"                                   "" 0 "\"^F\$\".rei"
	test_rawhide "$rh -e '\"^F\$\".reipath'    $d" ""                                         "" 0 "\"^F\$\".reipath"
	test_rawhide "$rh -e '\"^F\$\".reilink'    $d" "$d/linkrel\n"                             "" 0 "\"^F\$\".reilink"
	test_rawhide "$rh -e '\"^.*F\$\".rei'      $d" "$d/f\n"                                   "" 0 "\"^.*F\$\".rei"
	test_rawhide "$rh -e '\"^.*F\$\".reipath'  $d" "$d/f\n"                                   "" 0 "\"^.*F\$\".reipath"
	test_rawhide "$rh -e '\"^.*F\$\".reilink'  $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"^.*F\$\".reilink"

	test_rawhide "$rh -e '\"^.*\$\".reipat'    $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^.*\$\".reipat (abbrev)"
	test_rawhide "$rh -e '\"^.*\$\".reipa'     $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^.*\$\".reipa (abbrev)"
	test_rawhide "$rh -e '\"^.*\$\".reip'      $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 "\"^.*\$\".reip (abbrev)"
	test_rawhide "$rh -e '\"^.*\$\".reilin'    $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"^.*\$\".reilin (abbrev)"
	test_rawhide "$rh -e '\"^.*\$\".reili'     $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"^.*\$\".reili (abbrev)"
	test_rawhide "$rh -e '\"^.*\$\".reil'      $d" "$d/linkabs\n$d/linkrel\n"                 "" 0 "\"^.*\$\".reil (abbrev)"
fi

# Test sh

test_rawhide "$rh -e '\"false\".sh'           $d" ""                                         "" 0 ".sh false"
test_rawhide "$rh -e '\"true\".sh'            $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 ".sh true"
test_rawhide "$rh -e '\"[ str = other ]\".sh' $d" ""                                         "" 0 ".sh [ str = other ]"
test_rawhide "$rh -e '\"[ str = str ]\".sh'   $d" "$d\n$d/d\n$d/f\n$d/linkabs\n$d/linkrel\n" "" 0 ".sh [ str = str ]"
test_rawhide "$rh -e '\"unexpected-executable 2>/dev/null\".sh' $d" "" "" 0 ".sh unexpected executable"

test_rawhide "$rh 'd && \"[ \`$explicit_rh -m1 -M1 -ed -q %S | wc -l\` = 0 ]\".sh' $d" "$d/d\n" "" 0 ".sh directories with no sub-directories"
test_rawhide "$rh 'd && \"[ \`$explicit_rh -m1 -M1     -q %S | wc -l\` = 0 ]\".sh' $d" "$d/d\n" "" 0 ".sh empty directories"

test_rawhide_post_hook() { true; }
test_rawhide "$rh -M0 -e '\"echo \`pwd\` .%s.%S.\".sh' /"         "/ ././.\n/\n"                    "" 0 ".sh in / root directory"
test_rawhide "$rh -M0 -e '\"echo \`pwd\` .%s.%S.\".sh' /etc"      "/ ./etc.etc.\n/etc\n"            "" 0 ".sh in /etc directory (no trailing /)"
test_rawhide "$rh -M0 -e '\"echo \`pwd\` .%s.%S.\".sh' /etc/"     "/ ./etc.etc.\n/etc\n"            "" 0 ".sh in /etc/ directory (with trailing /)"
test_rawhide "$rh -M0 -e '\"echo \`pwd\` .%s.%S.\".sh' /usr/bin"  "/usr ./usr/bin.bin.\n/usr/bin\n" "" 0 ".sh in /usr/bin directory (no trailing /)"
test_rawhide "$rh -M0 -e '\"echo \`pwd\` .%s.%S.\".sh' /usr/bin/" "/usr ./usr/bin.bin.\n/usr/bin\n" "" 0 ".sh in /usr/bin/ directory (with trailing /)"

test_rawhide "$rh -e '\"false\".s'            $d" "" ""                                                                                                                                        0 ".s (abbrev)"
test_rawhide "$rh -e '\"invalid\".r'          $d" "" "./rh: command line: -e '\"invalid\".r': line 1 byte 11: invalid string suffix: .r (expected pattern modifier or reference file field)\n" 1 ".r (invalid abbrev)"

# Test the pcre compiled pattern cache

if $rh -h | grep -q '\.re'
then
	touch $d/abcdefghi $d/1 $d/2 $d/3 $d/4 $d/5 $d/6 $d/7 $d/8 $d/9
	test_rawhide "$rh -e '\"abc\".re'                             $d" "$d/abcdefghi\n" "" 0 "pcre cache 1 pattern"
	test_rawhide "$rh -e '\"abc\".re && \"def\".re'               $d" "$d/abcdefghi\n" "" 0 "pcre cache 2 patterns"
	test_rawhide "$rh -e '\"abc\".re && \"def\".re && \"ghi\".re' $d" "$d/abcdefghi\n" "" 0 "pcre cache 3 patterns"
fi

finish

exit $errors

# vi:set ts=4 sw=4:
