#!/bin/sh
# Verify that chmod works correctly with odd option combinations.

if test "$VERBOSE" = yes; then
  set -x
  chmod --version
fi

. $srcdir/../lang-default

pwd=`pwd`
tmp=equals.$$
trap 'status=$?; cd $pwd; rm -rf $tmp && exit $status' 0
trap '(exit $?); exit' 1 2 13 15

framework_failure=0
mkdir $tmp || framework_failure=1
cd $tmp || framework_failure=1

if test $framework_failure = 1; then
  echo "$0: failure in testing framework" 1>&2
  (exit 1); exit 1
fi

fail=0

# Each line in this list is a set of arguments, followed by :,
# followed by the set of files it will attempt to chmod,
# or empty if the usage is erroneous.
# Many of these test cases are due to Glenn Fowler.
# These test cases assume GNU behavior for "options" like -w.
cases='
  --         :
  -- --      :
  -- -- -- f : -- f
  -- -- -w f : -w f
  -- -- f    : f
  -- -w      :
  -- -w -- f : -- f
  -- -w -w f : -w f
  -- -w f    : f
  -- f       :
  -w         :
  -w --      :
  -w -- -- f : -- f
  -w -- -w f : -w f
  -w -- f    : f
  -w -w      :
  -w -w -- f : f
  -w -w -w f : f
  -w -w f    : f
  -w f       : f
  f          :
  f --       :
  f -w       : f
  f f        :
'

all_files=`echo "$cases" | sed 's/.*://'`

old_IFS=$IFS
IFS='
'
for case in $cases; do
  IFS=$old_IFS
  args=`expr "$case" : ' *\(.*[^ ]\) *:'`
  files=`expr "$case" : '.*: *\(.*\)'`

  case $files in
  '')
    touch -- $all_files || framework_failure=1
    chmod $args 2>/dev/null && fail=1
    ;;
  ?*)
    touch -- $files || framework_failure=1
    chmod $args || fail=1
    for file in $files; do
      rm -f -- $files && touch -- $files && rm -- $file || framework_failure=1
      chmod $args 2>/dev/null && fail=1
    done
    ;;
  esac
done

if test $framework_failure = 1; then
  echo "$0: failure in testing framework" 1>&2
  fail=1
fi

(exit $fail); exit $fail
