#!./tt++ -G

#line sub arg #var arg {%0}

#if {"$arg" == "draw"}
{
	#screen clear all;
	#draw convert scroll Red Blue box 1 1 5 40 convert\nx\ny;
	#draw Red box 1 1 2 2;
	#draw rounded Red box 3 1 4 2;
	#draw tubed Red box 5 1 6 2;
	#draw crossed Red box 8 1 9 2;

	#draw Green line 1 4 1 14;
	#draw Green teed line 2 4 2 14;
	#draw Green jeweled line 3 4 3 14;
	#draw Green circled line 4 4 4 14;
	#draw Green left circled line 5 4 5 14;
	#draw Green right circled line 6 4 6 14;
	#draw Green bot vertical teed line 7 4 7 14;
	#draw Green top vertical teed line 8 4 8 14;

	#draw Yellow left horizontal teed line  1 16 10 16;
	#draw Yellow right horizontal teed line 1 18 10 18;
	#draw Yellow top circled line 1 20 10 20;
	#draw Yellow bottom circled line 1 22 10 22;
	#draw Yellow pruned circled line 1 24 10 24;
	#draw Yellow filled circled line 1 26 10 26;
	#draw Yellow filled jeweled line 1 28 10 28;

	#draw Cyan box 1 40 10 60;
	#draw Jade rounded box 2 41  9 59;
	#draw Azure pruned box 2 41 9 59;
	#draw Violet numbered box 3 42 8 58;
	#draw White rounded tubed box 4 43 7 57;

	#draw Magenta Green round table 12  1 20 38 {{a}{b}{c}{d}}{{e}{f}{g}{h}}{{i}{j}{k}{l}};
	#draw Magenta Green grid table 12 42 21 78 {{a}{b}{c}{d}}{{e}{f}{g}{h}}{{i}{j}{k}{l}};

	#draw White Red talign box 22  1 27 19 talign;
	#draw White Red balign box 22 21 27 39 balign;
	#draw White Red lalign box 22 41 27 59 lalign;
	#draw White Red ralign box 22 61 27 79 ralign;
	#draw White Red calign box 22 81 27 99 calign;

	#draw Lime Azure cursive box 28  1 31 19 cursive;
	#draw Lime Azure     fat box 28 21 31 39 fat;
	#draw Lime Azure sansser box 28 41 31 59 sansserif;
	#draw Lime Azure ualign  box 28 61 31 79 { u\na\nl\ni\ng\nn};
	#draw Lime Azure scaled  box 28 81 31 99 scaled;



	#end \
}

#draw Yellow Green scroll box 1 1 3 -1 Running Validator

#format start %U

#math error 0

#alias error
{
	#math error $error + 1;
	#line ignore #showme <118>Failed test %0
}

#nop ----------

#math tmp 1 + 1
#if {$tmp != 2}{error 1: math failure}

#math tmp 7 / 11 * 100.00
#if {"$tmp" != "63.64"} {error 1.1: math failure}

#math tmp (1 + 1) % 10
#if {$tmp != 2} {error 1.2: math failure}

#nop ----------

#alias {test} {#math tmp $tmp + 1}
#line oneshot #alias {test%*} {#nop} {4}
#math tmp 0
#2 test
#if {$tmp != 1}
{
	error 2: oneshot or math or alias failure
}

#nop ----------

#1 {#return;error 3: #return failure}

#nop ----------

#buf get tmp -3 -1

#if {&tmp[] != 3} error 4.1: buffer or variable or if failure (&&tmp[] != 3)
#if {&tmp[%*] != 3} error 4.2: buffer or variable or if failure (&&tmp[%*] != 3)
#if {&{tmp[]} != 3} error 4.3: buffer or variable or if failure (&&{tmp[]} != 3)
#if {&{tmp[%*]} != 3} error 4.4: buffer or variable or if failure (&&{tmp[%*]} != 3)

#showme $arg

#nop ----------

#switch {3}     {#case 3 #return;#default error 5.0: switch failure}
#switch {1+2}   {#case 3 #return;#default error 5.1: switch failure}
#switch {"bla"} {#case "bla" #return;#default error 5.2: switch string failure}

#nop ----------

#class tmp open
#unvar tmp
#var tmp 1
#class tmp kill

#if {&{tmp} != 0}
{
	error 6: class or variable failure
}

#nop ----------

#loop 1 2 tmp {#continue;error 7: continue failure}

#nop ----------

#kill variable tmp

#if {&{tmp} != 0}
{
	error 8: kill variable %* failure
}

#line strip #if {{<128>} != {}}
{
	error 9: line strip failure
}

#nop ----------

#act {test} {error 10: line ignore failure}
#line gag;
#line ignore #showme <118>Failed test 10: line gag failure
#unact {test}

#nop ----------

#parse {abcd} {tmp} {#var tmp ($tmp)}
#if {"$tmp" != "(d)"}
{
	error 11: parse failure
}

