17c2fbfb3SApril Chin#
27c2fbfb3SApril Chin# CDDL HEADER START
37c2fbfb3SApril Chin#
47c2fbfb3SApril Chin# The contents of this file are subject to the terms of the
57c2fbfb3SApril Chin# Common Development and Distribution License (the "License").
67c2fbfb3SApril Chin# You may not use this file except in compliance with the License.
77c2fbfb3SApril Chin#
87c2fbfb3SApril Chin# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c2fbfb3SApril Chin# or http://www.opensolaris.org/os/licensing.
107c2fbfb3SApril Chin# See the License for the specific language governing permissions
117c2fbfb3SApril Chin# and limitations under the License.
127c2fbfb3SApril Chin#
137c2fbfb3SApril Chin# When distributing Covered Code, include this CDDL HEADER in each
147c2fbfb3SApril Chin# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c2fbfb3SApril Chin# If applicable, add the following below this CDDL HEADER, with the
167c2fbfb3SApril Chin# fields enclosed by brackets "[]" replaced with your own identifying
177c2fbfb3SApril Chin# information: Portions Copyright [yyyy] [name of copyright owner]
187c2fbfb3SApril Chin#
197c2fbfb3SApril Chin# CDDL HEADER END
207c2fbfb3SApril Chin#
217c2fbfb3SApril Chin
227c2fbfb3SApril Chin#
233e14f97fSRoger A. Faulkner# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
247c2fbfb3SApril Chin#
257c2fbfb3SApril Chin
2634f9b3eeSRoland Mainz# test setup
277c2fbfb3SApril Chinfunction err_exit
287c2fbfb3SApril Chin{
297c2fbfb3SApril Chin	print -u2 -n "\t"
307c2fbfb3SApril Chin	print -u2 -r ${Command}[$1]: "${@:2}"
313e14f97fSRoger A. Faulkner	(( Errors < 127 && Errors++ ))
327c2fbfb3SApril Chin}
337c2fbfb3SApril Chinalias err_exit='err_exit $LINENO'
347c2fbfb3SApril Chin
3534f9b3eeSRoland Mainz# "nounset" disabled for now
3634f9b3eeSRoland Mainz#set -o nounset
3734f9b3eeSRoland MainzCommand=${0##*/}
3834f9b3eeSRoland Mainzinteger Errors=0
3934f9b3eeSRoland Mainz
4034f9b3eeSRoland Mainzcompound bracketstat=(
417c2fbfb3SApril Chin	integer bopen=0
427c2fbfb3SApril Chin	integer bclose=0
437c2fbfb3SApril Chin)
447c2fbfb3SApril Chin
457c2fbfb3SApril Chinfunction count_brackets
467c2fbfb3SApril Chin{
477c2fbfb3SApril Chin	typeset x="$1"
487c2fbfb3SApril Chin	typeset c
497c2fbfb3SApril Chin
507c2fbfb3SApril Chin	integer i
517c2fbfb3SApril Chin	(( bracketstat.bopen=0 , bracketstat.bclose=0 ))
527c2fbfb3SApril Chin
537c2fbfb3SApril Chin	for (( i=0 ; i < ${#x} ; i++ )) ; do
547c2fbfb3SApril Chin	        c="${x:i:1}"
557c2fbfb3SApril Chin		[[ "$c" == "(" ]] && (( bracketstat.bopen++ ))
567c2fbfb3SApril Chin		[[ "$c" == ")" ]] && (( bracketstat.bclose++ ))
577c2fbfb3SApril Chin	done
58*b30d1939SAndy Fiddaman
597c2fbfb3SApril Chin	(( bracketstat.bopen != bracketstat.bclose )) && return 1
60*b30d1939SAndy Fiddaman
617c2fbfb3SApril Chin	return 0
627c2fbfb3SApril Chin}
637c2fbfb3SApril Chin
6434f9b3eeSRoland Mainz# compound variable "cat" nr.1, using $ print "%B\n" ... #
6534f9b3eeSRoland Mainzfunction cpvcat1
6634f9b3eeSRoland Mainz{
6734f9b3eeSRoland Mainz	set -o errexit
6834f9b3eeSRoland Mainz	compound tmp
69*b30d1939SAndy Fiddaman
7034f9b3eeSRoland Mainz	while read -C tmp ; do printf "%B\n" tmp ; done
7134f9b3eeSRoland Mainz	return 0
7234f9b3eeSRoland Mainz}
7334f9b3eeSRoland Mainz
7434f9b3eeSRoland Mainz# compound variable "cat" nr.2, using $ print "%#B\n" ... #
7534f9b3eeSRoland Mainzfunction cpvcat2
7634f9b3eeSRoland Mainz{
7734f9b3eeSRoland Mainz	set -o errexit
7834f9b3eeSRoland Mainz	compound tmp
79*b30d1939SAndy Fiddaman
8034f9b3eeSRoland Mainz	while read -C tmp ; do printf "%#B\n" tmp ; done
8134f9b3eeSRoland Mainz	return 0
8234f9b3eeSRoland Mainz}
8334f9b3eeSRoland Mainz
8434f9b3eeSRoland Mainz# compound variable "cat" nr.3, using $ print -C ... #
8534f9b3eeSRoland Mainzfunction cpvcat3
8634f9b3eeSRoland Mainz{
8734f9b3eeSRoland Mainz	set -o errexit
8834f9b3eeSRoland Mainz	compound tmp
89*b30d1939SAndy Fiddaman
9034f9b3eeSRoland Mainz	while read -C tmp ; do print -C tmp ; done
9134f9b3eeSRoland Mainz	return 0
9234f9b3eeSRoland Mainz}
9334f9b3eeSRoland Mainz
9434f9b3eeSRoland Mainz# compound variable "cat" nr.4, using $ print -v ... #
9534f9b3eeSRoland Mainzfunction cpvcat4
9634f9b3eeSRoland Mainz{
9734f9b3eeSRoland Mainz	set -o errexit
9834f9b3eeSRoland Mainz	compound tmp
99*b30d1939SAndy Fiddaman
10034f9b3eeSRoland Mainz	while read -C tmp ; do print -v tmp ; done
10134f9b3eeSRoland Mainz	return 0
10234f9b3eeSRoland Mainz}
1037c2fbfb3SApril Chin
1047c2fbfb3SApril Chintypeset s
1057c2fbfb3SApril Chin
1067c2fbfb3SApril Chin# Test 1:
1077c2fbfb3SApril Chin# Check whether "read -C" leaves the file pointer at the next line
1087c2fbfb3SApril Chin# (and does not read beyond that point).
1097c2fbfb3SApril Chin# Data layout is:
1107c2fbfb3SApril Chin# -- snip --
1117c2fbfb3SApril Chin# <compound var>
1127c2fbfb3SApril Chin# hello
1137c2fbfb3SApril Chin# -- snip --
1147c2fbfb3SApril Chin# (additionally we test some extra stuff like bracket count)
1157c2fbfb3SApril Chins=${
11634f9b3eeSRoland Mainz	compound x=(
1177c2fbfb3SApril Chin		a=1 b=2
1187c2fbfb3SApril Chin		typeset -a myarray=( 1 2 3 4 5 6 7 8 9 10 )
1197c2fbfb3SApril Chin		typeset -A myarray2=( [a]=1 [b]=2 ["c d"]=3 [e]=4 ["f"]=5 [g]=6 [h]=7 [i]=8 [j]=9 [k]=10 )
1207c2fbfb3SApril Chin		typeset -A myarray3=(
1217c2fbfb3SApril Chin			[a]=(
1227c2fbfb3SApril Chin				float m1=0.5
1237c2fbfb3SApril Chin				float m2=0.6
1247c2fbfb3SApril Chin				foo="hello"
1257c2fbfb3SApril Chin			)
1267c2fbfb3SApril Chin			[b]=(
1277c2fbfb3SApril Chin				foo="bar"
1287c2fbfb3SApril Chin			)
1297c2fbfb3SApril Chin			["c d"]=(
1307c2fbfb3SApril Chin				integer at=90
1317c2fbfb3SApril Chin			)
1327c2fbfb3SApril Chin			[e]=(
13334f9b3eeSRoland Mainz				compound nested_cpv=(
1347c2fbfb3SApril Chin					typeset -a myarray=( 1 2 3 4 5 6 7 8 9 10 )
1357c2fbfb3SApril Chin					typeset str=$'a \'string'
1367c2fbfb3SApril Chin				)
1377c2fbfb3SApril Chin			)
1387c2fbfb3SApril Chin			[f]=(
1397c2fbfb3SApril Chin				typeset g="f"
1407c2fbfb3SApril Chin			)
14134f9b3eeSRoland Mainz			[a_nan]=(
14234f9b3eeSRoland Mainz				float my_nan=-nan
14334f9b3eeSRoland Mainz			)
14434f9b3eeSRoland Mainz			[a_hexfloat]=(
14534f9b3eeSRoland Mainz			       typeset -X my_hexfloat=1.1
14634f9b3eeSRoland Mainz			)
1477c2fbfb3SApril Chin		)
1487c2fbfb3SApril Chin	)
1497c2fbfb3SApril Chin
1507c2fbfb3SApril Chin	{
1517c2fbfb3SApril Chin		printf "%B\n" x
1527c2fbfb3SApril Chin		print "hello"
15334f9b3eeSRoland Mainz	} | cpvcat1 | cpvcat2 | cpvcat3 | cpvcat4 | {
1547c2fbfb3SApril Chin		read -C y
1557c2fbfb3SApril Chin		read s
1567c2fbfb3SApril Chin	}
1577c2fbfb3SApril Chin	print "x${s}x"
1587c2fbfb3SApril Chin} || err_exit "test returned exit code $?"
1597c2fbfb3SApril Chin
1607c2fbfb3SApril Chin[[ "${s}" == "xhellox" ]] || err_exit "Expected 'xhellox', got ${s}"
1617c2fbfb3SApril Chincount_brackets "$y" || err_exit "y: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
16234f9b3eeSRoland Mainzcount_brackets "$(print -v y)" || err_exit "y: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
16334f9b3eeSRoland Mainzcount_brackets "$(print -C y)" || err_exit "y: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
1647c2fbfb3SApril Chin
1657c2fbfb3SApril Chin# cleanup
1667c2fbfb3SApril Chinunset x y || err_exit "unset failed"
1677c2fbfb3SApril Chin[[ "$x" == "" ]] || err_exit "cleanup failed for x"
1687c2fbfb3SApril Chin[[ "$y" == "" ]] || err_exit "cleanup failed for y"
1697c2fbfb3SApril Chin
1707c2fbfb3SApril Chin
1717c2fbfb3SApril Chin# Test 2:
1727c2fbfb3SApril Chin# Same as test 1 except one more compound var following the "hello"
1737c2fbfb3SApril Chin# line.
1747c2fbfb3SApril Chin# Data layout is:
1757c2fbfb3SApril Chin# -- snip --
1767c2fbfb3SApril Chin# <compound var>
1777c2fbfb3SApril Chin# hello
1787c2fbfb3SApril Chin# <compound var>
1797c2fbfb3SApril Chin# -- snip --
1807c2fbfb3SApril Chins=${
18134f9b3eeSRoland Mainz	compound x=(
1827c2fbfb3SApril Chin		a=1 b=2
1837c2fbfb3SApril Chin		typeset -a myarray=( 1 2 3 4 5 6 7 8 9 10 )
1847c2fbfb3SApril Chin		typeset -A myarray2=( [a]=1 [b]=2 ["c d"]=3 [e]=4 ["f"]=5 [g]=6 [h]=7 [i]=8 [j]=9 [k]=10 )
18534f9b3eeSRoland Mainz		compound -A myarray3=(
1867c2fbfb3SApril Chin			[a]=(
1877c2fbfb3SApril Chin				float m1=0.5
1887c2fbfb3SApril Chin				float m2=0.6
1897c2fbfb3SApril Chin				foo="hello"
1907c2fbfb3SApril Chin			)
1917c2fbfb3SApril Chin			[b]=(
1927c2fbfb3SApril Chin				foo="bar"
1937c2fbfb3SApril Chin			)
1947c2fbfb3SApril Chin			["c d"]=(
1957c2fbfb3SApril Chin				integer at=90
1967c2fbfb3SApril Chin			)
1977c2fbfb3SApril Chin			[e]=(
19834f9b3eeSRoland Mainz				compound nested_cpv=(
1997c2fbfb3SApril Chin					typeset -a myarray=( 1 2 3 4 5 6 7 8 9 10 )
2007c2fbfb3SApril Chin					typeset str=$'a \'string'
2017c2fbfb3SApril Chin				)
2027c2fbfb3SApril Chin			)
2037c2fbfb3SApril Chin			[f]=(
2047c2fbfb3SApril Chin				typeset g="f"
2057c2fbfb3SApril Chin			)
20634f9b3eeSRoland Mainz			[a_nan]=(
20734f9b3eeSRoland Mainz				float my_nan=-nan
20834f9b3eeSRoland Mainz			)
20934f9b3eeSRoland Mainz			[a_hexfloat]=(
21034f9b3eeSRoland Mainz			       typeset -X my_hexfloat=1.1
21134f9b3eeSRoland Mainz			)
2127c2fbfb3SApril Chin		)
2137c2fbfb3SApril Chin	)
2147c2fbfb3SApril Chin
2157c2fbfb3SApril Chin	{
2167c2fbfb3SApril Chin		printf "%B\n" x
2177c2fbfb3SApril Chin		print "hello"
2187c2fbfb3SApril Chin		printf "%B\n" x
21934f9b3eeSRoland Mainz	} | cpvcat1 | cpvcat2 | cpvcat3 | cpvcat4 | {
2207c2fbfb3SApril Chin		read -C y1
2217c2fbfb3SApril Chin		read s
2227c2fbfb3SApril Chin		read -C y2
2237c2fbfb3SApril Chin	}
224*b30d1939SAndy Fiddaman
2257c2fbfb3SApril Chin	print "x${s}x"
2267c2fbfb3SApril Chin} || err_exit "test returned exit code $?"
2277c2fbfb3SApril Chin
2287c2fbfb3SApril Chin[[ "${s}" == "xhellox" ]] || err_exit "Expected 'xhellox', got ${s}."
22934f9b3eeSRoland Mainz[[ "${y1.myarray3[b].foo}" == "bar" ]] || err_exit "y1.myarray3[b].foo != bar"
23034f9b3eeSRoland Mainz[[ "${y2.myarray3[b].foo}" == "bar" ]] || err_exit "y2.myarray3[b].foo != bar"
2317c2fbfb3SApril Chin[[ "$y1" != "" ]] || err_exit "y1 is empty"
2327c2fbfb3SApril Chin[[ "$y2" != "" ]] || err_exit "y2 is empty"
23334f9b3eeSRoland Mainz(( ${#y1.myarray3[e].nested_cpv.myarray[@]} == 10 )) || err_exit "Expected 10 elements in y1.myarray3[e].nested_cpv, got ${#y1.myarray3[e].nested_cpv[@]}"
23434f9b3eeSRoland Mainz(( ${#y2.myarray3[e].nested_cpv.myarray[@]} == 10 )) || err_exit "Expected 10 elements in y2.myarray3[e].nested_cpv, got ${#y2.myarray3[e].nested_cpv[@]}"
23534f9b3eeSRoland Mainz(( isnan(y1.myarray3[a_nan].my_nan) ))   || err_exit "y1.myarray3[a_nan].my_nan not a NaN"
23634f9b3eeSRoland Mainz(( isnan(y2.myarray3[a_nan].my_nan) ))   || err_exit "y2.myarray3[a_nan].my_nan not a NaN"
23734f9b3eeSRoland Mainz(( signbit(y1.myarray3[a_nan].my_nan) )) || err_exit "y1.myarray3[a_nan].my_nan not negative"
23834f9b3eeSRoland Mainz(( signbit(y2.myarray3[a_nan].my_nan) )) || err_exit "y2.myarray3[a_nan].my_nan not negative"
2397c2fbfb3SApril Chincount_brackets "$y1" || err_exit "y1: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
24034f9b3eeSRoland Mainzcount_brackets "$(print -v y1)" || err_exit "y1: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
24134f9b3eeSRoland Mainzcount_brackets "$(print -C y1)" || err_exit "y1: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
2427c2fbfb3SApril Chincount_brackets "$y2" || err_exit "y2: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
24334f9b3eeSRoland Mainzcount_brackets "$(print -v y2)" || err_exit "y2: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
24434f9b3eeSRoland Mainzcount_brackets "$(print -C y2)" || err_exit "y2: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
2457c2fbfb3SApril Chin[[ "$y1" == "$y2" ]] || err_exit "Expected $(printf "%q\n" "${y1}") == $(printf "%q\n" "${y2}")."
2467c2fbfb3SApril Chin[[ "$x"  == "$y1" ]] || err_exit "Expected $(printf "%q\n" "${x}") == $(printf "%q\n" "${y}")."
2477c2fbfb3SApril Chin
2487c2fbfb3SApril Chin# cleanup
2497c2fbfb3SApril Chinunset x y1 y2 || err_exit "unset failed"
2507c2fbfb3SApril Chin[[ "$x" == "" ]]  || err_exit "cleanup failed for x"
2517c2fbfb3SApril Chin[[ "$y1" == "" ]] || err_exit "cleanup failed for y1"
2527c2fbfb3SApril Chin[[ "$y2" == "" ]] || err_exit "cleanup failed for y2"
2537c2fbfb3SApril Chin
2547c2fbfb3SApril Chin
2557c2fbfb3SApril Chin# Test 3: Test compound variable copy operator vs. "read -C"
25634f9b3eeSRoland Mainzcompound x=(
2577c2fbfb3SApril Chin	a=1 b=2
2587c2fbfb3SApril Chin	typeset -a myarray=( 1 2 3 4 5 6 7 8 9 10 )
2597c2fbfb3SApril Chin	typeset -A myarray2=( [a]=1 [b]=2 ["c d"]=3 [e]=4 ["f"]=5 [g]=6 [h]=7 [i]=8 [j]=9 [k]=10 )
26034f9b3eeSRoland Mainz	compound -A myarray3=(
2617c2fbfb3SApril Chin		[a]=(
2627c2fbfb3SApril Chin			float m1=0.5
2637c2fbfb3SApril Chin			float m2=0.6
2647c2fbfb3SApril Chin			foo="hello"
2657c2fbfb3SApril Chin		)
2667c2fbfb3SApril Chin		[b]=(
2677c2fbfb3SApril Chin			foo="bar"
2687c2fbfb3SApril Chin		)
2697c2fbfb3SApril Chin		["c d"]=(
2707c2fbfb3SApril Chin			integer at=90
2717c2fbfb3SApril Chin		)
2727c2fbfb3SApril Chin		[e]=(
27334f9b3eeSRoland Mainz			compound nested_cpv=(
2747c2fbfb3SApril Chin				typeset -a myarray=( 1 2 3 4 5 6 7 8 9 10 )
2757c2fbfb3SApril Chin				typeset str=$'a \'string'
2767c2fbfb3SApril Chin			)
2777c2fbfb3SApril Chin		)
2787c2fbfb3SApril Chin		[f]=(
2797c2fbfb3SApril Chin			typeset g="f"
2807c2fbfb3SApril Chin		)
28134f9b3eeSRoland Mainz		[a_nan]=(
28234f9b3eeSRoland Mainz			float my_nan=-nan
28334f9b3eeSRoland Mainz		)
28434f9b3eeSRoland Mainz		[a_hexfloat]=(
28534f9b3eeSRoland Mainz		       typeset -X my_hexfloat=1.1
28634f9b3eeSRoland Mainz		)
2877c2fbfb3SApril Chin	)
2887c2fbfb3SApril Chin)
2897c2fbfb3SApril Chin
29034f9b3eeSRoland Mainzcompound x_copy=x || err_exit "x_copy copy failed"
2917c2fbfb3SApril Chin[[ "${x_copy}" != "" ]] || err_exit "x_copy should not be empty"
2927c2fbfb3SApril Chincount_brackets "${x_copy}" || err_exit "x_copy: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
29334f9b3eeSRoland Mainzcount_brackets "$(print -v x_copy)" || err_exit "x_copy: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
29434f9b3eeSRoland Mainzcount_brackets "$(print -C x_copy)" || err_exit "x_copy: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
2957c2fbfb3SApril Chin
29634f9b3eeSRoland Mainzcompound nested_cpv_copy
2977c2fbfb3SApril Chin
2987c2fbfb3SApril Chinnested_cpv_copy=x.myarray3[e].nested_cpv || err_exit "x.myarray3[e].nested_cpv copy failed"
29934f9b3eeSRoland Mainz(( ${#nested_cpv_copy.myarray[@]} == 10 )) || err_exit "Expected 10 elements in nested_cpv_copy.myarray, got ${#nested_cpv_copy.myarray[@]}"
3007c2fbfb3SApril Chin
3017c2fbfb3SApril Chin# unset branch "x.myarray3[e].nested_cpv" of the variable tree "x" ...
3027c2fbfb3SApril Chinunset x.myarray3[e].nested_cpv || err_exit "unset x.myarray3[e].nested_cpv failed"
3037c2fbfb3SApril Chin[[ "${x.myarray3[e].nested_cpv}" == "" ]] || err_exit "x.myarray3[e].nested_cpv still has a value"
3047c2fbfb3SApril Chin
3057c2fbfb3SApril Chin# ... and restore it from the saved copy
30634f9b3eeSRoland Mainzprintf "%B\n" nested_cpv_copy | cpvcat1 | cpvcat2 | cpvcat3 | cpvcat4 | read -C x.myarray3[e].nested_cpv || err_exit "read failed"
3077c2fbfb3SApril Chin
3087c2fbfb3SApril Chin# compare copy of the original tree and the modified one
3097c2fbfb3SApril Chin[[ "${x}" == "${x_copy}" ]] || err_exit "x != x_copy"
3107c2fbfb3SApril Chincount_brackets "${x}" || err_exit "x: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
31134f9b3eeSRoland Mainzcount_brackets "$(print -v x)" || err_exit "x: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
31234f9b3eeSRoland Mainzcount_brackets "$(print -C x)" || err_exit "x: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}"
31334f9b3eeSRoland Mainz(( ${#x.myarray3[e].nested_cpv.myarray[@]} == 10 )) || err_exit "Expected 10 elements in x.myarray3[e].nested_cpv, got ${#x.myarray3[e].nested_cpv[@]}"
31434f9b3eeSRoland Mainz(( isnan(x.myarray3[a_nan].my_nan) ))   || err_exit "x.myarray3[a_nan].my_nan not a NaN"
31534f9b3eeSRoland Mainz(( signbit(x.myarray3[a_nan].my_nan) )) || err_exit "x.myarray3[a_nan].my_nan not negative"
3167c2fbfb3SApril Chin
3177c2fbfb3SApril Chin# cleanup
3187c2fbfb3SApril Chinunset x x_copy nested_cpv_copy || err_exit "unset failed"
3197c2fbfb3SApril Chin
3207c2fbfb3SApril Chin
3217c2fbfb3SApril Chin# Test 4: Test "read -C" failure for missing bracket at the end
3227c2fbfb3SApril Chintypeset s
32334f9b3eeSRoland Mainzs=$($SHELL -c 'compound myvar ; print "( unfinished=1" | read -C myvar 2>/dev/null || print "error $?"') || err_exit "shell failed"
3247c2fbfb3SApril Chin[[ "$s" == "error 3" ]] || err_exit "compound_read: expected error 3, got ${s}"
3257c2fbfb3SApril Chin
3267c2fbfb3SApril Chin
3277c2fbfb3SApril Chin# Test 5: Test "read -C" failure for missing bracket at the beginning
3287c2fbfb3SApril Chintypeset s
32934f9b3eeSRoland Mainzs=$($SHELL -c 'compound myvar ; print "  unfinished=1 )" | read -C myvar 2>/dev/null || print "error $?"') || err_exit "shell failed"
3307c2fbfb3SApril Chin[[ "$s" == "error 3" ]] || err_exit "compound_read: expected error 3, got ${s}"
3317c2fbfb3SApril Chin
33234f9b3eeSRoland Mainz
3337c2fbfb3SApril Chin# tests done
3347c2fbfb3SApril Chinexit $((Errors))
335