# This is a -*- sh -*- library.

. ./env

# I would use the builtin !, but that has the wrong semantics
not () {
  set +x
  if "$@" || test $? = "4"; then
    # fail the test if command succeeds or returns 4
    exit 1
  fi
  set -x
}

# trick: OS-detection (if needed)
os_is_windows() {
  echo $OS | grep -i windows
}

abort_windows () {
if os_is_windows; then
  echo This test does not work on Windows
  exit 200
fi
}

if os_is_windows; then
  # some installations of bash on Windows do not include \r by default
  # which breaks a lot of tests
  IFS=$' \t\n\r'
  # this is for the github CI: we need to make sure that our test data (e.g.
  # patch bundles) is not converted to CRLF style by git when we checkout a
  # snapshot of our repo
  git config --global core.autocrlf input
fi

# tests now work on windows with this or with the bash pwd:
# pwd() {
#     runghc "$TESTBIN/hspwd.hs"
# }

which() {
    type -P "$@"
}

# switch locale to one supporting the latin-9 (ISO 8859-15) character set if possible, otherwise skip test

no_latin9_locale_warning () {
    echo "no ISO 8859-15 locale found, skipping test"
    echo "try (eg): sudo locale-gen en_US.ISO-8859-15"
}

switch_to_latin9_locale () {
    if os_is_windows; then
        chcp.com 28605
    else
        if ! which locale ; then
            echo "no locale command, skipping test"
            exit 200
        fi

        # look for a ISO 8859-15 locale. locale -a shows iso885915, on ubuntu at least
        latin9_locale=`locale -a | egrep --text -i iso8859-?15 | head -n 1` || (no_latin9_locale_warning; exit 200)
        test -n "$latin9_locale" || (no_latin9_locale_warning; exit 200)

        echo "Using locale $latin9_locale"
        export LC_ALL=$latin9_locale
        echo "character encoding is now `locale charmap`"
    fi
}

# switch locale to utf8 if supported if there's a locale command, skip test
# otherwise
switch_to_utf8_locale () {
    if os_is_windows; then
        chcp.com 65001
    else
        if ! which locale ; then
            echo "no locale command"
            exit 200 # skip test
        fi

        utf8_locale=`locale -a | grep --text .utf8 | head -n 1` || exit 200
        test -n "$utf8_locale" || exit 200

        echo "Using locale $utf8_locale"
        export LC_ALL=$utf8_locale
        echo "character encoding is now `locale charmap`"
    fi
}

# check that the specified string appears precisely once in the output
grep-once() {
    grep -c "$@" | grep -w 1
}

require_ghc() {
    test $GHC_VERSION -ge $1 || exit 200
}

skip-formats() {
    for f in "$@"; do grep -q $f $HOME/.darcs/defaults && exit 200 || true; done
}

only-format() {
    grep -q $1 $HOME/.darcs/defaults || exit 200
}

unpack_testdata() {
   # Historically we used to have to use 'gunzip -c archive | tar xf -'
   # because the test harness was sometimes run with a tar that didn't support -z.
   # That isn't the case now so we just use -f directly.
   # Note that piping the archive on stdin without a -f flag doesn't work reliably
   # because the default device might not be stdin, e.g. on Windows/msys the default
   # could be a tape device //./tape0, even if that doesn't exist.
   tar -xzf $TESTDATA/$1.tgz
}

# comparing patch bundles requires we filter out some (irrelevant) lines
filter_bundle() {
  cat $1 | grep -v '^Date: ' | grep -v 'patch\(es\)\? for repository '
}
compare_bundles() {
  diff <(filter_bundle $1) <(filter_bundle $2) >&2
}

grep -q darcs-3 .darcs/defaults && format=darcs-3
grep -q darcs-2 .darcs/defaults && format=darcs-2
grep -q darcs-1 .darcs/defaults && format=darcs-1

# To test if darcs works correctly in case hard-linking fails because the
# cache is in a different file system. This assumes that /run/darcs-test is
# writable and on a separate filesystem (e.g. tmpfs).
#
# export XDG_CACHE_HOME=`mktemp -d -p /run/darcs-test`

set -vex -o pipefail
