summaryrefslogtreecommitdiff
path: root/Userland/Shell/Tests/valid.sh
blob: dc624f1fddfdf6cd880db932f57b2ad0c28e26b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/bin/sh

source $(dirname "$0")/test-commons.inc

# Are comments ignored?
# Sanity check: can we do && and || ?
true || exit 2
false

# Can we chain &&'s?
false && exit 2 && fail "can't chain &&'s"

# Proper precedence between &&'s and ||'s
false && exit 2 || true && false && fail Invalid precedence between '&&' and '||'


# Sanity check: can we pass arguments to 'test'?
if not test yes = yes  { exit 2 }

# Sanity check: can we use $(command)?
if not test "$(echo yes)" = yes  { exit 2 }
# Redirections.
if not test -z "$(echo foo > /dev/null)"  { fail direct path redirection }
if not test -z "$(echo foo 2> /dev/null 1>&2)"  { fail indirect redirection }
if not test -n "$(echo foo 2> /dev/null)"  { fail fds interfere with each other }

# Argument unpack
if not test "$(echo (yes))" = yes  { fail arguments inside bare lists }
if not test "$(echo (no)() yes)" = yes  { fail arguments inside juxtaposition: empty }
if not test "$(echo (y)(es))" = yes  { fail arguments inside juxtaposition: list }
if not test "$(echo "y"es)" = yes  { fail arguments inside juxtaposition: string }

# String substitution
foo=yes
if not test "$(echo $foo)" = yes  { fail simple string var lookup }
if not test "$(echo "$foo")" = yes  { fail stringified string var lookup }

# List substitution
foo=(yes)
# Static lookup, as list
if not test "$(echo $foo)" = yes  { fail simple list var lookup }
# Static lookup, stringified
if not test "$(echo "$foo")" = yes  { fail stringified list var lookup }
# Dynamic lookup through static expression
if not test "$(echo $'foo')" = yes  { fail dynamic lookup through static exp }
# Dynamic lookup through dynamic expression
ref_to_foo=foo
if not test "$(echo $"$ref_to_foo")" = yes  { fail dynamic lookup through dynamic exp }

# More redirections
echo test > /tmp/sh-test
if not test "$(cat /tmp/sh-test)" = test  { fail simple path redirect }
rm /tmp/sh-test

# 'brace' expansions
if not test "$(echo x(yes no))" = "xyes xno"  { fail simple juxtaposition expansion }
if not test "$(echo (y n)(es o))" = "yes yo nes no"  { fail list-list juxtaposition expansion }
if not test "$(echo ()(foo bar baz))" = ""  { fail empty expansion }

# Variables inside commands
to_devnull=(>/dev/null)
if not test "$(echo hewwo $to_devnull)" = ""  { fail variable containing simple command }

word_count=(() | wc -w)
if not test "$(echo well hello friends $word_count)" -eq 3  { fail variable containing pipeline }

# Globs
rm -fr /tmp/sh-test 2> /dev/null
mkdir -p /tmp/sh-test
pushd /tmp/sh-test
    touch (a b c)(d e f)
    if not test "$(echo a*)" = "ad ae af"  { fail '*' glob expansion }
    if not test "$(echo a?)" = "ad ae af"  { fail '?' glob expansion }

    glob_in_var='*'
    if not test "$(echo $glob_in_var)" = '*'  { fail substituted string acts as glob }

    if not test "$(echo (a*))" = "ad ae af"  { fail globs in lists resolve wrong }
    if not test "$(echo x(a*))" = "xad xae xaf"  { fail globs in lists do not resolve to lists }
    if not test "$(echo "foo"a*)" = "fooad fooae fooaf"  { fail globs join to dquoted strings }
popd
rm -fr /tmp/sh-test

# Setopt
setopt --inline_exec_keep_empty_segments
if not test "$(echo -n "a\n\nb")" = "a  b"  { fail inline_exec_keep_empty_segments has no effect }

setopt --no_inline_exec_keep_empty_segments
if not test "$(echo -n "a\n\nb")" = "a b"  { fail cannot unset inline_exec_keep_empty_segments }

echo PASS