1da2e3ebdSchin########################################################################
2da2e3ebdSchin#                                                                      #
3da2e3ebdSchin#               This software is part of the ast package               #
4*b30d1939SAndy Fiddaman#          Copyright (c) 1982-2011 AT&T Intellectual Property          #
5da2e3ebdSchin#                      and is licensed under the                       #
6*b30d1939SAndy Fiddaman#                 Eclipse Public License, Version 1.0                  #
77c2fbfb3SApril Chin#                    by AT&T Intellectual Property                     #
8da2e3ebdSchin#                                                                      #
9da2e3ebdSchin#                A copy of the License is available at                 #
10*b30d1939SAndy Fiddaman#          http://www.eclipse.org/org/documents/epl-v10.html           #
11*b30d1939SAndy Fiddaman#         (with md5 checksum b35adb5213ca9657e911e9befb180842)         #
12da2e3ebdSchin#                                                                      #
13da2e3ebdSchin#              Information and Software Systems Research               #
14da2e3ebdSchin#                            AT&T Research                             #
15da2e3ebdSchin#                           Florham Park NJ                            #
16da2e3ebdSchin#                                                                      #
17da2e3ebdSchin#                  David Korn <dgk@research.att.com>                   #
18da2e3ebdSchin#                                                                      #
19da2e3ebdSchin########################################################################
20da2e3ebdSchinfunction err_exit
21da2e3ebdSchin{
22da2e3ebdSchin	print -u2 -n "\t"
23da2e3ebdSchin	print -u2 -r ${Command}[$Line]: "$@"
24da2e3ebdSchin	((Errors++))
25da2e3ebdSchin}
26da2e3ebdSchin
27da2e3ebdSchininteger Errors=0
28da2e3ebdSchinCommand=${0##*/}
29da2e3ebdSchin
30da2e3ebdSchin# {...} expansion tests -- ignore if not supported
31da2e3ebdSchin
32da2e3ebdSchin[[ $(print a{0,1}z) == "a0z a1z" ]] || exit 0
33da2e3ebdSchin
34da2e3ebdSchininteger Line=$LINENO+1
35da2e3ebdSchinset -- \
36da2e3ebdSchin	'ff{c,b,a}'				'ffc ffb ffa' \
37da2e3ebdSchin	'f{d,e,f}g'				'fdg feg ffg' \
38da2e3ebdSchin	'{l,n,m}xyz'				'lxyz nxyz mxyz' \
39da2e3ebdSchin	'{abc\,def}'				'{abc,def}' \
407c2fbfb3SApril Chin	'{"abc,def"}'				'{abc,def}' \
417c2fbfb3SApril Chin	"{'abc,def'}"				'{abc,def}' \
42da2e3ebdSchin	'{abc}'					'{abc}' \
43da2e3ebdSchin	'\{a,b,c,d,e}'				'{a,b,c,d,e}' \
44da2e3ebdSchin	'{x,y,\{a,b,c}}'			'x} y} {a} b} c}' \
45da2e3ebdSchin	'{x\,y,\{abc\},trie}'			'x,y {abc} trie' \
46da2e3ebdSchin	'/usr/{ucb/{ex,edit},lib/{ex,how_ex}}'	'/usr/ucb/ex /usr/ucb/edit /usr/lib/ex /usr/lib/how_ex' \
47da2e3ebdSchin	'XXXX\{a,b,c\}'				'XXXX{a,b,c}' \
48da2e3ebdSchin	'{}'					'{}' \
49da2e3ebdSchin	'{ }'					'{ }' \
50da2e3ebdSchin	'}'					'}' \
51da2e3ebdSchin	'{'					'{' \
52da2e3ebdSchin	'abcd{efgh'				'abcd{efgh' \
53da2e3ebdSchin	'foo {1,2} bar'				'foo 1 2 bar' \
54da2e3ebdSchin	'`print -r -- foo {1,2} bar`'		'foo 1 2 bar' \
55da2e3ebdSchin	'$(print -r -- foo {1,2} bar)'		'foo 1 2 bar' \
56da2e3ebdSchin	'{1..10}'				'1 2 3 4 5 6 7 8 9 10' \
57da2e3ebdSchin	'{0..10,braces}'			'0..10 braces' \
58da2e3ebdSchin	'{{0..10},braces}'			'0 1 2 3 4 5 6 7 8 9 10 braces' \
59da2e3ebdSchin	'x{{0..10},braces}y'			'x0y x1y x2y x3y x4y x5y x6y x7y x8y x9y x10y xbracesy' \
60da2e3ebdSchin	'{3..3}'				'3' \
61da2e3ebdSchin	'x{3..3}y'				'x3y' \
62da2e3ebdSchin	'{10..1}'				'10 9 8 7 6 5 4 3 2 1' \
63da2e3ebdSchin	'{10..1}y'				'10y 9y 8y 7y 6y 5y 4y 3y 2y 1y' \
64da2e3ebdSchin	'x{10..1}y'				'x10y x9y x8y x7y x6y x5y x4y x3y x2y x1y' \
65da2e3ebdSchin	'{a..f}'				'a b c d e f' \
66da2e3ebdSchin	'{f..a}'				'f e d c b a' \
67da2e3ebdSchin	'{a..A}'				'{a..A}' \
68da2e3ebdSchin	'{A..a}'				'{A..a}' \
69da2e3ebdSchin	'{f..f}'				'f' \
70da2e3ebdSchin	'{1..f}'				'{1..f}' \
71da2e3ebdSchin	'{f..1}'				'{f..1}' \
72da2e3ebdSchin	'0{1..9} {10..20}'			'01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20' \
73da2e3ebdSchin	'{-1..-10}'				'-1 -2 -3 -4 -5 -6 -7 -8 -9 -10' \
74da2e3ebdSchin	'{-19..0}'				'-19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0' \
75da2e3ebdSchin	'{0..10}'				'0 1 2 3 4 5 6 7 8 9 10' \
76da2e3ebdSchin	'{0..10..1}'				'0 1 2 3 4 5 6 7 8 9 10' \
77da2e3ebdSchin	'{0..10..2}'				'0 2 4 6 8 10' \
78da2e3ebdSchin	'{0..10..3}'				'0 3 6 9' \
79da2e3ebdSchin	'{0..10..0}'				'{0..10..0}' \
80da2e3ebdSchin	'{0..10..-1}'				'0' \
81da2e3ebdSchin	'{10..0}'				'10 9 8 7 6 5 4 3 2 1 0' \
82da2e3ebdSchin	'{10..0..-1}'				'10 9 8 7 6 5 4 3 2 1 0' \
83da2e3ebdSchin	'{10..0..-2}'				'10 8 6 4 2 0' \
84da2e3ebdSchin	'{10..0..-3}'				'10 7 4 1' \
85da2e3ebdSchin	'{10..0..0}'				'{10..0..0}' \
86da2e3ebdSchin	'{10..0..1}'				'10' \
87da2e3ebdSchin	'{a..z..2}'				'a c e g i k m o q s u w y' \
88da2e3ebdSchin	'{y..b..-3}'				'y v s p m j g d' \
89da2e3ebdSchin	'{0..0x1000..0x200}'			'0 512 1024 1536 2048 2560 3072 3584 4096' \
90da2e3ebdSchin	'{a,b}{0..2}{z,y}'			'a0z a0y a1z a1y a2z a2y b0z b0y b1z b1y b2z b2y' \
91da2e3ebdSchin	'{0..0100..8%03o}'			'000 010 020 030 040 050 060 070 100' \
92da2e3ebdSchin	'{0..0100..040%020o}'			'00000000000000000000 00000000000000000040 00000000000000000100' \
93da2e3ebdSchin	'{0..7%03..2u}'				'000 001 010 011 100 101 110 111' \
94da2e3ebdSchin	'{0..10%llu}'				'{0..10%llu}' \
95da2e3ebdSchin	'{0..10%s}'				'{0..10%s}' \
96da2e3ebdSchin	'{0..10%dl}'				'{0..10%dl}' \
97da2e3ebdSchin	'{a,b}{0..3%02..2u}{y,z}'		'a00y a00z a01y a01z a10y a10z a11y a11z b00y b00z b01y b01z b10y b10z b11y b11z' \
98da2e3ebdSchin
99da2e3ebdSchinwhile (($#>1))
100da2e3ebdSchindo	((Line++))
101da2e3ebdSchin	pattern=$1
102da2e3ebdSchin	shift
103da2e3ebdSchin	expected=$1
104da2e3ebdSchin	shift
105da2e3ebdSchin	got=$(eval print -r -- "$pattern")
106da2e3ebdSchin	[[ $got == $expected ]] || err_exit "'$pattern' failed -- expected '$expected' got '$got'"
107da2e3ebdSchin	#print -r -- "	'$pattern'			'$got' \\"
108da2e3ebdSchindone
109da2e3ebdSchin
110da2e3ebdSchin# ~(N) no expand glob pattern option
111da2e3ebdSchinset -- ~(N)/dev/null
112da2e3ebdSchin[[ $# == 1 && $1 == /dev/null ]] || err_exit "~(N)/dev/null not matching /dev/null"
113da2e3ebdSchinset -- ~(N)/dev/non_existant_file
114da2e3ebdSchin[[ $# == 0  ]] || err_exit "~(N)/dev/nonexistant not empty"
115da2e3ebdSchinset -- ""~(N)/dev/non_existant_file
116da2e3ebdSchin[[ $# == 1  && ! $1 ]] || err_exit '""~(N)/dev/nonexistant not null argument'
117da2e3ebdSchinset -- ~(N)/dev/non_existant_file""
118da2e3ebdSchin[[ $# == 1  && ! $1 ]] || err_exit '~(N)/dev/nonexistent"" not null argument'
119da2e3ebdSchinfor i in ~(N)/dev/non_existent_file
120da2e3ebdSchindo	err_exit "~(N)/dev/non_existent_file in for loop is $i"
121da2e3ebdSchindone
122da2e3ebdSchinfor i in ""~(N)/dev/non_existent_file
123da2e3ebdSchindo	[[ ! $i ]] || err_exit '""~(N)/dev/non_existent_file not null'
124da2e3ebdSchindone
125*b30d1939SAndy Fiddaman
126*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125))
127