1########################################################################
2#                                                                      #
3#               This software is part of the ast package               #
4#          Copyright (c) 1982-2010 AT&T Intellectual Property          #
5#                      and is licensed under the                       #
6#                  Common Public License, Version 1.0                  #
7#                    by AT&T Intellectual Property                     #
8#                                                                      #
9#                A copy of the License is available at                 #
10#            http://www.opensource.org/licenses/cpl1.0.txt             #
11#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
12#                                                                      #
13#              Information and Software Systems Research               #
14#                            AT&T Research                             #
15#                           Florham Park NJ                            #
16#                                                                      #
17#                  David Korn <dgk@research.att.com>                   #
18#                                                                      #
19########################################################################
20# test the behavior of return and exit with functions
21
22function err_exit
23{
24	print -u2 -n "\t"
25	print -u2 -r ${Command}[$1]: "${@:2}"
26	let Errors+=1
27}
28alias err_exit='err_exit $LINENO'
29
30Command=${0##*/}
31integer Errors=0
32
33tmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
34trap "cd /; rm -rf $tmp" EXIT
35
36unset HISTFILE
37
38foo=NOVAL bar=NOVAL
39file=$tmp/test
40function foo
41{
42	typeset foo=NOEXIT
43	trap "foo=EXIT;rm -f $file" EXIT
44	> $file
45	if	(( $1 == 0 ))
46	then	return $2
47	elif	(( $1 == 1 ))
48	then	exit $2
49	else	bar "$@"
50	fi
51}
52
53function bar
54{
55	typeset bar=NOEXIT
56	trap 'bar=EXIT' EXIT
57	if	(( $1 == 2 ))
58	then	return $2
59	elif	(( $1 == 3 ))
60	then	exit $2
61	fi
62}
63
64function funcheck
65{
66	[[ $foo = EXIT ]] || err_exit "foo "$@" : exit trap not set"
67	if	[[ -f $file ]]
68	then	rm -r $file
69		err_exit "foo $@: doesn't remove $file"
70	fi
71	foo=NOVAL bar=NOVAL
72}
73
74(exit 0) || err_exit "exit 0 is not zero"
75(return 0) || err_exit "return 0 is not zero"
76(exit) || err_exit "default exit value is not zero"
77(return) || err_exit "default return value is not zero"
78(exit 35)
79ret=$?
80if	(( $ret != 35 ))
81then	err_exit "exit 35 is $ret not 35"
82fi
83(return 35)
84ret=$?
85if	(( $ret != 35 ))
86then	err_exit "return 35 is $ret not 35"
87fi
88
89foo 0 0 || err_exit "foo 0 0: incorrect return"
90funcheck 0 0
91foo 0 3
92ret=$?
93if	(( $ret != 3 ))
94then	err_exit "foo 0 3: return is $ret not 3"
95fi
96funcheck 0 3
97foo 2 0 || err_exit "foo 2 0: incorrect return"
98[[ $bar = EXIT ]] || err_exit "foo 2 0: bar exit trap not set"
99funcheck 2 0
100foo 2 3
101ret=$?
102if	(( $ret != 3 ))
103then	err_exit "foo 2 3: return is $ret not 3"
104fi
105[[ $bar = EXIT ]] || err_exit "foo 2 3: bar exit trap not set"
106funcheck 2 3
107(foo 3 3)
108ret=$?
109if	(( $ret != 3 ))
110then	err_exit "foo 3 3: return is $ret not 3"
111fi
112foo=EXIT
113funcheck 3 3
114cat > $file <<!
115return 3
116exit 4
117!
118( . $file )
119ret=$?
120if	(( $ret != 3 ))
121then	err_exit "return in dot script is $ret should be 3"
122fi
123chmod 755 $file
124(  $file )
125ret=$?
126if	(( $ret != 3 ))
127then	err_exit "return in script is $ret should be 3"
128fi
129cat > $file <<!
130: line 1
131# next line should fail and cause an exit
132: > /
133exit 4
134!
135( . $file ; exit 5 ) 2> /dev/null
136ret=$?
137if	(( $ret != 1 ))
138then	err_exit "error in dot script is $ret should be 1"
139fi
140(  $file; exit 5 ) 2> /dev/null
141ret=$?
142if	(( $ret != 5 ))
143then	err_exit "error in script is $ret should be 5"
144fi
145cat > $file <<\!
146print -r -- "$0"
147!
148x=$( . $file)
149if	[[ $x != $0 ]]
150then	err_exit "\$0 in a dot script is $x. Should be $0"
151fi
152x=$($SHELL -i --norc 2> /dev/null <<\!
153typeset -i x=1/0
154print hello
155!
156)
157if	[[ $x != hello ]]
158then	err_exit "interactive shell terminates with error in bltin"
159fi
160x=$( set -e
161	false
162	print bad
163	)
164if	[[ $x != '' ]]
165then	err_exit "set -e doesn't terminate script on error"
166fi
167x=$( set -e
168	trap 'exit 0' EXIT
169	false
170	print bad
171	)
172if	(( $? != 0 ))
173then	err_exit "exit 0 in trap should doesn't set exit value to 0"
174fi
175$SHELL <<\!
176trap 'exit 8' EXIT
177exit 1
178!
179if	(( $? != 8 ))
180then	err_exit "exit 8 in trap should set exit value to 8"
181fi
182exit $((Errors))
183