#!/bin/sh
# This is tests/ls/quoting-style-c.sh
# test --quoting-style=c (-Q)

# Usage:
#   cd tests
#   make check TESTS=ls/quoting-style-c.sh

# v1: For now, we're just watching for regressions with --classify (-F)
#

# Copyright (C) 2017 Free Software Foundation, Inc.

# 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 <http://www.gnu.org/licenses/>.

. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
print_ver_ ls

# Create all possible 8-bit characters in filenames.
# Note that, while bash works fine, dash's builtin printf is unable to
# do this, so we use /usr/bin/printf just in case.
for x in $(seq 0 255); do
    y=$(printf "%02x" $x)
    touch "$(/usr/bin/printf "bar\x${y}foo")" || echo "Skipping: 0x$y"
done || framework_failure_

# Include some specific files we know should (or should not) be quoted.
mknod 'Ceci est une pipe' p || framework_failure_
mkdir 411 || framework_failure_
ln -s ouroboros || framework_failure_

touch 'yesbackslashbeforedoublequote"' 'yesbackslashbeforebackslash\'
touch 'nobackslash=' 'nobackslash>' 'nobackslash@' 'nobackslash|' \
      'nobackslash:' 'nobackslash ' 'nobackslash*' 'nobackslash<'

cat <<'EOF' >exp || framework_failure_
"411"/
"Ceci est une pipe"|
"bar\001foo"
"bar\002foo"
"bar\003foo"
"bar\004foo"
"bar\005foo"
"bar\006foo"
"bar\afoo"
"bar\bfoo"
"bar\tfoo"
"bar\nfoo"
"bar\vfoo"
"bar\ffoo"
"bar\rfoo"
"bar\016foo"
"bar\017foo"
"bar\020foo"
"bar\021foo"
"bar\022foo"
"bar\023foo"
"bar\024foo"
"bar\025foo"
"bar\026foo"
"bar\027foo"
"bar\030foo"
"bar\031foo"
"bar\032foo"
"bar\033foo"
"bar\034foo"
"bar\035foo"
"bar\036foo"
"bar\037foo"
"bar foo"
"bar!foo"
"bar\"foo"
"bar#foo"
"bar$foo"
"bar%foo"
"bar&foo"
"bar'foo"
"bar(foo"
"bar)foo"
"bar*foo"
"bar+foo"
"bar,foo"
"bar-foo"
"bar.foo"
"bar0foo"
"bar1foo"
"bar2foo"
"bar3foo"
"bar4foo"
"bar5foo"
"bar6foo"
"bar7foo"
"bar8foo"
"bar9foo"
"bar:foo"
"bar;foo"
"bar<foo"
"bar=foo"
"bar>foo"
"bar?foo"
"bar@foo"
"barAfoo"
"barBfoo"
"barCfoo"
"barDfoo"
"barEfoo"
"barFfoo"
"barGfoo"
"barHfoo"
"barIfoo"
"barJfoo"
"barKfoo"
"barLfoo"
"barMfoo"
"barNfoo"
"barOfoo"
"barPfoo"
"barQfoo"
"barRfoo"
"barSfoo"
"barTfoo"
"barUfoo"
"barVfoo"
"barWfoo"
"barXfoo"
"barYfoo"
"barZfoo"
"bar[foo"
"bar\\foo"
"bar]foo"
"bar^foo"
"bar_foo"
"bar`foo"
"barafoo"
"barbfoo"
"barcfoo"
"bardfoo"
"barefoo"
"barffoo"
"barfoo"
"bargfoo"
"barhfoo"
"barifoo"
"barjfoo"
"barkfoo"
"barlfoo"
"barmfoo"
"barnfoo"
"barofoo"
"barpfoo"
"barqfoo"
"barrfoo"
"barsfoo"
"bartfoo"
"barufoo"
"barvfoo"
"barwfoo"
"barxfoo"
"baryfoo"
"barzfoo"
"bar{foo"
"bar|foo"
"bar}foo"
"bar~foo"
"bar\177foo"
"bar\200foo"
"bar\201foo"
"bar\202foo"
"bar\203foo"
"bar\204foo"
"bar\205foo"
"bar\206foo"
"bar\207foo"
"bar\210foo"
"bar\211foo"
"bar\212foo"
"bar\213foo"
"bar\214foo"
"bar\215foo"
"bar\216foo"
"bar\217foo"
"bar\220foo"
"bar\221foo"
"bar\222foo"
"bar\223foo"
"bar\224foo"
"bar\225foo"
"bar\226foo"
"bar\227foo"
"bar\230foo"
"bar\231foo"
"bar\232foo"
"bar\233foo"
"bar\234foo"
"bar\235foo"
"bar\236foo"
"bar\237foo"
"bar\240foo"
"bar\241foo"
"bar\242foo"
"bar\243foo"
"bar\244foo"
"bar\245foo"
"bar\246foo"
"bar\247foo"
"bar\250foo"
"bar\251foo"
"bar\252foo"
"bar\253foo"
"bar\254foo"
"bar\255foo"
"bar\256foo"
"bar\257foo"
"bar\260foo"
"bar\261foo"
"bar\262foo"
"bar\263foo"
"bar\264foo"
"bar\265foo"
"bar\266foo"
"bar\267foo"
"bar\270foo"
"bar\271foo"
"bar\272foo"
"bar\273foo"
"bar\274foo"
"bar\275foo"
"bar\276foo"
"bar\277foo"
"bar\300foo"
"bar\301foo"
"bar\302foo"
"bar\303foo"
"bar\304foo"
"bar\305foo"
"bar\306foo"
"bar\307foo"
"bar\310foo"
"bar\311foo"
"bar\312foo"
"bar\313foo"
"bar\314foo"
"bar\315foo"
"bar\316foo"
"bar\317foo"
"bar\320foo"
"bar\321foo"
"bar\322foo"
"bar\323foo"
"bar\324foo"
"bar\325foo"
"bar\326foo"
"bar\327foo"
"bar\330foo"
"bar\331foo"
"bar\332foo"
"bar\333foo"
"bar\334foo"
"bar\335foo"
"bar\336foo"
"bar\337foo"
"bar\340foo"
"bar\341foo"
"bar\342foo"
"bar\343foo"
"bar\344foo"
"bar\345foo"
"bar\346foo"
"bar\347foo"
"bar\350foo"
"bar\351foo"
"bar\352foo"
"bar\353foo"
"bar\354foo"
"bar\355foo"
"bar\356foo"
"bar\357foo"
"bar\360foo"
"bar\361foo"
"bar\362foo"
"bar\363foo"
"bar\364foo"
"bar\365foo"
"bar\366foo"
"bar\367foo"
"bar\370foo"
"bar\371foo"
"bar\372foo"
"bar\373foo"
"bar\374foo"
"bar\375foo"
"bar\376foo"
"bar\377foo"
"exp"
"nobackslash "
"nobackslash*"
"nobackslash:"
"nobackslash<"
"nobackslash="
"nobackslash>"
"nobackslash@"
"nobackslash|"
"ouroboros"@
"out"
"yesbackslashbeforebackslash\\"
"yesbackslashbeforedoublequote\""
EOF

ls --classify --quoting-style=c > out || fail=1

compare exp out || fail=1

Exit $fail
