17c2fbfb3SApril Chin########################################################################
27c2fbfb3SApril Chin#                                                                      #
37c2fbfb3SApril Chin#               This software is part of the ast package               #
4*b30d1939SAndy Fiddaman#          Copyright (c) 1982-2012 AT&T Intellectual Property          #
57c2fbfb3SApril Chin#                      and is licensed under the                       #
6*b30d1939SAndy Fiddaman#                 Eclipse Public License, Version 1.0                  #
77c2fbfb3SApril Chin#                    by AT&T Intellectual Property                     #
87c2fbfb3SApril Chin#                                                                      #
97c2fbfb3SApril Chin#                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)         #
127c2fbfb3SApril Chin#                                                                      #
137c2fbfb3SApril Chin#              Information and Software Systems Research               #
147c2fbfb3SApril Chin#                            AT&T Research                             #
157c2fbfb3SApril Chin#                           Florham Park NJ                            #
167c2fbfb3SApril Chin#                                                                      #
177c2fbfb3SApril Chin#                  David Korn <dgk@research.att.com>                   #
187c2fbfb3SApril Chin#                                                                      #
197c2fbfb3SApril Chin########################################################################
207c2fbfb3SApril Chinfunction err_exit
217c2fbfb3SApril Chin{
227c2fbfb3SApril Chin	print -u2 -n "\t"
237c2fbfb3SApril Chin	print -u2 -r ${Command}[$1]: "${@:2}"
247c2fbfb3SApril Chin	(( Errors+=1 ))
257c2fbfb3SApril Chin}
267c2fbfb3SApril Chinalias err_exit='err_exit $LINENO'
277c2fbfb3SApril Chin
287c2fbfb3SApril ChinCommand=${0##*/}
297c2fbfb3SApril Chininteger Errors=0
3034f9b3eeSRoland Mainz
3134f9b3eeSRoland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
3234f9b3eeSRoland Mainztrap "cd /; rm -rf $tmp" EXIT
3334f9b3eeSRoland Mainz
347c2fbfb3SApril Chininteger n=2
357c2fbfb3SApril Chin
367c2fbfb3SApril Chintypeset -T Type_t=(
377c2fbfb3SApril Chin	typeset name=foobar
387c2fbfb3SApril Chin	typeset x=(hi=ok bar=yes)
397c2fbfb3SApril Chin	typeset y=(xa=xx xq=89)
407c2fbfb3SApril Chin	typeset -A aa=([one]=abc [two]=def)
417c2fbfb3SApril Chin	typeset -a ia=(abc def)
427c2fbfb3SApril Chin	typeset -i z=5
437c2fbfb3SApril Chin)
447c2fbfb3SApril Chinfor ((i=0; i < 10; i++))
457c2fbfb3SApril Chindo
467c2fbfb3SApril Chin	Type_t r s
477c2fbfb3SApril Chin	[[ $r == "$s" ]] || err_exit 'r is not equal to s'
487c2fbfb3SApril Chin	typeset -C x=r.x
497c2fbfb3SApril Chin	y=(xa=bb xq=cc)
507c2fbfb3SApril Chin	y2=xyz
517c2fbfb3SApril Chin	z2=xyz
527c2fbfb3SApril Chin	typeset -C z=y
537c2fbfb3SApril Chin	[[ $y == "$z" ]] || err_exit 'y is not equal to z'
547c2fbfb3SApril Chin	typeset -C s.y=z
557c2fbfb3SApril Chin	[[ $y == "${s.y}" ]] || err_exit 'y is not equal to s.y'
567c2fbfb3SApril Chin	.sh.q=$y
577c2fbfb3SApril Chin	typeset -C www=.sh.q
587c2fbfb3SApril Chin	[[ $www == "$z" ]] || err_exit 'www is not equal to z'
597c2fbfb3SApril Chin	typeset -C s.x=r.x
607c2fbfb3SApril Chin	[[ ${s.x} == "${r.x}" ]] || err_exit 's.x is not equal to r.x'
617c2fbfb3SApril Chin
627c2fbfb3SApril Chin	function foo
637c2fbfb3SApril Chin	{
647c2fbfb3SApril Chin		nameref x=$1 y=$2
657c2fbfb3SApril Chin		typeset z=$x
667c2fbfb3SApril Chin		y=$x
677c2fbfb3SApril Chin		[[ $x == "$y" ]] || err_exit "x is not equal to y with ${!x}"
687c2fbfb3SApril Chin	}
697c2fbfb3SApril Chin	foo r.y y
707c2fbfb3SApril Chin	[[ $y == "${r.y}" ]] || err_exit 'y is not equal to r.y'
717c2fbfb3SApril Chin	typeset -C y=z
727c2fbfb3SApril Chin	foo y r.y
737c2fbfb3SApril Chin	[[ $y == "${r.y}" ]] || err_exit 'y is not equal to r.y again'
747c2fbfb3SApril Chin	typeset -C y=z
757c2fbfb3SApril Chin	(
767c2fbfb3SApril Chin		q=${z}
777c2fbfb3SApril Chin		[[ $q == "$z" ]] || err_exit 'q is not equal to z'
787c2fbfb3SApril Chin		z=abc
797c2fbfb3SApril Chin	)
807c2fbfb3SApril Chin	[[ $z == "$y" ]] || err_exit 'value of z not preserved after subshell'
817c2fbfb3SApril Chin	unset z y r s x z2 y2 www .sh.q
827c2fbfb3SApril Chindone
837c2fbfb3SApril Chintypeset -T Frame_t=( typeset file lineno )
847c2fbfb3SApril ChinFrame_t frame
85*b30d1939SAndy Fiddaman[[ $(typeset -p frame) == 'Frame_t frame=(typeset file;typeset lineno)' ]] || err_exit 'empty fields in type not displayed'
867c2fbfb3SApril Chinx=( typeset -a arr=([2]=abc [4]=(x=1 y=def));zz=abc)
877c2fbfb3SApril Chintypeset -C y=x
887c2fbfb3SApril Chin[[ "$x" == "$y" ]] || print -u2 'y is not equal to x'
897c2fbfb3SApril ChinType_t z=(y=(xa=bb xq=cc))
907c2fbfb3SApril Chintypeset -A arr=([foo]=one [bar]=2)
917c2fbfb3SApril Chintypeset -A brr=([foo]=one [bar]=2)
927c2fbfb3SApril Chin[[ "${arr[@]}" == "${brr[@]}" ]] || err_exit 'arr is not brr'
937c2fbfb3SApril Chinfor ((i=0; i < 1; i++))
947c2fbfb3SApril Chindo	typeset -m zzz=x
957c2fbfb3SApril Chin	[[ $zzz == "$y" ]] || err_exit 'zzz is not equal to y'
967c2fbfb3SApril Chin	typeset -m x=zzz
977c2fbfb3SApril Chin	[[ $x == "$y" ]] || err_exit 'x is not equal to y'
987c2fbfb3SApril Chin	Type_t t=(y=(xa=bb xq=cc))
997c2fbfb3SApril Chin	typeset -m r=t
1007c2fbfb3SApril Chin	[[ $r == "$z" ]] || err_exit 'r is not equal to z'
1017c2fbfb3SApril Chin	typeset -m t=r
1027c2fbfb3SApril Chin	[[ $t == "$z" ]] || err_exit 't is not equal to z'
1037c2fbfb3SApril Chin	typeset -m crr=arr
1047c2fbfb3SApril Chin	[[ "${crr[@]}" == "${brr[@]}" ]] || err_exit 'crr is not brr'
1057c2fbfb3SApril Chin	typeset -m arr=crr
1067c2fbfb3SApril Chin	[[ "${arr[@]}" == "${brr[@]}" ]] || err_exit 'brr is not arr'
1077c2fbfb3SApril Chindone
1087c2fbfb3SApril Chintypeset -m brr[foo]=brr[bar]
1097c2fbfb3SApril Chin[[ ${brr[foo]} == 2 ]] || err_exit 'move an associative array element fails'
1107c2fbfb3SApril Chin[[ ${brr[bar]} ]] && err_exit 'brr[bar] should be unset after move'
1117c2fbfb3SApril Chinunset x y zzz
1127c2fbfb3SApril Chinx=(a b c)
1137c2fbfb3SApril Chintypeset -m x[1]=x[2]
1147c2fbfb3SApril Chin[[ ${x[1]} == c ]] || err_exit 'move an indexed array element fails'
1157c2fbfb3SApril Chin[[ ${x[2]} ]] && err_exit 'x[2] should be unset after move'
11634f9b3eeSRoland Mainzcat > $tmp/types <<- \+++
1177c2fbfb3SApril Chin	typeset -T Pt_t=(float x=1. y=0.)
1187c2fbfb3SApril Chin	Pt_t p=(y=2)
1197c2fbfb3SApril Chin	print -r -- ${p.y}
1207c2fbfb3SApril Chin+++
1217c2fbfb3SApril Chinexpected=2
12234f9b3eeSRoland Mainzgot=$(. $tmp/types) 2>/dev/null
1237c2fbfb3SApril Chin[[ "$got" == "$expected" ]] || err_exit "typedefs in dot script failed -- expected '$expected', got '$got'"
1247c2fbfb3SApril Chintypeset -T X_t=(
1257c2fbfb3SApril Chin	typeset x=foo y=bar
1267c2fbfb3SApril Chin	typeset s=${_.x}
1277c2fbfb3SApril Chin	create()
1287c2fbfb3SApril Chin	{
1297c2fbfb3SApril Chin		_.y=bam
1307c2fbfb3SApril Chin	}
1317c2fbfb3SApril Chin)
1327c2fbfb3SApril ChinX_t x
1337c2fbfb3SApril Chin[[ ${x.x} == foo ]] || err_exit 'x.x should be foo'
1347c2fbfb3SApril Chin[[ ${x.y} == bam ]] || err_exit 'x.y should be bam'
1357c2fbfb3SApril Chin[[ ${x.s} == ${x.x} ]] || err_exit 'x.s should be x.x'
1367c2fbfb3SApril Chintypeset -T Y_t=( X_t r )
1377c2fbfb3SApril ChinY_t z
1387c2fbfb3SApril Chin[[ ${z.r.x} == foo ]] || err_exit 'z.r.x should be foo'
1397c2fbfb3SApril Chin[[ ${z.r.y} == bam ]] || err_exit 'z.r.y should be bam'
1407c2fbfb3SApril Chin[[ ${z.r.s} == ${z.r.x} ]] || err_exit 'z.r.s should be z.r.x'
1417c2fbfb3SApril Chin
1427c2fbfb3SApril Chinunset xx yy
1437c2fbfb3SApril Chintypeset -T xx=(typeset yy=zz)
1447c2fbfb3SApril Chinxx=yy
1457c2fbfb3SApril Chin{ typeset -T xx=(typeset yy=zz) ;} 2>/dev/null && err_exit 'type redefinition should fail'
1467c2fbfb3SApril Chin$SHELL 2> /dev/null <<- +++ || err_exit 'typedef with only f(){} fails'
1477c2fbfb3SApril Chin	typeset -T X_t=(
1487c2fbfb3SApril Chin		f()
1497c2fbfb3SApril Chin		{
1507c2fbfb3SApril Chin			print ok
1517c2fbfb3SApril Chin		}
1527c2fbfb3SApril Chin	)
1537c2fbfb3SApril Chin+++
1547c2fbfb3SApril Chin$SHELL 2> /dev/null <<- +++ || err_exit 'unable to redefine f discipline function'
1557c2fbfb3SApril Chin	typeset -T X_t=(
1567c2fbfb3SApril Chin		x=1
1577c2fbfb3SApril Chin		f()
1587c2fbfb3SApril Chin		{
1597c2fbfb3SApril Chin			print ok
1607c2fbfb3SApril Chin		}
1617c2fbfb3SApril Chin	)
1627c2fbfb3SApril Chin	X_t z=(
1637c2fbfb3SApril Chin		function f
1647c2fbfb3SApril Chin		{
1657c2fbfb3SApril Chin			print override f
1667c2fbfb3SApril Chin		}
1677c2fbfb3SApril Chin	)
1687c2fbfb3SApril Chin+++
1697c2fbfb3SApril Chin$SHELL 2> /dev/null <<- +++ && err_exit 'invalid discipline name should be an error'
1707c2fbfb3SApril Chin	typeset -T X_t=(
1717c2fbfb3SApril Chin		x=1
1727c2fbfb3SApril Chin		f()
1737c2fbfb3SApril Chin		{
1747c2fbfb3SApril Chin			print ok
1757c2fbfb3SApril Chin		}
1767c2fbfb3SApril Chin	)
1777c2fbfb3SApril Chin	X_t z=(
1787c2fbfb3SApril Chin		function g
1797c2fbfb3SApril Chin		{
1807c2fbfb3SApril Chin			print override f
1817c2fbfb3SApril Chin		}
1827c2fbfb3SApril Chin	)
1837c2fbfb3SApril Chin+++
1847c2fbfb3SApril Chin# compound variables containing type variables
1857c2fbfb3SApril ChinType_t r
1867c2fbfb3SApril Chinvar=(
1877c2fbfb3SApril Chin	typeset x=foobar
1887c2fbfb3SApril Chin	Type_t	r
1897c2fbfb3SApril Chin	integer z=5
1907c2fbfb3SApril Chin)
1917c2fbfb3SApril Chin[[ ${var.r} == "$r" ]] || err_exit 'var.r != r'
1927c2fbfb3SApril Chin(( var.z == 5)) || err_exit 'var.z !=5'
1937c2fbfb3SApril Chin[[ "$var" == *x=foobar* ]] || err_exit '$var does not contain x=foobar'
1947c2fbfb3SApril Chin
1957c2fbfb3SApril Chintypeset -T A_t=(
1967c2fbfb3SApril Chin	typeset x=aha
1977c2fbfb3SApril Chin	typeset b=${_.x}
1987c2fbfb3SApril Chin)
1997c2fbfb3SApril Chinunset x
2007c2fbfb3SApril ChinA_t x
2017c2fbfb3SApril Chinexpected=aha
2027c2fbfb3SApril Chingot=${x.b}
2037c2fbfb3SApril Chin[[ "$got" == "$expected" ]] || err_exit "type '_' reference failed -- expected '$expected', got '$got'"
2047c2fbfb3SApril Chin
2057c2fbfb3SApril Chintypeset -T Tst_t=(
2067c2fbfb3SApril Chin	 function f
2077c2fbfb3SApril Chin	 {
2087c2fbfb3SApril Chin	 	A_t a
2097c2fbfb3SApril Chin	 	print ${ _.g ${a.x}; }
2107c2fbfb3SApril Chin	 }
2117c2fbfb3SApril Chin	 function g
2127c2fbfb3SApril Chin	 {
2137c2fbfb3SApril Chin	 	print foo
2147c2fbfb3SApril Chin	 }
2157c2fbfb3SApril Chin)
2167c2fbfb3SApril ChinTst_t tst
2177c2fbfb3SApril Chinexpected=foo
2187c2fbfb3SApril Chingot=${ tst.f;}
2197c2fbfb3SApril Chin[[ "$got" == "$expected" ]] || err_exit "_.g where g is a function in type discipline method failed -- expected '$expected', got '$got'"
2207c2fbfb3SApril Chin
2217c2fbfb3SApril Chintypeset -T B_t=(
2227c2fbfb3SApril Chin	integer -a arr
2237c2fbfb3SApril Chin	function f
2247c2fbfb3SApril Chin	{
2257c2fbfb3SApril Chin		(( _.arr[0] = 0 ))
2267c2fbfb3SApril Chin		(( _.arr[1] = 1 ))
2277c2fbfb3SApril Chin		print ${_.arr[*]}
2287c2fbfb3SApril Chin	}
2297c2fbfb3SApril Chin)
2307c2fbfb3SApril Chinunset x
2317c2fbfb3SApril ChinB_t x
2327c2fbfb3SApril Chinexpected='0 1'
2337c2fbfb3SApril Chingot=${ x.f;}
2347c2fbfb3SApril Chin[[ "$got" == "$expected" ]] || err_exit "array assignment of subscripts in type discipline arithmetic failed -- expected '$expected', got '$got'"
2357c2fbfb3SApril Chin
2367c2fbfb3SApril Chintypeset -T Fileinfo_t=(
2377c2fbfb3SApril Chin	size=-1
2387c2fbfb3SApril Chin	typeset -a text=()
2397c2fbfb3SApril Chin	integer mtime=-1
2407c2fbfb3SApril Chin)
2417c2fbfb3SApril ChinFileinfo_t -A _Dbg_filenames
2427c2fbfb3SApril ChinFileinfo_t finfo
2437c2fbfb3SApril Chinfunction bar
2447c2fbfb3SApril Chin{
2457c2fbfb3SApril Chin	finfo.text=(line1 line2 line3)
2467c2fbfb3SApril Chin	finfo.size=${#finfo.text[@]}
2477c2fbfb3SApril Chin	_Dbg_filenames[foo]=finfo
2487c2fbfb3SApril Chin}
2497c2fbfb3SApril Chinbar
2507c2fbfb3SApril Chin
251*b30d1939SAndy Fiddamanexpected='Fileinfo_t -A _Dbg_filenames=([foo]=(size=3;typeset -a text=(line1 line2 line3);typeset -l -i mtime=-1))'
2527c2fbfb3SApril Chingot=$(typeset -p _Dbg_filenames)
2537c2fbfb3SApril Chin[[ "$got" == "$expected" ]] || {
2547c2fbfb3SApril Chin	got=$(printf %q "$got")
255*b30d1939SAndy Fiddaman	err_exit "copy to associative array of types in function failed -- expected '$expected', got $got"
2567c2fbfb3SApril Chin}
2577c2fbfb3SApril Chin
2587c2fbfb3SApril Chin$SHELL > /dev/null  <<- '+++++' || err_exit 'passing _ as nameref arg not working'
2597c2fbfb3SApril Chin	function f1
2607c2fbfb3SApril Chin	{
2617c2fbfb3SApril Chin	 	typeset -n v=$1
2627c2fbfb3SApril Chin	 	print -r -- "$v"
2637c2fbfb3SApril Chin	}
2647c2fbfb3SApril Chin	typeset -T A_t=(
2657c2fbfb3SApril Chin 		typeset blah=xxx
2667c2fbfb3SApril Chin	 	function f { f1 _ ;}
2677c2fbfb3SApril Chin	)
2687c2fbfb3SApril Chin	A_t a
26934f9b3eeSRoland Mainz	[[ ${ a.f ./t1;} == "$a" ]]
2707c2fbfb3SApril Chin+++++
271*b30d1939SAndy Fiddamanexpected='A_t b.a=(name=one)'
27234f9b3eeSRoland Mainz[[ $( $SHELL << \+++
27334f9b3eeSRoland Mainz	typeset -T A_t=(
27434f9b3eeSRoland Mainz	     typeset name=aha
27534f9b3eeSRoland Mainz	)
27634f9b3eeSRoland Mainz	typeset -T B_t=(
27734f9b3eeSRoland Mainz	 	typeset     arr
27834f9b3eeSRoland Mainz	 	A_t         a
27934f9b3eeSRoland Mainz	 	f()
28034f9b3eeSRoland Mainz	 	{
28134f9b3eeSRoland Mainz	 		_.a=(name=one)
28234f9b3eeSRoland Mainz	 		typeset -p _.a
28334f9b3eeSRoland Mainz	 	}
28434f9b3eeSRoland Mainz	)
28534f9b3eeSRoland Mainz	B_t b
28634f9b3eeSRoland Mainz	b.f
28734f9b3eeSRoland Mainz+++
28834f9b3eeSRoland Mainz) ==  "$expected" ]] 2> /dev/null || err_exit  '_.a=(name=one) not expanding correctly'
289*b30d1939SAndy Fiddamanexpected='A_t x=(name=xxx)'
29034f9b3eeSRoland Mainz[[ $( $SHELL << \+++
29134f9b3eeSRoland Mainz	typeset -T A_t=(
29234f9b3eeSRoland Mainz		typeset name
29334f9b3eeSRoland Mainz	)
29434f9b3eeSRoland Mainz	A_t x=(name="xxx")
29534f9b3eeSRoland Mainz	typeset -p x
29634f9b3eeSRoland Mainz+++
29734f9b3eeSRoland Mainz) ==  "$expected" ]] || err_exit  'empty field in definition does not expand correctly'
29834f9b3eeSRoland Mainz
29934f9b3eeSRoland Mainztypeset -T Foo_t=(
30034f9b3eeSRoland Mainz	integer x=3
30134f9b3eeSRoland Mainz	integer y=4
30234f9b3eeSRoland Mainz	len() { print -r -- $(( sqrt(_.x**2 + _.y**2))) ;}
30334f9b3eeSRoland Mainz)
30434f9b3eeSRoland MainzFoo_t foo
30534f9b3eeSRoland Mainz[[ ${foo.len} == 5 ]] || err_exit "discipline function len not working"
30634f9b3eeSRoland Mainz
30734f9b3eeSRoland Mainztypeset -T benchmark_t=(
30834f9b3eeSRoland Mainz	integer num_iterations
30934f9b3eeSRoland Mainz)
31034f9b3eeSRoland Mainzfunction do_benchmarks
31134f9b3eeSRoland Mainz{
31234f9b3eeSRoland Mainz	nameref tst=b
31334f9b3eeSRoland Mainz	integer num_iterations
31434f9b3eeSRoland Mainz	(( num_iterations= int(tst.num_iterations * 1.0) ))
31534f9b3eeSRoland Mainz	printf "%d\n" num_iterations
31634f9b3eeSRoland Mainz}
31734f9b3eeSRoland Mainzbenchmark_t b=(num_iterations=5)
31834f9b3eeSRoland Mainz[[  $(do_benchmarks) == 5 ]] || err_exit 'scoping of nameref of type variables in arithmetic expressions not working'
31934f9b3eeSRoland Mainz
32034f9b3eeSRoland Mainzfunction cat_content
32134f9b3eeSRoland Mainz{
32234f9b3eeSRoland Mainz	cat <<- EOF
32334f9b3eeSRoland Mainz	(
32434f9b3eeSRoland Mainz		foo_t -a foolist=(
32534f9b3eeSRoland Mainz			( val=3 )
32634f9b3eeSRoland Mainz			( val=4 )
32734f9b3eeSRoland Mainz			( val=5 )
32834f9b3eeSRoland Mainz		)
32934f9b3eeSRoland Mainz	)
33034f9b3eeSRoland Mainz	EOF
33134f9b3eeSRoland Mainz	return 0
33234f9b3eeSRoland Mainz}
33334f9b3eeSRoland Mainztypeset -T foo_t=(
33434f9b3eeSRoland Mainz	integer val=-1
33534f9b3eeSRoland Mainz	function print
33634f9b3eeSRoland Mainz	{
33734f9b3eeSRoland Mainz		print -- ${_.val}
33834f9b3eeSRoland Mainz	}
33934f9b3eeSRoland Mainz)
34034f9b3eeSRoland Mainzfunction do_something
34134f9b3eeSRoland Mainz{
34234f9b3eeSRoland Mainz	nameref li=$1 # "li" may be an index or associative array
34334f9b3eeSRoland Mainz	li[2].print
34434f9b3eeSRoland Mainz}
34534f9b3eeSRoland Mainzcat_content | read -C x
34634f9b3eeSRoland Mainz[[ $(do_something x.foolist) == 5  ]] || err_exit 'subscripts not honored for arrays of type with disciplines'
34734f9b3eeSRoland Mainz
34834f9b3eeSRoland Mainztypeset -T benchcmd_t=(
34934f9b3eeSRoland Mainz	float x=1
35034f9b3eeSRoland Mainz	float y=2
35134f9b3eeSRoland Mainz)
35234f9b3eeSRoland Mainzunset x
35334f9b3eeSRoland Mainzcompound x=(
35434f9b3eeSRoland Mainz	float o
35534f9b3eeSRoland Mainz	benchcmd_t -a m
35634f9b3eeSRoland Mainz	integer h
35734f9b3eeSRoland Mainz)
35834f9b3eeSRoland Mainzexpected=$'(\n\ttypeset -l -i h=0\n\tbenchcmd_t -a m\n\ttypeset -l -E o=0\n)'
35934f9b3eeSRoland Mainz[[ $x == "$expected" ]] || err_exit 'compound variable with array of types with no elements not working'
36034f9b3eeSRoland Mainz
36134f9b3eeSRoland Mainzexpected=$'Std_file_t db.file[/etc/profile]=(action=preserve;typeset -A sum=([8242e663d6f7bb4c5427a0e58e2925f3]=1);)'
36234f9b3eeSRoland Mainz{
36334f9b3eeSRoland Mainz  got=$($SHELL <<- \EOF
36434f9b3eeSRoland Mainz	MAGIC='stdinstall (at&t research) 2009-08-25'
36534f9b3eeSRoland Mainz	typeset -T Std_file_t=(
36634f9b3eeSRoland Mainz		typeset action
36734f9b3eeSRoland Mainz		typeset -A sum
36834f9b3eeSRoland Mainz	)
36934f9b3eeSRoland Mainz	typeset -T Std_t=(
37034f9b3eeSRoland Mainz		typeset magic=$MAGIC
37134f9b3eeSRoland Mainz		Std_file_t -A file
37234f9b3eeSRoland Mainz	)
37334f9b3eeSRoland Mainz	Std_t db=(magic='stdinstall (at&t research) 2009-08-25';Std_file_t -A file=( [/./home/gsf/.env.sh]=(action=preserve;typeset -A sum=([9b67ab407d01a52b3e73e3945b9a3ee0]=1);)[/etc/profile]=(action=preserve;typeset -A sum=([8242e663d6f7bb4c5427a0e58e2925f3]=1);)[/home/gsf/.profile]=(action=preserve;typeset -A sum=([3ce23137335219672bf2865d003a098e]=1);));)
37434f9b3eeSRoland Mainz	typeset -p db.file[/etc/profile]
37534f9b3eeSRoland Mainz	EOF)
37634f9b3eeSRoland Mainz} 2> /dev/null
37734f9b3eeSRoland Mainz[[ $got == "$expected" ]] ||  err_exit 'types with arrays of types as members fails'
37834f9b3eeSRoland Mainz
379*b30d1939SAndy Fiddamantypeset -T x_t=(
380*b30d1939SAndy Fiddaman	integer dummy
381*b30d1939SAndy Fiddaman	function set
382*b30d1939SAndy Fiddaman	{
383*b30d1939SAndy Fiddaman		[[ ${.sh.name} == v ]] || err_exit  "name=${.sh.name} should be v"
384*b30d1939SAndy Fiddaman		[[ ${.sh.subscript} == 4 ]] || err_exit "subscript=${.sh.subscript} should be 4"
385*b30d1939SAndy Fiddaman		[[ ${.sh.value} == hello ]] || err_exit  "value=${.sh.value} should be hello"
386*b30d1939SAndy Fiddaman	}
387*b30d1939SAndy Fiddaman)
388*b30d1939SAndy Fiddamanx_t -a v
389*b30d1939SAndy Fiddamanv[4]="hello"
390*b30d1939SAndy Fiddaman
391*b30d1939SAndy Fiddamantypeset -T oset=(
392*b30d1939SAndy Fiddaman    typeset -A s
393*b30d1939SAndy Fiddaman)
394*b30d1939SAndy Fiddamanoset foo bar
395*b30d1939SAndy Fiddaman: ${foo.s[a]:=foobar}
396*b30d1939SAndy Fiddaman: ${bar.s[d]:=foobar}
397*b30d1939SAndy Fiddaman[[ ${bar.s[a]} == foobar ]] && err_exit '${var:=val} for types assigns to type instead of type instance'
398*b30d1939SAndy Fiddaman
399*b30d1939SAndy Fiddamantypeset -T olist=(
400*b30d1939SAndy Fiddaman    typeset -a l
401*b30d1939SAndy Fiddaman)
402*b30d1939SAndy Fiddamanolist foo
403*b30d1939SAndy Fiddamanfoo.l[1]=x
404*b30d1939SAndy Fiddaman[[  ${!foo.l[*]} == *0* ]] && '0-th elment of foo.l should not be set'
405*b30d1939SAndy Fiddaman
406*b30d1939SAndy Fiddamantypeset -T oset2=( typeset -A foo )
407*b30d1939SAndy Fiddamanoset2 bar
408*b30d1939SAndy Fiddaman: ${bar.foo[a]}
409*b30d1939SAndy Fiddamanbar.foo[a]=b
410*b30d1939SAndy Fiddaman[[ ${#bar.foo[*]} == 1 ]] || err_exit "bar.foo should have 1 element not  ${#bar.foo[*]}"
411*b30d1939SAndy Fiddaman[[ ${bar.foo[*]} == b ]] || err_exit "bar.foo[*] should be 'b'  not  ${bar.foo[*]}"
412*b30d1939SAndy Fiddaman[[ ${bar.foo[a]} == b ]] || err_exit "bar.foo[a] should be 'b'  not  ${bar.foo[*]}"
413*b30d1939SAndy Fiddaman
414*b30d1939SAndy Fiddaman{ x=$( $SHELL 2> /dev/null << \++EOF++
415*b30d1939SAndy Fiddaman    typeset -T ab_t=(
416*b30d1939SAndy Fiddaman        integer a=1 b=2
417*b30d1939SAndy Fiddaman        function increment
418*b30d1939SAndy Fiddaman        {
419*b30d1939SAndy Fiddaman                (( _.a++, _.b++ ))
420*b30d1939SAndy Fiddaman        }
421*b30d1939SAndy Fiddaman    )
422*b30d1939SAndy Fiddaman    function ar_n
423*b30d1939SAndy Fiddaman    {
424*b30d1939SAndy Fiddaman        nameref sn=$2
425*b30d1939SAndy Fiddaman        sn.increment
426*b30d1939SAndy Fiddaman        $1 && printf "a=%d, b=%d\n" sn.a sn.b
427*b30d1939SAndy Fiddaman    }
428*b30d1939SAndy Fiddaman    function ar
429*b30d1939SAndy Fiddaman    {
430*b30d1939SAndy Fiddaman        ab_t -S -a s
431*b30d1939SAndy Fiddaman        [[ -v s[5] ]] || s[5]=( )
432*b30d1939SAndy Fiddaman        ar_n $1 s[5]
433*b30d1939SAndy Fiddaman    }
434*b30d1939SAndy Fiddaman    x=$(ar false ; ar false ; ar true ; printf ";")
435*b30d1939SAndy Fiddaman    y=$(ar false ; ar false ; ar true ; printf ";")
436*b30d1939SAndy Fiddaman    print -r -- "\"$x\"" ==  "\"$y\""
437*b30d1939SAndy Fiddaman++EOF++
438*b30d1939SAndy Fiddaman) ;} 2> /dev/null
439*b30d1939SAndy Fiddaman[[ $x == *a=4*b=5* ]] || err_exit 'static types in a function not working'
440*b30d1939SAndy Fiddaman{ eval "[[ $x ]]";} 2> /dev/null || err_exit 'arrays of types leaving side effects in subshells'
441*b30d1939SAndy Fiddaman
442*b30d1939SAndy Fiddamantypeset -T y_t=(
443*b30d1939SAndy Fiddaman	typeset dummy
444*b30d1939SAndy Fiddaman	function print_b
445*b30d1939SAndy Fiddaman	{
446*b30d1939SAndy Fiddaman		print "B"
447*b30d1939SAndy Fiddaman	}
448*b30d1939SAndy Fiddaman)
449*b30d1939SAndy Fiddamany_t a b=(
450*b30d1939SAndy Fiddaman	function print_b
451*b30d1939SAndy Fiddaman	{
452*b30d1939SAndy Fiddaman		print "1"
453*b30d1939SAndy Fiddaman	}
454*b30d1939SAndy Fiddaman)
455*b30d1939SAndy Fiddaman[[ $(a.print_b) == B ]] || err_exit 'default discipline not working'
456*b30d1939SAndy Fiddaman[[ $(b.print_b) == 1 ]] || err_exit 'discipline override not working'
457*b30d1939SAndy Fiddaman
458*b30d1939SAndy Fiddaman$SHELL 2> /dev/null -c 'true || { typeset -T Type_t=(typeset name=foo);
459*b30d1939SAndy Fiddaman	Type_t z=(name=bar) ;}' || err_exit 'unable to parse type command until typeset -T executes'
460*b30d1939SAndy Fiddaman
461*b30d1939SAndy Fiddamancd "$tmp"
462*b30d1939SAndy FiddamanFPATH=$PWD
463*b30d1939SAndy FiddamanPATH=$PWD:$PATH
464*b30d1939SAndy Fiddamancat > A_t <<-  \EOF
465*b30d1939SAndy Fiddaman	typeset -T A_t=(
466*b30d1939SAndy Fiddaman		B_t b
467*b30d1939SAndy Fiddaman	)
468*b30d1939SAndy FiddamanEOF
469*b30d1939SAndy Fiddamancat > B_t <<-  \EOF
470*b30d1939SAndy Fiddaman	typeset -T B_t=(
471*b30d1939SAndy Fiddaman		integer n=5
472*b30d1939SAndy Fiddaman	)
473*b30d1939SAndy FiddamanEOF
474*b30d1939SAndy Fiddaman
475*b30d1939SAndy Fiddamanunset n
476*b30d1939SAndy Fiddamanif	n=$(FPATH=$PWD PATH=$PWD:$PATH $SHELL 2> /dev/null -c 'A_t a; print ${a.b.n}')
477*b30d1939SAndy Fiddamanthen	(( n==5 )) || err_exit 'dynamic loading of types gives wrong result'
478*b30d1939SAndy Fiddamanelse	err_exit 'unable to load types dynamically'
479*b30d1939SAndy Fiddamanfi
480*b30d1939SAndy Fiddaman
481*b30d1939SAndy Fiddaman# check that typeset -T reproduces a type.
482*b30d1939SAndy Fiddamanif	$SHELL  > /dev/null 2>&1  -c 'typeset -T'
483*b30d1939SAndy Fiddamanthen	$SHELL > junk1 <<- \+++EOF
484*b30d1939SAndy Fiddaman		typeset -T foo_t=(
485*b30d1939SAndy Fiddaman			integer x=3 y=4
486*b30d1939SAndy Fiddaman			float z=1.2
487*b30d1939SAndy Fiddaman			len()
488*b30d1939SAndy Fiddaman			{
489*b30d1939SAndy Fiddaman				((.sh.value=sqrt(_.x**2 + _.y**2) ))
490*b30d1939SAndy Fiddaman			}
491*b30d1939SAndy Fiddaman			function count
492*b30d1939SAndy Fiddaman			{
493*b30d1939SAndy Fiddaman				print z=$z
494*b30d1939SAndy Fiddaman			}
495*b30d1939SAndy Fiddaman		)
496*b30d1939SAndy Fiddaman		typeset -T
497*b30d1939SAndy Fiddaman		print 'typeset -T'
498*b30d1939SAndy Fiddaman	+++EOF
499*b30d1939SAndy Fiddaman	$SHELL -c '. ./junk1;print "typeset -T"' > junk2
500*b30d1939SAndy Fiddaman	diff junk[12] > /dev/null || err_exit 'typeset -T not idempotent'
501*b30d1939SAndy Fiddaman	$SHELL -c '. ./junk1;print "typeset +f"' > junk2
502*b30d1939SAndy Fiddaman	[[ -s junk2 ]] || err_exit 'non-discipline-method functions found'
503*b30d1939SAndy Fiddamanelse
504*b30d1939SAndy Fiddaman	err_exit 'typeset -T not supported'
505*b30d1939SAndy Fiddamanfi
506*b30d1939SAndy Fiddaman
507*b30d1939SAndy Fiddaman[[ $($SHELL -c 'typeset -T x=( typeset -a h ) ; x j; print -v j.h') ]] && err_exit 'type with indexed array without elements inserts element 0'
508*b30d1939SAndy Fiddaman
509*b30d1939SAndy Fiddaman[[ $($SHELL  -c 'typeset -T x=( integer -a s ) ; compound c ; x c.i ; c.i.s[4]=666 ; print -v c') == *'[0]'* ]] &&  err_exit 'type with indexed array with non-zero element inserts element 0'
510*b30d1939SAndy Fiddaman
511*b30d1939SAndy Fiddaman
512*b30d1939SAndy Fiddaman{ $SHELL -c '(sleep 3;kill $$)& typeset -T x=( typeset -a s );compound c;x c.i;c.i.s[7][5][3]=hello;x c.j=c.i;[[ ${c.i} == "${c.j}" ]]';} 2> /dev/null
513*b30d1939SAndy Fiddamanexitval=$?
514*b30d1939SAndy Fiddamanif	[[ $(kill -l $exitval) == TERM ]]
515*b30d1939SAndy Fiddamanthen	err_exit 'clone of multi-dimensional array timed out'
516*b30d1939SAndy Fiddamanelif	((exitval))
517*b30d1939SAndy Fiddamanthen	err_exit "c.i and c.j are not the same multi-dimensional array"
518*b30d1939SAndy Fiddamanfi
519*b30d1939SAndy Fiddaman
520*b30d1939SAndy Fiddamantypeset -T foobar_t=(
521*b30d1939SAndy Fiddaman	float x=1 y=0
522*b30d1939SAndy Fiddaman	slen()
523*b30d1939SAndy Fiddaman	{
524*b30d1939SAndy Fiddaman		print -r -- $((sqrt(_.x**2 + _.y**2)))
525*b30d1939SAndy Fiddaman	}
526*b30d1939SAndy Fiddaman	typeset -fS slen
527*b30d1939SAndy Fiddaman	len()
528*b30d1939SAndy Fiddaman	{
529*b30d1939SAndy Fiddaman		print -r -- $((sqrt(_.x**2 + _.y**2)))
530*b30d1939SAndy Fiddaman	}
531*b30d1939SAndy Fiddaman)
532*b30d1939SAndy Fiddamanunset z
533*b30d1939SAndy Fiddamanfoobar_t z=(x=3 y=4)
534*b30d1939SAndy Fiddaman(( z.len == 5 )) || err_exit 'z.len should be 5'
535*b30d1939SAndy Fiddaman(( z.slen == 1 )) || err_exit 'z.slen should be 1'
536*b30d1939SAndy Fiddaman(( .sh.type.foobar_t.slen == 1 )) || err_exit '.sh.type.foobar_t.slen should be 1'
537*b30d1939SAndy Fiddaman(( .sh.type.foobar_t.len == 1 )) || err_exit '.sh.type.foobar_t.len should be 1'
538*b30d1939SAndy Fiddaman
539*b30d1939SAndy Fiddamantypeset -T z_t=( typeset -a ce )
540*b30d1939SAndy Fiddamanz_t x1
541*b30d1939SAndy Fiddamanx1.ce[3][4]=45
542*b30d1939SAndy Fiddamancompound c
543*b30d1939SAndy Fiddamanz_t -a c.x2
544*b30d1939SAndy Fiddamanc.x2[9]=x1
545*b30d1939SAndy Fiddamangot=$(typeset +p "c.x2[9].ce")
546*b30d1939SAndy Fiddamanexp='typeset -a c.x2[9].ce'
547*b30d1939SAndy Fiddaman[[ $got == "$exp" ]] || err_exit "typeset +p 'c.x2[9].ce' failed -- expected '$exp', got '$got'"
548*b30d1939SAndy Fiddaman
549*b30d1939SAndy Fiddamanunset b
550*b30d1939SAndy Fiddamantypeset -T a_t=(
551*b30d1939SAndy Fiddaman	typeset a="hello"
552*b30d1939SAndy Fiddaman)
553*b30d1939SAndy Fiddamantypeset -T b_t=(
554*b30d1939SAndy Fiddaman	a_t b
555*b30d1939SAndy Fiddaman)
556*b30d1939SAndy Fiddamancompound b
557*b30d1939SAndy Fiddamancompound -a b.ca
558*b30d1939SAndy Fiddamanb_t b.ca[4].b
559*b30d1939SAndy Fiddamanexp='typeset -C b=(typeset -C -a ca=( [4]=(b_t b=(a_t b=(a=hello))));)'
560*b30d1939SAndy Fiddamangot=$(typeset -p b)
561*b30d1939SAndy Fiddaman[[ $got == "$exp" ]] || err_exit 'typeset -p of nested type not correct'
562*b30d1939SAndy Fiddaman
563*b30d1939SAndy Fiddamantypeset -T u_t=(
564*b30d1939SAndy Fiddaman	integer dummy
565*b30d1939SAndy Fiddaman	unset()
566*b30d1939SAndy Fiddaman	{
567*b30d1939SAndy Fiddaman		print unset
568*b30d1939SAndy Fiddaman	}
569*b30d1939SAndy Fiddaman)
570*b30d1939SAndy Fiddamanunset z
571*b30d1939SAndy Fiddamanu_t -a x | read z
572*b30d1939SAndy Fiddaman[[ $z == unset ]]  && err_exit 'unset discipline called on type creation'
573*b30d1939SAndy Fiddaman
574*b30d1939SAndy Fiddaman{ z=$($SHELL 2> /dev/null 'typeset -T foo; typeset -T') ;} 2> /dev/null
575*b30d1939SAndy Fiddaman[[ $z == 'typeset -T foo' ]] || err_exit '"typeset -T foo; typeset -T" failed'
576*b30d1939SAndy Fiddaman
577*b30d1939SAndy Fiddaman{ z=$($SHELL 2> /dev/null 'typeset -T foo=bar; typeset -T') ;} 2> /dev/null
578*b30d1939SAndy Fiddaman[[ $z ]] && err_exit '"typeset -T foo=bar" should not creates type foo'
579*b30d1939SAndy Fiddaman
580*b30d1939SAndy Fiddaman{
581*b30d1939SAndy Fiddaman$SHELL << \EOF
582*b30d1939SAndy Fiddaman	typeset -T board_t=(
583*b30d1939SAndy Fiddaman		compound -a board_y
584*b30d1939SAndy Fiddaman		function binsert
585*b30d1939SAndy Fiddaman		{
586*b30d1939SAndy Fiddaman			nameref figure=$1
587*b30d1939SAndy Fiddaman			integer y=$2 x=$3
588*b30d1939SAndy Fiddaman			typeset -m "_.board_y[y].board_x[x].field=figure"
589*b30d1939SAndy Fiddaman		}
590*b30d1939SAndy Fiddaman	)
591*b30d1939SAndy Fiddaman	function main
592*b30d1939SAndy Fiddaman	{
593*b30d1939SAndy Fiddaman		compound c=(
594*b30d1939SAndy Fiddaman			 board_t b
595*b30d1939SAndy Fiddaman		)
596*b30d1939SAndy Fiddaman		for ((i=0 ; i < 2 ; i++ )) ; do
597*b30d1939SAndy Fiddaman			 compound p=( hello=world )
598*b30d1939SAndy Fiddaman			 c.b.binsert p 1 $i
599*b30d1939SAndy Fiddaman		done
600*b30d1939SAndy Fiddaman		exp='typeset -C c=(board_t b=(typeset -a board_y=( [1]=(typeset -a board_x=( [0]=(field=(hello=world;))[1]=(field=(hello=world)));));))'
601*b30d1939SAndy Fiddaman		[[ $(typeset -p c) == "$exp" ]] || exit 1
602*b30d1939SAndy Fiddaman	}
603*b30d1939SAndy Fiddaman	main
604*b30d1939SAndy FiddamanEOF
605*b30d1939SAndy Fiddaman} 2> /dev/null
606*b30d1939SAndy Fiddamanif	(( exitval=$?))
607*b30d1939SAndy Fiddamanthen	if	[[ $(kill -l $exitval) == SEGV ]]
608*b30d1939SAndy Fiddaman	then	err_exit 'typeset -m in type discipline causes exception'
609*b30d1939SAndy Fiddaman	else	err_exit 'typeset -m in type discipline gives wrong value'
610*b30d1939SAndy Fiddaman	fi
611*b30d1939SAndy Fiddamanfi
612*b30d1939SAndy Fiddaman
613*b30d1939SAndy Fiddamantypeset -T pawn_t=(
614*b30d1939SAndy Fiddaman	print_debug()
615*b30d1939SAndy Fiddaman	{
616*b30d1939SAndy Fiddaman		print 'PAWN'
617*b30d1939SAndy Fiddaman	}
618*b30d1939SAndy Fiddaman)
619*b30d1939SAndy Fiddamanfunction main
620*b30d1939SAndy Fiddaman{
621*b30d1939SAndy Fiddaman	compound c=(
622*b30d1939SAndy Fiddaman		compound -a board
623*b30d1939SAndy Fiddaman	)
624*b30d1939SAndy Fiddaman
625*b30d1939SAndy Fiddaman	for ((i=2 ; i < 8 ; i++ )) ; do
626*b30d1939SAndy Fiddaman		pawn_t c.board[1][$i]
627*b30d1939SAndy Fiddaman	done
628*b30d1939SAndy Fiddaman
629*b30d1939SAndy Fiddaman}
630*b30d1939SAndy Fiddamanmain 2> /dev/null && err_exit 'type assignment to compound array instance should generate an error'
631*b30d1939SAndy Fiddaman
632*b30d1939SAndy Fiddaman{	$SHELL -c 'typeset -T Foo_t=(integer -a data=([0]=0) );Foo_t x=(data[0]=2);((x.data[0]==2))'
633*b30d1939SAndy Fiddaman} 2> /dev/null || err_exit 'type definition with integer array variable not working'
634*b30d1939SAndy Fiddaman
635*b30d1939SAndy Fiddamantypeset -T Bar_t=(
636*b30d1939SAndy Fiddaman	typeset -a foo
637*b30d1939SAndy Fiddaman)
638*b30d1939SAndy FiddamanBar_t bar
639*b30d1939SAndy Fiddamanbar.foo+=(bam)
640*b30d1939SAndy Fiddaman[[ ${bar.foo[0]} == bam ]] || err_exit 'appending to empty array variable in type does not create element 0'
641*b30d1939SAndy Fiddaman
642*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125))
643