#nop ----------

#path load {#var tmp 1}
#path walk
#if {$tmp != 1}
{
	error 12: path load or walk failure
}

#nop ----------

#script tmp {echo 'test'}
#if {{$tmp[1]} != {test}}
{
	error 13: script failure
}

#nop ----------

#regex {test} {te%?t} {#nop}
{
	error 14: regex failure
}

#nop ----------

#regex {bla} {bli}
{
	error 15: regex failure
}

#nop ----------

#0 error 16: repeat failure

#nop ----------

#unvar tmp

#1
{
	#local tmp 1;
	#if {$tmp != 1}
	{
		error 17: local failure
	}
}

#nop ----------

#if {${tmp} == 1}
{
	error 18: local failure
}

#nop ----------

#1
{
	#local tmp 2;

	#regex {a} {a}
	{
		#if {$tmp != 2}
		{
			error 19: local failure
		}
	}
}

#nop ----------

#if {"$arglebargle" != "\$arglebargle"}
{
	error 20: unassigned variable
}

#nop ----------

#alias {bla} {error 21: unalias malfunction}
#alias {bla%*} {#nop}
#unalias {bla}
bla
#unalias {bla%*}

#nop ----------

#class bla open
#var bla 2
#var bli 2
#alias haha hihi
#fun bla blo
#class bla close
#class bla save
#class bla clear
#if {&{bla} != 0} {error 22: #class clear malfunction}
#class bla load
#if {&{bla} == 0} {error 23: #class load malfunction}
#class bla clear
#class bla load
#class bla kill


#nop ----------

#if {(513 & ~1) != 512} {error 24.01: #math error}
#if {1 << 1 != 2}	   {error 24.02: #math error}
#if {1 < 2} {#nop} {error 24.03: #math error}
#if {2 > 1} {#nop} {error 24.04: #math error}
#if {2 % 2} {error 24.05: #math error}

#nop ----------

#var tmp 0;
#var bla var
#{$bla} tmp 1
#if {$tmp != 1} {error 25.1: variable command}
#$bla tmp 2
#if {$tmp != 2} {error 25.2: variable command}

#var bla gts
#{$bla} #var tmp 3
#if {$tmp != 3} {error 25.3: variable session}
#$bla #var tmp 4
#if {$tmp != 4} {error 25.4: variable session}

#var bla #math tmp 5
$bla
#if {$tmp != 5} {error 25.5: variable input}
$bla + 1
#if {$tmp != 6} {error 25.6: variable input}

#nop ----------

#format bla %X ─
#if {$bla != 2500}     {error 26.1: format unicode handling}
#format bla %x 2500
#line sub esc #var bli \u2500
#if {{$bla} != {$bli}} {error 26.2: unicode handling}
#var {bla} {<128>A<138>BC<148>DE<158>FG}
#format tmp %L {$bla}
#if {$tmp != 7}        {error 26.6: format L handling}
#format bla {%.5s} {$bla}
#format tmp %L {$bla}
#if {$tmp != 5}        {error 26.7: format .s handling}
#format bla {%-20s} {$bla}
#format tmp %L {$bla}
#if {$tmp != 20}       {error 26.8: format .s handling}

#nop ----------

#line sub esc #var bla {x\nx}
#if {"$bla" === "x\nx"} {error 27.1: escape handling}
#if {"$bla" != "x\nx"}  {error 27.2: escape handling}

#nop ----------

#var bla[1] {{bli}{2}}
#var bla[2] {{bli}{3}}

#list bla index bli
#list bla order
#if {$bla[1][bli] != 2} {error 28.01: 2D list handling}
#list bla reverse
#if {$bla[1][bli] != 3} {error 28.02: 2D list handling}
#var bla[1][blo] 4
#list bla[1] get 1 tmp
#if {$tmp != 3} {error 28.03: 2D list handling: $tmp}
#list bla[1] get -1 tmp
#if {$tmp != 4} {error 28.04: 2D list handling: $tmp}
#list bla[1] find {4} tmp
#if {$tmp != 2} {error 28.05: 2D list handling: $tmp}
#list bla[1] set 2 5
#list bla[1] find {5} tmp
#if {$tmp != 2} {error 28.06: 2D list handling: $tmp}
#list bla[1] insert 2 9
#list bla[1] get 2 tmp
#if {$tmp != 9} {error 28.07: 2D list handling: $tmp}

#list bla tokenize 123456789
#list bli create $bla[+2..+4]
#if {&bli[] != 3} {error 28.08: list range handling: &bli[]}
#list bli create $bla[-3..-1]
#if {&bli[] != 3} {error 28.09: list range handling: &bli[]}

#list bla tokenize abcdefghi
#list bla filter {} {d}
#if {"$bla[+4]" != "e"} {error 28.10: list filter handling: "$bla[+4]" != "e"}
#list bla filter {f}
#if {"$bla[+1]" != "f"} {error 28.11: list filter handling: "$bla[+1]" != "f"}

