# This file is part of GNU Rush.
# Copyright (C) 2008-2024 Sergey Poznyakoff
#
# GNU Rush 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, or (at your option)
# any later version.
#
# GNU Rush 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 GNU Rush.  If not, see <http://www.gnu.org/licenses/>.

m4_version_prereq([2.52g])

m4_define([AT_SKIP_TEST],[exit 77])

dnl m4_run_rush([KW], [CMD],[EC],[STDOUT],[STDERR],...)
m4_define([m4_run_rush],[m4_ifval([$2],[dnl
echo "; m4_bpatsubst($2,",\\")"
echo "; m4_bpatsubst($2,",\\")" >&2
m4_ifset([RUSH_ENVIRON],[env RUSH_ENVIRON $RUSHDIR/])rush -C none -D$1 dnl
m4_if([$2],[interactive],[-i],[-c "m4_bpatsubst($2,",\\")"]) test.conf
echo "; $?"
$0([$1],m4_shiftn(5, $@))])])

dnl m4_fmt_out([CMD],[EC],[STDOUT],[STDERR],...)
m4_define([m4_fmt_out],[m4_ifval([$1],[dnl
; $1
$3[]dnl
; $2
$0(m4_shift(m4_shift3($@)))])])

dnl m4_fmt_err([CMD],[EC],[STDOUT],[STDERR],...)
m4_define([m4_fmt_err],[m4_ifval([$1],[dnl
; $1
$4[]dnl
$0(m4_shift(m4_shift3($@)))])])

dnl AT_RUSH_TEST([CONFIG],[KW], [CMD],[EC],[STDOUT],[STDERR])
m4_define([AT_RUSH_TEST],[
myvars
AT_CHECK_UNQUOTED([
cat > test.conf <<EOT
[$1]
EOT
m4_run_rush(m4_shift($@))
],
[0],
[m4_fmt_out(m4_shift2($@))],
[m4_fmt_err(m4_shift2($@))])])
#
AT_INIT

AT_TESTED([rush])

m4_include([lex.at])

AT_BANNER([Base])
m4_include([null.at])
m4_include([qstr.at])
m4_include([setvar.at])
m4_include([unsetvar.at])
m4_include([undef.at])

AT_BANNER([Simple Conditions])
m4_include([argc.at])
m4_include([command.at])
m4_include([matcharg.at])
m4_include([matchprog.at])
m4_include([regexp.at])
m4_include([uid.at])
m4_include([user.at])
m4_include([in.at])
m4_include([gid.at])
m4_include([group.at])
m4_include([fstest.at])

AT_BANNER([Complex Conditions])
m4_include([and.at])
m4_include([or.at])
m4_include([compound.at])

AT_BANNER([Transformations])
m4_include([set.at])
m4_include([delete.at])
m4_include([transform.at])
m4_include([map.at])
m4_include([insert.at])
m4_include([remopt.at])

AT_BANNER([Rule attributes])
m4_include([umask.at])
m4_include([newgrp.at])
m4_include([chdir.at])
m4_include([interactive.at])

AT_BANNER([Environment])
m4_include([clrenv.at])
m4_include([unsetenv.at])
m4_include([keepenv.at])
m4_include([setenv.at])
m4_include([evalenv.at])

AT_BANNER([Features])
m4_include([backref.at])

AT_BANNER([Flow control])
m4_include([fallthrough.at])
m4_include([error.at])

AT_BANNER([Includes])
m4_include([inc00.at])
m4_include([inc01.at])

AT_BANNER([Legacy configuration])

dnl AT_BANNER([Conditionals])
m4_include([legacy/argc.at])
m4_include([legacy/command.at])
m4_include([legacy/match.at])
m4_include([legacy/matchprog.at])
m4_include([legacy/uid.at])
m4_include([legacy/gid.at])

dnl AT_BANNER([Transformations])
m4_include([legacy/set.at])
m4_include([legacy/delete.at])
m4_include([legacy/transform.at])
m4_include([legacy/map.at])

dnl AT_BANNER([Actions])
m4_include([legacy/umask.at])
m4_include([legacy/newgrp.at])
# FIXME: No way to test chroot & limits
m4_include([legacy/chdir.at])
m4_include([legacy/env.at])

dnl AT_BANNER([Features])
m4_include([legacy/interactive.at])
m4_include([legacy/fallthrough.at])
dnl FIXME:
dnl m4_include([legacy/fork.at])
dnl m4_include([legacy/acct.at])
dnl m4_include([legacy/notification.at])
m4_include([legacy/error.at])
m4_include([legacy/backref.at])
m4_include([legacy/setvar.at])
m4_include([legacy/unsetvar.at])
