1 #!/usr/bin/env bash
2 #
3 # word-eval.test.sh: Test the word evaluation pipeline in order.
4 #
5 # Part evaluation, splitting, joining, elision, globbing.
6
7 # TODO: Rename word-eval-smoke.test.sh?
8 # Word sequence evaluation.
9 # This is more like a vertical slice. For exhaustive tests, see:
10 #
11 # word-split.test.sh (perhaps rename word-reframe?)
12 # glob.test.sh
13
14 #### Evaluation of constant parts
15 argv.py bare 'sq'
16 ## stdout: ['bare', 'sq']
17
18 #### Evaluation of each part
19 #set -o noglob
20 HOME=/home/bob
21 str=s
22 array=(a1 a2)
23 argv.py bare 'sq' ~ $str "-${str}-" "${array[@]}" $((1+2)) $(echo c) `echo c`
24 ## stdout: ['bare', 'sq', '/home/bob', 's', '-s-', 'a1', 'a2', '3', 'c', 'c']
25 ## N-I dash stdout-json: ""
26 ## N-I dash status: 2
27
28 #### Word splitting
29 s1='1 2'
30 s2='3 4'
31 s3='5 6'
32 argv.py $s1$s2 "$s3"
33 ## stdout: ['1', '23', '4', '5 6']
34
35 #### Word joining
36 set -- x y z
37 s1='1 2'
38 array=(a1 a2)
39 argv.py $s1"${array[@]}"_"$@"
40 ## stdout: ['1', '2a1', 'a2_x', 'y', 'z']
41 ## N-I dash stdout-json: ""
42 ## N-I dash status: 2
43
44 #### Word elision
45 s1=''
46 argv.py $s1 - "$s1"
47 ## stdout: ['-', '']
48
49 #### Default values -- more cases
50 argv.py ${undef:-hi} ${undef:-'a b'} "${undef:-c d}" "${un:-"e f"}" "${un:-'g h'}"
51 ## stdout: ['hi', 'a b', 'c d', 'e f', "'g h'"]
52
53 #### Globbing after splitting
54 touch _tmp/foo.gg _tmp/bar.gg _tmp/foo.hh
55 pat='_tmp/*.hh _tmp/*.gg'
56 argv.py $pat
57 ## stdout: ['_tmp/foo.hh', '_tmp/bar.gg', '_tmp/foo.gg']
58
59 #### Globbing escaping
60 touch '_tmp/[bc]ar.mm' # file that looks like a glob pattern
61 touch _tmp/bar.mm _tmp/car.mm
62 argv.py '_tmp/[bc]'*.mm - _tmp/?ar.mm
63 ## stdout: ['_tmp/[bc]ar.mm', '-', '_tmp/bar.mm', '_tmp/car.mm']