#nop ----------

#alias {bla}
{
	#var bla 1;
	#return;
	#var bla 2
}
bla
#if {$bla != 1} {error 29.1: return handling}

#function {bla}
{
	#return 1;
	#return 2;
}
#if {@bla{} != 1} {error 29.2: return handling}

#function {bla}
{
	#if {1} #return 1;
	#return 2
}
#if {@bla{} != 1} {error 29.3: return handling}

#function {bla}
{
	#regex {1} {1} {#return 1};
	#return 2
}
#if {@bla{} != 2} {error 29.4: regex return handling}

#function {bla}
{
	#var blo 5;
	#return $blo
}

#function {bli}
{
	#return @bla{}
}

#if {@bli{} != 5} {error 29.5: regex return handling (@bli{})}

#nop ----------

#history insert {#var bla 33}
!
#if {$bla != 33} {error 30.1: repeat handling}

#nop ----------

#var bla {{d}{4}{b}{2}{a}{1}{c}{3}}

#if {$bla[+3] != 3} {error 30.1: table handling ($bla[+3] != 3)}
#if {$bla[-2] != 3} {error 30.1: table handling ($bla[-2] != 3)}

#nop ----------

#tab bliblablo
#cursor set bli
#cursor tab list forward
#cursor get bla
#cursor clear
#if {"$bla" != "bliblablo"} {error 31.1: tab list handling ("$bla" != "bliblablo")}
#untab bliblablo
#cursor set bli
#cursor tab dict forward
#cursor get bla
#cursor clear
#if {"$bla" != "bliaut"} {error 31.2: tab dict handling ("$bla" != "bliaut")}

#nop ----------
#map create
#map goto 1
#map move {nw;ne;s;s}
#map exit n weight 0.9
#map find 3
#path save forward bla
#if {"$bla" != "n;n"} {error 32.1: #map find failing exit weight reduction}
#map exit n weight 1.0
#map find 3
#path save forward bla
#if {"$bla" != "nw;ne"} {error 32.2: #map find failing exit weight increase}

#nop ----------
#alias {sethash}
{
       #format hash %H %1;
       #math hash1 $hash % 100;
       #math hash2 $hash / 100 % 100;
       #var hashtable[$hash1][$hash2][%1] %2
}

#function {gethash}
{
       #format hash %H %1;
       #math hash1 $hash % 100;
       #math hash2 $hash / 100 % 100;
       #return $hashtable[$hash1][$hash2][%1]
}

sethash bli hey
sethash bla hi
sethash blo hello
#if {"@gethash{bla}" !== "hi"} {error 33.1: variable hashing support}

#nop ----------

#nop command crash test

#action {bla} #nop
#unact bla
#alias {bla} #nop
#unalias bla
#bell volume 8
#buffer get bla -1 -1;
#button {1;1;2;2} {#nop}
#unbutton {1;1;2;2}
#cat bla bli
#line quiet #chat init 0
#chat uninit
#class bla open
#class bla kill
#cursor get bla
#line quiet #daemon list
#line quiet {#debug all on;#debug all off};
#line quiet #dictionary bla
#line quiet #dictionary hello
#draw green tile 1 -1 1 -1
#draw blue red scaled box 1 1 4 4 hello world
#event {GAG SESSION DISCONNECTED} {#nop}
#format bla {}
#fun bla {#nop}
#unfun bla
#line quiet #help %*
#high bla green
#unhigh bla
#history insert bla
#history delete
#info system save
#list bla create {a;b;c}
#kill variable bla
#loop 0 1 bla #nop
#macro \e\e #nop
#unmacro \e\e
#line quiet
{
	#map create;
	#map goto 1;
	#map dig n;
	#map destroy world
}
#math bla 2+2
#message all on
#parse {abc} {bla} {#nop}
#path create
#path destroy
#pathdir bla bli
#unpathdir bla
#line quiet #port init bla 0
#snoop bla
#bla #kill all
#line quiet #port uninit
#prompt bla bli
#unprompt bla
#regex {bla} {bla} {#nop} {#nop}
#var bla x
#replace bla x y
#screen get cols bla
#line quiet #split
#unsplit
#sub bla bli
#unsub bla
#tab bla bli
#untab bla
#tick bla {#nop} 1
#untick bla

#format end %U;

#nop ----------

#function time
{
	#math result ($end - $start) / 1000000.000
}

#if {$error}
{
	#draw White Red scroll box 1 1 3 80 End of validation with $error errors.;
	#end \
}
{
	#delay {0}
	{
		#info memory;
		#info stack;
		#draw Yellow Green scroll box 1 1 3 80 End of validation with 0 errors in @time{} seconds.;
		#line benchmark {#10000 #math tmp (2 | 1) / 2 + 5};
		#end \
	}
}
