18462SApril.Chin@Sun.COM#
28462SApril.Chin@Sun.COM# CDDL HEADER START
38462SApril.Chin@Sun.COM#
48462SApril.Chin@Sun.COM# The contents of this file are subject to the terms of the
58462SApril.Chin@Sun.COM# Common Development and Distribution License (the "License").
68462SApril.Chin@Sun.COM# You may not use this file except in compliance with the License.
78462SApril.Chin@Sun.COM#
88462SApril.Chin@Sun.COM# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
98462SApril.Chin@Sun.COM# or http://www.opensolaris.org/os/licensing.
108462SApril.Chin@Sun.COM# See the License for the specific language governing permissions
118462SApril.Chin@Sun.COM# and limitations under the License.
128462SApril.Chin@Sun.COM#
138462SApril.Chin@Sun.COM# When distributing Covered Code, include this CDDL HEADER in each
148462SApril.Chin@Sun.COM# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
158462SApril.Chin@Sun.COM# If applicable, add the following below this CDDL HEADER, with the
168462SApril.Chin@Sun.COM# fields enclosed by brackets "[]" replaced with your own identifying
178462SApril.Chin@Sun.COM# information: Portions Copyright [yyyy] [name of copyright owner]
188462SApril.Chin@Sun.COM#
198462SApril.Chin@Sun.COM# CDDL HEADER END
208462SApril.Chin@Sun.COM#
218462SApril.Chin@Sun.COM
228462SApril.Chin@Sun.COM#
23*12068SRoger.Faulkner@Oracle.COM# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
248462SApril.Chin@Sun.COM#
258462SApril.Chin@Sun.COM
268462SApril.Chin@Sun.COM#
278462SApril.Chin@Sun.COM# variable tree test #002
288462SApril.Chin@Sun.COM# Propose of this test is whether ksh93 handles global variable trees
298462SApril.Chin@Sun.COM# and function-local variable trees the same way, including "nameref"
308462SApril.Chin@Sun.COM# and "unset" handling.
318462SApril.Chin@Sun.COM#
328462SApril.Chin@Sun.COM
3310898Sroland.mainz@nrubsig.org# test setup
348462SApril.Chin@Sun.COMfunction err_exit
358462SApril.Chin@Sun.COM{
368462SApril.Chin@Sun.COM	print -u2 -n "\t"
378462SApril.Chin@Sun.COM	print -u2 -r ${Command}[$1]: "${@:2}"
38*12068SRoger.Faulkner@Oracle.COM	(( Errors < 127 && Errors++ ))
398462SApril.Chin@Sun.COM}
408462SApril.Chin@Sun.COMalias err_exit='err_exit $LINENO'
418462SApril.Chin@Sun.COM
4210898Sroland.mainz@nrubsig.org# the test cannot use "nounset"
4310898Sroland.mainz@nrubsig.orgCommand=${0##*/}
448462SApril.Chin@Sun.COMinteger Errors=0
458462SApril.Chin@Sun.COM
468462SApril.Chin@Sun.COM# "built_tree1" and "built_tree2" are identical except the way how they test
478462SApril.Chin@Sun.COM# whether a variable exists:
488462SApril.Chin@Sun.COM# - "built_tree1" uses "${varname}" != "", e.g. looking whether the variable
498462SApril.Chin@Sun.COM#    as non-zero length content
5010898Sroland.mainz@nrubsig.org# - "built_tree2" uses "! ([[ -v varname ]] ; res=$? ; unset varname ; exit $res)", e.g. "unset" in a subshell.
518462SApril.Chin@Sun.COMfunction build_tree1
528462SApril.Chin@Sun.COM{
538462SApril.Chin@Sun.COM#set -o errexit -o xtrace
548462SApril.Chin@Sun.COM	typeset index
558462SApril.Chin@Sun.COM	typeset s
568462SApril.Chin@Sun.COM	typeset i
578462SApril.Chin@Sun.COM	typeset dummy
588462SApril.Chin@Sun.COM	typeset a b c d e f
598462SApril.Chin@Sun.COM
608462SApril.Chin@Sun.COM	nameref dest_tree="$1" # destination tree
618462SApril.Chin@Sun.COM	nameref srcdata="$2"   # source data
628462SApril.Chin@Sun.COM	typeset tree_mode="$3" # mode to define the type of leads
638462SApril.Chin@Sun.COM
648462SApril.Chin@Sun.COM	typeset -A dest_tree.l1
658462SApril.Chin@Sun.COM
668462SApril.Chin@Sun.COM	for index in "${!srcdata.hashnodes[@]}" ; do
678462SApril.Chin@Sun.COM		nameref node=srcdata.hashnodes["${index}"]
688462SApril.Chin@Sun.COM
698462SApril.Chin@Sun.COM		for i in "${node.xlfd[@]}" ; do
708462SApril.Chin@Sun.COM			IFS='-' read dummy a b c d e f <<<"$i"
718462SApril.Chin@Sun.COM
728462SApril.Chin@Sun.COM			if [[ "$a" == "" ]] ; then
738462SApril.Chin@Sun.COM				a="$dummy"
748462SApril.Chin@Sun.COM			fi
758462SApril.Chin@Sun.COM
768462SApril.Chin@Sun.COM			[[ "$a" == "" ]] && a='-'
778462SApril.Chin@Sun.COM			[[ "$b" == "" ]] && b='-'
788462SApril.Chin@Sun.COM			[[ "$c" == "" ]] && c='-'
798462SApril.Chin@Sun.COM
808462SApril.Chin@Sun.COM			if [[ "${dest_tree.l1["$a"]}" == "" ]] ; then
818462SApril.Chin@Sun.COM			#if ! (unset dest_tree.l1["$a"]) ; then
828462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2
838462SApril.Chin@Sun.COM			fi
848462SApril.Chin@Sun.COM
858462SApril.Chin@Sun.COM			if [[ "${dest_tree.l1["$a"].l2["$b"]}" == "" ]] ; then
868462SApril.Chin@Sun.COM			#if ! (unset dest_tree.l1["$a"].l2["$b"]) ; then
878462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2["$b"].l3
888462SApril.Chin@Sun.COM			fi
898462SApril.Chin@Sun.COM
908462SApril.Chin@Sun.COM			if [[ "${!dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[*]}" == "" ]] ; then
918462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2["$b"].l3["$c"].entries
928462SApril.Chin@Sun.COM			fi
938462SApril.Chin@Sun.COM
948462SApril.Chin@Sun.COM			typeset new_index
958462SApril.Chin@Sun.COM			if [[ "${tree_mode}" == "leaf_name" ]] ; then
968462SApril.Chin@Sun.COM				new_index=$(( ${#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[@]}+1 ))
978462SApril.Chin@Sun.COM			else
988462SApril.Chin@Sun.COM				new_index="${node.name}"
998462SApril.Chin@Sun.COM
1008462SApril.Chin@Sun.COM				# skip if the leaf node already exists
1018462SApril.Chin@Sun.COM				if [[ "${dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}]}" != "" ]] ; then
1028462SApril.Chin@Sun.COM					continue
1038462SApril.Chin@Sun.COM				fi
1048462SApril.Chin@Sun.COM			fi
1058462SApril.Chin@Sun.COM
1068462SApril.Chin@Sun.COM			add_tree_leaf dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}] "${index}" "${tree_mode}"
1078462SApril.Chin@Sun.COM		done
1088462SApril.Chin@Sun.COM	done
1098462SApril.Chin@Sun.COM
1108462SApril.Chin@Sun.COM	return 0
1118462SApril.Chin@Sun.COM}
1128462SApril.Chin@Sun.COM
1138462SApril.Chin@Sun.COM# "built_tree1" and "built_tree2" are identical except the way how they test
1148462SApril.Chin@Sun.COM# whether a variable exists:
1158462SApril.Chin@Sun.COM# - "built_tree1" uses "${varname}" != "", e.g. looking whether the variable
1168462SApril.Chin@Sun.COM#    as non-zero length content
11710898Sroland.mainz@nrubsig.org# - "built_tree2" uses "! ([[ -v varname ]] ; res=$? ; unset varname ; exit $res)", e.g. "unset" in a subshell.
1188462SApril.Chin@Sun.COMfunction build_tree2
1198462SApril.Chin@Sun.COM{
1208462SApril.Chin@Sun.COM#set -o errexit -o xtrace
1218462SApril.Chin@Sun.COM	typeset index
1228462SApril.Chin@Sun.COM	typeset s
1238462SApril.Chin@Sun.COM	typeset i
1248462SApril.Chin@Sun.COM	typeset dummy
1258462SApril.Chin@Sun.COM	typeset a b c d e f
1268462SApril.Chin@Sun.COM
1278462SApril.Chin@Sun.COM	nameref dest_tree="$1" # destination tree
1288462SApril.Chin@Sun.COM	nameref srcdata="$2"   # source data
1298462SApril.Chin@Sun.COM	typeset tree_mode="$3" # mode to define the type of leads
1308462SApril.Chin@Sun.COM
1318462SApril.Chin@Sun.COM	typeset -A dest_tree.l1
1328462SApril.Chin@Sun.COM
1338462SApril.Chin@Sun.COM	for index in "${!srcdata.hashnodes[@]}" ; do
1348462SApril.Chin@Sun.COM		nameref node=srcdata.hashnodes["${index}"]
1358462SApril.Chin@Sun.COM
1368462SApril.Chin@Sun.COM		for i in "${node.xlfd[@]}" ; do
1378462SApril.Chin@Sun.COM			IFS='-' read dummy a b c d e f <<<"$i"
1388462SApril.Chin@Sun.COM
1398462SApril.Chin@Sun.COM			if [[ "$a" == "" ]] ; then
1408462SApril.Chin@Sun.COM				a="$dummy"
1418462SApril.Chin@Sun.COM			fi
1428462SApril.Chin@Sun.COM
1438462SApril.Chin@Sun.COM			[[ "$a" == "" ]] && a='-'
1448462SApril.Chin@Sun.COM			[[ "$b" == "" ]] && b='-'
1458462SApril.Chin@Sun.COM			[[ "$c" == "" ]] && c='-'
1468462SApril.Chin@Sun.COM
1478462SApril.Chin@Sun.COM			#if [[ "${dest_tree.l1["$a"]}" == "" ]] ; then
14810898Sroland.mainz@nrubsig.org			if ! ([[ -v dest_tree.l1["$a"] ]] ; res=$? ; unset dest_tree.l1["$a"] ; exit $res) ; then
1498462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2
1508462SApril.Chin@Sun.COM			fi
1518462SApril.Chin@Sun.COM
1528462SApril.Chin@Sun.COM			#if [[ "${dest_tree.l1["$a"].l2["$b"]}" == "" ]] ; then
15310898Sroland.mainz@nrubsig.org			if ! ([[ -v dest_tree.l1["$a"].l2["$b"] ]] ; res=$? ; unset dest_tree.l1["$a"].l2["$b"] ; exit $res) ; then
1548462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2["$b"].l3
1558462SApril.Chin@Sun.COM			fi
1568462SApril.Chin@Sun.COM
1578462SApril.Chin@Sun.COM			if [[ "${!dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[*]}" == "" ]] ; then
1588462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2["$b"].l3["$c"].entries
1598462SApril.Chin@Sun.COM			fi
1608462SApril.Chin@Sun.COM
1618462SApril.Chin@Sun.COM			typeset new_index
1628462SApril.Chin@Sun.COM			if [[ "${tree_mode}" == "leaf_name" ]] ; then
1638462SApril.Chin@Sun.COM				new_index=$(( ${#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[@]}+1 ))
1648462SApril.Chin@Sun.COM			else
1658462SApril.Chin@Sun.COM				new_index="${node.name}"
1668462SApril.Chin@Sun.COM
1678462SApril.Chin@Sun.COM				# skip if the leaf node already exists
1688462SApril.Chin@Sun.COM				if [[ "${dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}]}" != "" ]] ; then
1698462SApril.Chin@Sun.COM					continue
1708462SApril.Chin@Sun.COM				fi
1718462SApril.Chin@Sun.COM			fi
1728462SApril.Chin@Sun.COM
1738462SApril.Chin@Sun.COM			add_tree_leaf dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}] "${index}" "${tree_mode}"
1748462SApril.Chin@Sun.COM		done
1758462SApril.Chin@Sun.COM	done
1768462SApril.Chin@Sun.COM
1778462SApril.Chin@Sun.COM	return 0
1788462SApril.Chin@Sun.COM}
1798462SApril.Chin@Sun.COM
1808462SApril.Chin@Sun.COM
1818462SApril.Chin@Sun.COMfunction add_tree_leaf
1828462SApril.Chin@Sun.COM{
1838462SApril.Chin@Sun.COM	nameref tree_leafnode="$1"
1848462SApril.Chin@Sun.COM	nameref data_node=srcdata.hashnodes["$2"]
1858462SApril.Chin@Sun.COM	typeset add_mode="$3"
1868462SApril.Chin@Sun.COM
1878462SApril.Chin@Sun.COM	case "${add_mode}" in
1888462SApril.Chin@Sun.COM		"leaf_name")
1898462SApril.Chin@Sun.COM			tree_leafnode="${data_node.name}"
1908462SApril.Chin@Sun.COM			return 0
1918462SApril.Chin@Sun.COM			;;
1928462SApril.Chin@Sun.COM		"leaf_compound")
1938462SApril.Chin@Sun.COM			tree_leafnode=(
1948462SApril.Chin@Sun.COM				typeset name="${data_node.name}"
1958462SApril.Chin@Sun.COM				typeset -a filenames=( "${data_node.filenames[@]}" )
1968462SApril.Chin@Sun.COM				typeset -a comments=( "${data_node.comments[@]}" )
1978462SApril.Chin@Sun.COM				typeset -a xlfd=( "${data_node.xlfd[@]}" )
1988462SApril.Chin@Sun.COM			)
1998462SApril.Chin@Sun.COM			return 0
2008462SApril.Chin@Sun.COM			;;
2018462SApril.Chin@Sun.COM		*)
2028462SApril.Chin@Sun.COM			print -u2 -f "ERROR: Unknown mode %s in add_tree_leaf\n" "${add_mode}"
2038462SApril.Chin@Sun.COM			return 1
2048462SApril.Chin@Sun.COM			;;
2058462SApril.Chin@Sun.COM	esac
2068462SApril.Chin@Sun.COM
2078462SApril.Chin@Sun.COM	# not reached
2088462SApril.Chin@Sun.COM	return 1
2098462SApril.Chin@Sun.COM}
2108462SApril.Chin@Sun.COM
2118462SApril.Chin@Sun.COM# "mysrcdata_local" and "mysrcdata_global" must be identical
2128462SApril.Chin@Sun.COMtypeset mysrcdata_global=(
2138462SApril.Chin@Sun.COM	typeset -A hashnodes=(
2148462SApril.Chin@Sun.COM		[abcd]=(
2158462SApril.Chin@Sun.COM			name='abcd'
2168462SApril.Chin@Sun.COM			typeset -a xlfd=(
2178462SApril.Chin@Sun.COM				'-urw-itc zapfchancery-medium-i-normal--0-0-0-0-p-0-iso8859-1'
2188462SApril.Chin@Sun.COM				'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific'
2198462SApril.Chin@Sun.COM				'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-sun-fontspecific'
2208462SApril.Chin@Sun.COM			)
2218462SApril.Chin@Sun.COM			typeset -a comments=(
2228462SApril.Chin@Sun.COM				'comment 1'
2238462SApril.Chin@Sun.COM				'comment 2'
2248462SApril.Chin@Sun.COM				'comment 3'
2258462SApril.Chin@Sun.COM			)
2268462SApril.Chin@Sun.COM			typeset -a filenames=(
2278462SApril.Chin@Sun.COM				'/home/foo/abcd_1'
2288462SApril.Chin@Sun.COM				'/home/foo/abcd_2'
2298462SApril.Chin@Sun.COM				'/home/foo/abcd_3'
2308462SApril.Chin@Sun.COM			)
2318462SApril.Chin@Sun.COM		)
2328462SApril.Chin@Sun.COM	)
2338462SApril.Chin@Sun.COM)
2348462SApril.Chin@Sun.COM
2358462SApril.Chin@Sun.COMmytree_global1=()
2368462SApril.Chin@Sun.COMmytree_global2=()
2378462SApril.Chin@Sun.COM
2388462SApril.Chin@Sun.COMfunction main
2398462SApril.Chin@Sun.COM{
2408462SApril.Chin@Sun.COM	# "mysrcdata_local" and "mysrcdata_global" must be identical
2418462SApril.Chin@Sun.COM	typeset mysrcdata_local=(
2428462SApril.Chin@Sun.COM		typeset -A hashnodes=(
2438462SApril.Chin@Sun.COM			[abcd]=(
2448462SApril.Chin@Sun.COM				name='abcd'
2458462SApril.Chin@Sun.COM				typeset -a xlfd=(
2468462SApril.Chin@Sun.COM					'-urw-itc zapfchancery-medium-i-normal--0-0-0-0-p-0-iso8859-1'
2478462SApril.Chin@Sun.COM					'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific'
2488462SApril.Chin@Sun.COM					'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-sun-fontspecific'
2498462SApril.Chin@Sun.COM				)
2508462SApril.Chin@Sun.COM				typeset -a comments=(
2518462SApril.Chin@Sun.COM					'comment 1'
2528462SApril.Chin@Sun.COM					'comment 2'
2538462SApril.Chin@Sun.COM					'comment 3'
2548462SApril.Chin@Sun.COM				)
2558462SApril.Chin@Sun.COM				typeset -a filenames=(
2568462SApril.Chin@Sun.COM					'/home/foo/abcd_1'
2578462SApril.Chin@Sun.COM					'/home/foo/abcd_2'
2588462SApril.Chin@Sun.COM					'/home/foo/abcd_3'
2598462SApril.Chin@Sun.COM				)
2608462SApril.Chin@Sun.COM			)
2618462SApril.Chin@Sun.COM		)
2628462SApril.Chin@Sun.COM	)
2638462SApril.Chin@Sun.COM
2648462SApril.Chin@Sun.COM	#### Build tree using global tree variables
2658462SApril.Chin@Sun.COM	build_tree1 mytree_global1 mysrcdata_global leaf_compound || \
2668462SApril.Chin@Sun.COM		err_exit 'build_tree1 mytree_global1 mysrcdata_global leaf_compound returned an error'
2678462SApril.Chin@Sun.COM	(( $(print -r -- "${mytree_global1}" | wc -l) > 10 )) || err_exit "Compound tree 'mytree_global1' too small."
2688462SApril.Chin@Sun.COM
2698462SApril.Chin@Sun.COM	build_tree2 mytree_global2 mysrcdata_global leaf_compound || \
2708462SApril.Chin@Sun.COM		err_exit 'build_tree2 mytree_global2 mysrcdata_global leaf_compound returned an error'
2718462SApril.Chin@Sun.COM	(( $(print -r -- "${mytree_global2}" | wc -l) > 10 )) || err_exit "Compound tree 'mytree_global2' too small."
2728462SApril.Chin@Sun.COM
2738462SApril.Chin@Sun.COM
2748462SApril.Chin@Sun.COM	#### build tree using local tree variables
2758462SApril.Chin@Sun.COM	mytree_local1=()
2768462SApril.Chin@Sun.COM	mytree_local2=()
2778462SApril.Chin@Sun.COM
2788462SApril.Chin@Sun.COM	build_tree1 mytree_local1 mysrcdata_local leaf_compound || \
2798462SApril.Chin@Sun.COM		err_exit 'build_tree1 mytree_local1 mysrcdata_local leaf_compound returned an error'
2808462SApril.Chin@Sun.COM	(( $(print -r -- "${mytree_local1}" | wc -l) > 10 )) || err_exit "Compound tree 'mytree_local1' too small."
2818462SApril.Chin@Sun.COM
2828462SApril.Chin@Sun.COM	build_tree2 mytree_local2 mysrcdata_local leaf_compound || \
2838462SApril.Chin@Sun.COM		err_exit 'build_tree2 mytree_local2 mysrcdata_local leaf_compound returned an error'
2848462SApril.Chin@Sun.COM	(( $(print -r -- "${mytree_local2}" | wc -l) > 10 )) || err_exit "Compound tree 'mytree_local2' too small."
2858462SApril.Chin@Sun.COM
2868462SApril.Chin@Sun.COM
2878462SApril.Chin@Sun.COM	#### Compare treess
2888462SApril.Chin@Sun.COM	if [[ "${mytree_global1}" != "${mytree_local1}" ]] ; then
2898462SApril.Chin@Sun.COM		err_exit "Compound trees 'mytree_global1' and 'mytree_local1' not identical"
2908462SApril.Chin@Sun.COM		diff -u <( printf "%s\n" "${mytree_global1}" ) <( printf "%s\n" "${mytree_local1}" )
2918462SApril.Chin@Sun.COM	fi
2928462SApril.Chin@Sun.COM
2938462SApril.Chin@Sun.COM	if [[ "${mytree_global1}" != "${mytree_global2}" ]] ; then
2948462SApril.Chin@Sun.COM		err_exit "Compound trees 'mytree_global1' and 'mytree_global2' not identical"
2958462SApril.Chin@Sun.COM		diff -u <( printf "%s\n" "${mytree_global1}" ) <( printf "%s\n" "${mytree_global2}" )
2968462SApril.Chin@Sun.COM	fi
2978462SApril.Chin@Sun.COM
2988462SApril.Chin@Sun.COM	if [[ "${mytree_local1}" != "${mytree_local2}" ]] ; then
2998462SApril.Chin@Sun.COM		err_exit "Compound trees 'mytree_local1' and 'mytree_local2' not identical"
3008462SApril.Chin@Sun.COM		diff -u <( printf "%s\n" "${mytree_local1}" ) <( printf "%s\n" "${mytree_local2}" )
3018462SApril.Chin@Sun.COM	fi
3028462SApril.Chin@Sun.COM
3038462SApril.Chin@Sun.COM
3048462SApril.Chin@Sun.COM	#### test "unset" in a subshell
30510898Sroland.mainz@nrubsig.org	(  [[ -v 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ]] ; res=$? ; unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ; exit $res ) || \
3068462SApril.Chin@Sun.COM		err_exit "Try 1: Variable 'mytree_global1.l1[urw].l2[itc zapfdingbats]' not found."
30710898Sroland.mainz@nrubsig.org	(  [[ -v 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ]] ; res=$? ; unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ; exit $res ) || \
3088462SApril.Chin@Sun.COM		err_exit "Try 2: Variable 'mytree_global1.l1[urw].l2[itc zapfdingbats]' not found."
3098462SApril.Chin@Sun.COM
3108462SApril.Chin@Sun.COM	# remove parent node (array element) and then check whether the child is gone, too:
3118462SApril.Chin@Sun.COM	(
3128462SApril.Chin@Sun.COM		set -o errexit
3138462SApril.Chin@Sun.COM		unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]'
31410898Sroland.mainz@nrubsig.org		! [[ -v 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]]
3158462SApril.Chin@Sun.COM	) || err_exit "Global: Parent node removed (array element), child still exists"
3168462SApril.Chin@Sun.COM	(
3178462SApril.Chin@Sun.COM		set -o errexit
3188462SApril.Chin@Sun.COM		unset 'mytree_local1.l1[urw].l2[itc zapfdingbats]'
31910898Sroland.mainz@nrubsig.org		! [[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]]
3208462SApril.Chin@Sun.COM	) || err_exit "Local: Parent node removed (array element), child still exists"
3218462SApril.Chin@Sun.COM
3228462SApril.Chin@Sun.COM	# remove parent node  (array variable) and then check whether the child is gone, too:
3238462SApril.Chin@Sun.COM	(
3248462SApril.Chin@Sun.COM		set -o errexit
3258462SApril.Chin@Sun.COM		unset 'mytree_local1.l1[urw].l2'
32610898Sroland.mainz@nrubsig.org		! [[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]]
3278462SApril.Chin@Sun.COM	) || err_exit "Global: Parent node removed (array variable), child still exists"
3288462SApril.Chin@Sun.COM	(
3298462SApril.Chin@Sun.COM		set -o errexit
3308462SApril.Chin@Sun.COM		unset 'mytree_local1.l1[urw].l2'
33110898Sroland.mainz@nrubsig.org		! [[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]]
3328462SApril.Chin@Sun.COM	) || err_exit "Local: Parent node removed (array variable), child still exists"
3338462SApril.Chin@Sun.COM
3348462SApril.Chin@Sun.COM
3358462SApril.Chin@Sun.COM	#### test "unset" and compare trees
33610898Sroland.mainz@nrubsig.org	[[ -v 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]] ; res=$?
33710898Sroland.mainz@nrubsig.org	unset 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]'
33810898Sroland.mainz@nrubsig.org	(( res == 0 ))  ||
3398462SApril.Chin@Sun.COM		err_exit "Variable 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' not found."
3408462SApril.Chin@Sun.COM
3418462SApril.Chin@Sun.COM	[[ "${mytree_global1}" != "${mytree_local1}" ]] || err_exit "mytree_global1 and mytree_local1 should differ"
3428462SApril.Chin@Sun.COM
34310898Sroland.mainz@nrubsig.org	[[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]] ; res=$?
34410898Sroland.mainz@nrubsig.org	unset 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]'
34510898Sroland.mainz@nrubsig.org	(( res == 0 ))  ||
3468462SApril.Chin@Sun.COM		err_exit "Variable 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' not found."
3478462SApril.Chin@Sun.COM
3488462SApril.Chin@Sun.COM	# Compare trees (after "unset")
3498462SApril.Chin@Sun.COM	if [[ "${mytree_global1}" != "${mytree_local1}" ]] ; then
3508462SApril.Chin@Sun.COM		err_exit "Compound trees 'mytree_local1' and 'mytree_global1' not identical after unset"
3518462SApril.Chin@Sun.COM		diff -u <( printf "%s\n" "${mytree_global1}" ) <( printf "%s\n" "${mytree_local1}" )
3528462SApril.Chin@Sun.COM	fi
3538462SApril.Chin@Sun.COM}
3548462SApril.Chin@Sun.COM
3558462SApril.Chin@Sun.COMmain
3568462SApril.Chin@Sun.COM
3578462SApril.Chin@Sun.COM# tests done
3588462SApril.Chin@Sun.COMexit $((Errors))
359