# file      : tests/test/script/runner/cleanup.test
# copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
# license   : MIT; see accompanying LICENSE file

.include ../common.test

b += --no-column

# Valid cleanups.
#
# @@ TODO: $c <"$* -f a &a" && $b
#
: file-always
:
$c <"$* -f a &a";
$b

: file-maybe
:
$c <"$* &?a";
$b

: file-never
:
$c <"$* &!a";
$b

: file-implicit
:
: Test that a file created out of the script working directory is not
: implicitly registered for cleanup. If it were, the test would fail due to
: 'rm' failure.
:
$c <"touch ../../a";
$b;
rm a

: file-append
:
: Test that file append redirect doesn't not register cleanup. If it did, that
: cleanup would fail as the file would be already deleted by 'rm'.
:
$c <<"EOI";
touch a &!a;
$* -o foo >>>&a;
rm a
EOI
$b

: dir-always
:
$c <"$* -d a &a/";
$b

: dir-maybe
:
$c <"$* &?a/";
$b

: dir-implicit
:
: Test that a directory created out of the script working directory is not
: implicitly registered for cleanup. If it were, the test would fail due to
: 'rm' failure.
:
$c <"mkdir ../../a";
$b;
rm -r a

: wildcard-always
:
$c <"$* -d a/b -f a/b/c &a/***";
$b

: wildcard-maybe
:
$c <"$* &?a/***";
$b

: order
:
: Test that cleanup is performed in registration reversed order.
:
$c <"$* -d a/b &a/ &a/b/";
$b

# Invalid cleanups.
#
: file-not-exists
:
: Test cleanup of non-existing file.
:
$c <"$* &a";
$b 2>>EOE != 0
testscript:1: error: registered for cleanup file test/1/a does not exist
EOE

: file-out-wd
:
: Test explicit cleanup of a file out of the script working directory.
:
$c <"$* &../../a";
$b 2>>EOE != 0
testscript:1: error: file cleanup ../../a is out of working directory test/
EOE

: file-in-wd
:
: Test cleanup explicit registration of a file being outside the scope working
: directory but inside the script working directory.
:
$c <"$* &../a";
$b 2>>EOE != 0
testscript:1: error: registered for cleanup file test/a does not exist
EOE

: not-file
:
: Test cleanup of a directory as a file.
:
$c <"$* -d a &a";
$b 2>- != 0 # @@ REGEX

: dir-not-exists
:
: Test cleanup of non-existing directory.
:
$c <"$* &a/";
$b 2>>EOE != 0
testscript:1: error: registered for cleanup directory test/1/a/ does not exist
EOE

: dir-out-wd
:
: Test cleanup of a directory out of the script working directory.
:
$c <"$* &../../a/";
$b 2>>EOE != 0
testscript:1: error: directory cleanup ../../a/ is out of working directory test/
EOE

: dir-in-wd
:
: Test cleanup explicit registration of a directory being outside the scope
: working directory but inside the script working directory.
:
$c <"$* &../a/";
$b 2>>EOE != 0
testscript:1: error: registered for cleanup directory test/a/ does not exist
EOE

: dir-not-empty
:
: Test cleanup of a non-empty directory.
:
$c <"$* -d a -f a/b &a/";
$b 2>>EOE != 0
testscript:1: error: registered for cleanup directory test/1/a/ is not empty
EOE

: not-dir
:
: Test cleanup of a file as a directory.
:
$c <"$* -f a &a/";
$b 2>- != 0 # @@ REGEX

: wildcard-not-exists
:
: Test cleanup of a wildcard not matching any directory.
:
$c <"$* &a/***";
$b 2>>EOE != 0
testscript:1: error: registered for cleanup wildcard test/1/a/*** doesn't match a directory
EOE

: wildcard-out-wd
:
: Test cleanup of a wildcard out of the script working directory.
:
$c <"$* &../../a/***";
$b 2>>EOE != 0
testscript:1: error: wildcard cleanup ../../a/*** is out of working directory test/
EOE

: wildcard-in-wd
:
: Test cleanup registration of a wildcard matching the directory that being
: outside the scope working directory is inside the script working directory.
:
$c <"$* &../a/***";
$b 2>>EOE != 0
testscript:1: error: registered for cleanup wildcard test/a/*** doesn't match a directory
EOE

: wildcard-not-dir
:
: Test cleanup of a file as a wildcard.
:
$c <"$* -f a &a/***";
$b 2>- != 0 # @@ REGEX

: implicit-overwrite
:
: Test an implicit cleanup being overwritten with the explicit one,
:
$c <"$* -o foo >>>a &!a";
$b 2>>EOE != 0
testscript:1: error: registered for cleanup directory test/1/ is not empty
EOE

: explicit-overwrite
:
: Test an explicit cleanup not being overwritten with the implicit one.
:
$c <<"EOO";
$* &!a;
$* -o foo >>>a
EOO
$b 2>>EOE != 0
testscript:2: error: registered for cleanup directory test/1/ is not empty
EOE