1# This file is a Tcl script to test menus in Tk.  It is
2# organized in the standard fashion for Tcl tests.
3#
4# Copyright (c) 1995-1997 Sun Microsystems, Inc.
5# Copyright (c) 1998-1999 by Scriptics Corporation.
6# All rights reserved.
7#
8# RCS: @(#) $Id$
9
10package require tcltest 2.1
11eval tcltest::configure $argv
12tcltest::loadTestedCommands
13
14# find the earth.gif file for use in these tests
15set earthPhotoFile [file join [file dirname [info script]] earth.gif]
16testConstraint hasEarthPhoto [file exists $earthPhotoFile]
17
18test menu-1.1 {Tk_MenuCmd procedure} {
19    list [catch menu msg] $msg
20} {1 {wrong # args: should be "menu pathName ?options?"}}
21test menu-1.2 {Tk_MenuCmd procedure} {
22    list [catch "menu bogus" msg] $msg
23} {1 {bad window path name "bogus"}}
24test menu-1.3 {Tk_MenuCmd procedure} {
25    list [catch "menu .m1 foo" msg] $msg
26} {1 {unknown option "foo"}}
27test menu-1.4 {Tk_MenuCmd procedure} {
28    catch {destroy .m1}
29    list [catch {menu .m1} msg] $msg [destroy .m1]
30} {0 .m1 {}}
31test menu-1.5 {Tk_MenuCmd - creating menubar} {
32    catch {destroy .m1}
33    menu .m1
34    .m1 add cascade -label Test -menu ""
35    list [. configure -menu .m1] [. configure -menu ""] [destroy .m1]
36} {{} {} {}}
37test menu-1.6 {Tk_MenuCmd procedure menu ref no cascade} {
38    catch {destroy .t2}
39    catch {destroy .m1}
40    toplevel .t2 -menu .m1
41    wm geometry .t2 +0+0
42    list [catch {menu .m1} msg] $msg [destroy .m1 .t2]
43} {0 .m1 {}}
44test menu-1.7 {Tk_MenuCmd procedure one clone cascade} {
45    catch {destroy .m1}
46    catch {destroy .m2}
47    catch {destroy .t2}
48    toplevel .t2 -menu .m1
49    wm geometry .t2 +0+0
50    menu .m1
51    .m1 add cascade -menu .m2
52    list [catch {menu .m2} msg] $msg [destroy .t2 .m1 .m2]
53} {0 .m2 {}}
54test menu-1.8 {Tk_MenuCmd procedure two clone cascades} {
55    catch {destroy .m1}
56    catch {destroy .t2}
57    catch {destroy .t3}
58    catch {destroy .m2}
59    menu .m1
60    .m1 add cascade -menu .m2
61    toplevel .t2 -menu .m1
62    wm geometry .t2 +0+0
63    toplevel .t3 -menu .m1
64    wm geometry .t3 +0+0
65    list [catch {menu .m2} msg] $msg [destroy .t2 .t3 .m1 .m2]
66} {0 .m2 {}}
67test menu-1.9 {Tk_MenuCmd procedure two clone cascades different order} {
68    catch {destroy .t2}
69    catch {destroy .m1}
70    catch {destroy .t3}
71    catch {destroy .m2}
72    toplevel .t2 -menu .m1
73    wm geometry .t2 +0+0
74    menu .m1
75    .m1 add cascade -menu .m2
76    toplevel .t3 -menu .m1
77    wm geometry .t3 +0+0
78    list [catch {menu .m2} msg] $msg [destroy .t2 .t3 .m1 .m2]
79} {0 .m2 {}}
80test menu-1.10 {Tk_MenuCmd procedure two clone cascades menus last} {
81    catch {destroy .t2}
82    catch {destroy .t3}
83    catch {destroy .m1}
84    catch {destroy .m2}
85    toplevel .t2 -menu .m1
86    wm geometry .t2 +0+0
87    toplevel .t3 -menu .m1
88    wm geometry .t3 +0+0
89    menu .m1
90    .m1 add cascade -menu .m2
91    list [catch {menu .m2} msg] $msg [destroy .t2 .t3 .m1 .m2]
92} {0 .m2 {}}
93test menu-1.11 {Tk_MenuCmd procedure three clones cascades} {
94    catch {destroy .t2}
95    catch {destroy .t3}
96    catch {destroy .t4}
97    catch {destroy .m1}
98    catch {destroy .m2}
99    toplevel .t2 -menu .m1
100    wm geometry .t2 +0+0
101    toplevel .t3 -menu .m1
102    wm geometry .t3 +0+0
103    toplevel .t4 -menu .m1
104    wm geometry .t4 +0+0
105    menu .m1
106    .m1 add cascade -menu .m2
107    list [catch {menu .m2} msg] $msg [destroy .t2 .t3 .t4 .m1 .m2]
108} {0 .m2 {}}
109test menu-1.12 {Tk_MenuCmd procedure} {
110    catch {destroy .t2}
111    catch {destroy .m1}
112    toplevel .t2 -menu .m1
113    wm geometry .t2 +0+0
114    list [catch {menu .m1} msg] $msg [destroy .t2 .m1]
115} {0 .m1 {}}
116test menu-1.13 {Tk_MenuCmd procedure} {
117    catch {destroy .t2}
118    catch {destroy .t3}
119    catch {destroy .m1}
120    toplevel .t2 -menu .m1
121    wm geometry .t2 +0+0
122    toplevel .t3 -menu .m1
123    wm geometry .t3 +0+0
124    list [catch {menu .m1} msg] $msg [destroy .t2 .t3 .m1]
125} {0 .m1 {}}
126test menu-1.14 {Tk_MenuCmd procedure} {
127    catch {destroy .t2}
128    catch {destroy .t3}
129    catch {destroy .t4}
130    catch {destroy .m1}
131    toplevel .t2 -menu .m1
132    wm geometry .t2 +0+0
133    toplevel .t3 -menu .m1
134    wm geometry .t3 +0+0
135    toplevel .t4 -menu .m1
136    wm geometry .t4 +0+0
137    list [catch {menu .m1} msg] $msg [destroy .t2 .t3 .t4 .m1]
138} {0 .m1 {}}
139
140catch {destroy .m1}
141menu .m1
142set i 1
143foreach configTest {
144    {-activebackground #012345 #012345 non-existent
145	    {unknown color name "non-existent"}}
146    {-activeborderwidth 1.3 1.3 badValue {bad screen distance "badValue"}}
147    {-activeforeground #ff0000 #ff0000 non-existent
148	    {unknown color name "non-existent"}}
149    {-background #ff0000 #ff0000 non-existent
150	    {unknown color name "non-existent"}}
151    {-bg #110022 #110022 bogus {unknown color name "bogus"}}
152    {-borderwidth 1.3 1.3 badValue {bad screen distance "badValue"}}
153    {-cursor arrow arrow badValue {bad cursor spec "badValue"}}
154    {-disabledforeground #00ff00 #00ff00 xyzzy {unknown color name "xyzzy"}}
155    {-fg #110022 #110022 bogus {unknown color name "bogus"}}
156    {-font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* 
157	    -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* {}
158	    {font "" doesn't exist}}
159    {-foreground #110022 #110022 bogus {unknown color name "bogus"}}
160    {-postcommand "any old string" "any old string" {} {}}
161    {-relief groove groove 1.5 {bad relief "1.5": must be flat, groove, raised, ridge, solid, or sunken}}
162    {-selectcolor #110022 #110022 bogus {unknown color name "bogus"}}
163    {-takefocus "any string" "any string" {} {}}
164    {-tearoff 0 0}
165    {-tearoff 1 1}
166    {-tearoffcommand "any old string" "any old string" {} {}}
167} {
168    set name [lindex $configTest 0]
169    set value [lindex $configTest 1]
170    set result [lindex $configTest 2]
171    test menu-2.$i [list configuration options $name $value $result] {
172	.m1 configure $name $value
173	lindex [.m1 configure $name] 4
174    } $result
175    incr i
176    if {[lindex $configTest 3] != ""} {
177	set value [lindex $configTest 3]
178	set result [lindex $configTest 4]
179	test menu-2.$i [list configuration options $name $value $result] {
180	    list [catch {.m1 configure $name $value} msg] $msg
181	} [list 1 $result]
182    }
183    .m1 configure $name [lindex [.m1 configure $name] 3]
184    incr i
185}
186destroy .m1
187
188# We need to test all of the options with all of the different types of
189# menu entries. The following code sets up .m1 with 6 items. It then
190# runs through the big table below it.
191# index 0 is tearoff, 1 command, 2 cascade, 3 separator, 4 checkbutton, 
192# 5 radiobutton
193
194menu .m1
195.m1 add command -label "command"
196menu .m2
197.m2 add command -label "test"
198.m1 add cascade -label "cascade" -menu .m2
199.m1 add separator
200.m1 add checkbutton -label "checkbutton" -variable check -onvalue on -offvalue off
201.m1 add radiobutton -label "radiobutton" -variable radio
202if {[testConstraint hasEarthPhoto]} {
203    image create photo image1 -file $earthPhotoFile
204}
205
206foreach configTest {
207    {-activebackground 
208        {{#012345 
209            {{unknown option "-activebackground"} #012345 #012345 
210            {unknown option "-activebackground"} #012345 #012345
211            }
212        }
213        {non-existent 
214            {{unknown option "-activebackground"} 
215	    {unknown color name "non-existent"}
216	    {unknown color name "non-existent"}
217	    {unknown option "-activebackground"}
218	    {unknown color name "non-existent"}
219	    {unknown color name "non-existent"}
220	    }
221	}}
222    }
223    {-activeforeground
224    	{{#ff0000 
225	    {{unknown option "-activeforeground"}
226	    #ff0000 #ff0000 {unknown option "-activeforeground"} #ff0000 #ff0000
227	    }
228	}
229	{non-existent
230	    {{unknown option "-activeforeground"} 
231	    {unknown color name "non-existent"}
232	    {unknown color name "non-existent"}
233	    {unknown option "-activeforeground"}
234	    {unknown color name "non-existent"}
235	    {unknown color name "non-existent"}
236	    }
237	}}
238    }
239    {-accelerator
240    	{{"Ctrl+S" 
241	    {{unknown option "-accelerator"}
242	    "Ctrl+S" "Ctrl+S" {unknown option "-accelerator"} 
243	    "Ctrl+S" "Ctrl+S"
244	    }
245	}}
246    }
247    {-background
248    	{{#ff0000 
249    	    {#ff0000 #ff0000 #ff0000 #ff0000 #ff0000 #ff0000
250	    }
251	}
252	{non-existent
253	    {{unknown color name "non-existent"} 
254	    {unknown color name "non-existent"}
255	    {unknown color name "non-existent"}
256	    {unknown color name "non-existent"}
257	    {unknown color name "non-existent"}
258	    {unknown color name "non-existent"}
259	    }
260	}}
261    }
262    {-bitmap
263    	{{questhead 
264	    {{unknown option "-bitmap"} questhead questhead 
265	    {unknown option "-bitmap"} questhead questhead
266	    }
267	}
268	{badValue
269	    {{unknown option "-bitmap"} 
270	    {bitmap "badValue" not defined}
271	    {bitmap "badValue" not defined}
272	    {unknown option "-bitmap"}
273	    {bitmap "badValue" not defined}
274	    {bitmap "badValue" not defined}
275	    }
276	}}
277    }
278    {-columnbreak
279	{{1
280	    {{unknown option "-columnbreak"} 1 1 
281	    {unknown option "-columnbreak"} 1 1}
282	}}
283    }
284    {-command
285    	{{beep 
286	    {{unknown option "-command"} beep beep 
287	    {unknown option "-command"} beep beep
288	    }
289	}}
290    }
291    {-font
292    	{{-Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* 
293	    {{unknown option "-font"}
294    	    -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*
295    	    -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* 
296	    {unknown option "-font"} 
297    	    -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*
298    	    -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*
299	    }
300	}
301	{{kill rock stars}
302	    {{unknown option "-font"}
303	    {expected integer but got "rock"}
304	    {expected integer but got "rock"}
305	    {unknown option "-font"}
306	    {expected integer but got "rock"}
307	    {expected integer but got "rock"}
308	    }
309	}}
310    }
311    {-foreground
312    	{{#110022 
313	    {{unknown option "-foreground"} #110022 #110022 
314	    {unknown option "-foreground"} #110022 #110022
315	    }
316	}
317	{non-existent
318	    {{unknown option "-foreground"} 
319	    {unknown color name "non-existent"}
320	    {unknown color name "non-existent"}
321	    {unknown option "-foreground"}
322	    {unknown color name "non-existent"}
323	    {unknown color name "non-existent"}
324	    }
325	}}
326    }
327    {-image
328    	{{image1 
329	    {{unknown option "-image"} image1 image1 
330	    {unknown option "-image"} image1 image1
331	    }
332	}
333	{bogus
334	    {{unknown option "-image"} 
335	    {image "bogus" doesn't exist}
336	    {image "bogus" doesn't exist}
337	    {unknown option "-image"}
338	    {image "bogus" doesn't exist}
339	    {image "bogus" doesn't exist}
340	    }
341	}
342	{""
343	    {{unknown option "-image"}
344	    {}
345	    {}
346	    {unknown option "-image"}
347	    {}
348	    {}
349	    }
350	}}
351    }
352    {-indicatoron
353    	{{1 
354	    {{unknown option "-indicatoron"}
355	    {unknown option "-indicatoron"}
356	    {unknown option "-indicatoron"} 
357	    {unknown option "-indicatoron"} 1 1
358	    }
359	}}
360    }
361    {-label
362    	{{test 
363	    {{unknown option "-label"} test test 
364	    {unknown option "-label"} test test
365	    }
366	}}
367    }
368    {-menu
369    	{{.m2 
370	    {{unknown option "-menu"}
371	    {unknown option "-menu"} .m2 
372	    {unknown option "-menu"}
373	    {unknown option "-menu"}
374	    {unknown option "-menu"}
375	    }
376	}}
377    }
378    {-offvalue
379    	{{off
380	    {{unknown option "-offvalue"} 
381	    {unknown option "-offvalue"}
382	    {unknown option "-offvalue"}
383	    {unknown option "-offvalue"}
384    	    off
385	    {unknown option "-offvalue"}
386	    }
387	}}
388    }
389    {-onvalue
390    	{{on
391	    {{unknown option "-onvalue"}
392	    {unknown option "-onvalue"}
393	    {unknown option "-onvalue"}
394	    {unknown option "-onvalue"}
395    	    on 
396	    {unknown option "-onvalue"}
397	    }
398	}}
399    }
400    {-selectcolor
401    	{{#110022 
402	    {{unknown option "-selectcolor"} 
403	    {unknown option "-selectcolor"}
404	    {unknown option "-selectcolor"} 
405	    {unknown option "-selectcolor"}
406    	    #110022
407    	    #110022
408	    }
409	}
410	{non-existent
411	    {{unknown option "-selectcolor"} 
412	    {unknown option "-selectcolor"}
413	    {unknown option "-selectcolor"}
414	    {unknown option "-selectcolor"}
415	    {unknown color name "non-existent"}
416	    {unknown color name "non-existent"}
417	    }
418	}}
419    }
420    {-selectimage
421    	{{image1 
422    	    {{unknown option "-selectimage"}
423    	    {unknown option "-selectimage"}
424    	    {unknown option "-selectimage"} 
425    	    {unknown option "-selectimage"} image1 image1
426	    }
427	}
428	{bogus
429	    {{unknown option "-selectimage"} 
430	    {unknown option "-selectimage"}
431	    {unknown option "-selectimage"}
432	    {unknown option "-selectimage"}
433	    {image "bogus" doesn't exist}
434	    {image "bogus" doesn't exist}
435	    }
436	}
437	{""
438	    {{unknown option "-selectimage"}
439	    {unknown option "-selectimage"}
440	    {unknown option "-selectimage"}
441	    {unknown option "-selectimage"}
442	    {}
443	    {}
444	    }
445	}}
446    }
447    {-state
448    	{{normal 
449    	    {normal normal normal {unknown option "-state"} normal normal
450	    }
451	}}
452    }
453    {-value
454    	{{"any string"
455    	    {{unknown option "-value"}
456    	    {unknown option "-value"}
457    	    {unknown option "-value"}
458    	    {unknown option "-value"}
459    	    {unknown option "-value"} "any string"
460	    }
461	}}
462    }
463    {-variable
464    	{{"any string"
465    	    {{unknown option "-variable"}
466    	    {unknown option "-variable"}
467    	    {unknown option "-variable"} 
468    	    {unknown option "-variable"}
469    	    "any string"
470    	    "any string"
471	    }
472	}}
473    }
474    {-underline
475    	{{0 
476    	    {{unknown option "-underline"} 0 0 
477    	    {unknown option "-underline"} 0 0
478	    }
479	}
480	{3p
481	    {{unknown option "-underline"} 
482	    {expected integer but got "3p"}
483	    {expected integer but got "3p"}
484	    {unknown option "-underline"}
485	    {expected integer but got "3p"}
486	    {expected integer but got "3p"}
487	    }
488	}}
489    }
490} {
491    set name [lindex $configTest 0]
492    foreach attempt [lindex $configTest 1] {
493    	set value [lindex $attempt 0]
494    	set options [lindex $attempt 1]
495    	foreach item {0 1 2 3 4 5} {
496    	    catch {unset msg}
497	    # OK, it's an overeager constraint, but it should also
498	    # normally hold anyway
499    	    test menu-2.$i [list entry configuration options $name $item $value [.m1 type $item]] hasEarthPhoto {
500            	set result [catch {.m1 entryconfigure $item $name $value} msg]
501                if {$result == 1} {
502            	    set msg
503            	} else {
504            	    lindex [.m1 entryconfigure $item $name] 4
505            	}
506    	    } [lindex $options $item]
507    	    incr i
508    	}
509    }
510}
511
512if {[testConstraint hasEarthPhoto]} {
513    image delete image1
514}
515destroy .m1
516destroy .m2
517
518test menu-3.1 {MenuWidgetCmd procedure} {
519    catch {destroy .m1}
520    menu .m1
521    list [catch {.m1} msg] $msg [destroy .m1]
522} {1 {wrong # args: should be ".m1 option ?arg arg ...?"} {}}
523test menu-3.2 {MenuWidgetCmd, Tcl_Preserve and Tcl_Release} {nonUnixUserInteraction } {
524    catch {destroy .m1}
525    menu .m1 -postcommand "destroy .m1"
526    .m1 add command -label "menu-3.2: Hit Escape"
527    list [catch {.m1 post 40 40} msg] $msg
528} {0 {}}
529test menu-3.3 {MenuWidgetCmd procedure, "activate" option} {
530    catch {destroy .m1}
531    menu .m1
532    .m1 add command -label "test"
533    list [catch {.m1 activate} msg] $msg [destroy .m1]
534} {1 {wrong # args: should be ".m1 activate index"} {}}
535test menu-3.4 {MenuWidgetCmd procedure, "activate" option} {
536    catch {destroy .m1}
537    menu .m1
538    list [catch {.m1 activate "foo"} msg] $msg [destroy .m1]
539} {1 {bad menu entry index "foo"} {}}
540test menu-3.5 {MenuWidgetCmd procedure, "activate" option} {
541    catch {destroy .m1}
542    menu .m1
543    .m1 add command -label "test"
544    .m1 add separator
545    list [catch {.m1 activate 2} msg] $msg [destroy .m1]
546} {0 {} {}}
547test menu-3.6 {MenuWidgetCmd procedure, "activate" option} {
548    catch {destroy .m1}
549    menu .m1
550    .m1 add command -label "test"
551    .m1 entryconfigure 1 -state disabled
552    list [catch {.m1 activate 1} msg] $msg [destroy .m1]
553} {0 {} {}}
554test menu-3.7 {MenuWidgetCmd procedure, "activate" option} {
555    catch {destroy .m1}
556    menu .m1
557    .m1 add command -label "test"
558    list [catch {.m1 activate 1} msg] $msg [destroy .m1]
559} {0 {} {}}
560test menu-3.8 {MenuWidgetCmd procedure, "add" option} {
561    catch {destroy .m1}
562    menu .m1
563    list [catch {.m1 add} msg] $msg [destroy .m1]
564} {1 {wrong # args: should be ".m1 add type ?options?"} {}}
565test menu-3.9 {MenuWidgetCmd procedure, "add" option} {
566    catch {destroy .m1}
567    menu .m1
568    list [catch {.m1 add foo} msg] $msg [destroy .m1]
569} {1 {bad menu entry type "foo": must be cascade, checkbutton, command, radiobutton, or separator} {}}
570test menu-3.10 {MenuWidgetCmd procedure, "add" option} {
571    catch {destroy .m1}
572    menu .m1
573    list [catch {.m1 add separator} msg] $msg [destroy .m1]
574} {0 {} {}}
575test menu-3.11 {MenuWidgetCmd procedure, "cget" option} {
576    catch {destroy .m1}
577    menu .m1
578    list [catch {.m1 cget} msg] $msg [destroy .m1]
579} {1 {wrong # args: should be ".m1 cget option"} {}}
580test menu-3.12 {MenuWidgetCmd procedure, "cget" option} {
581    catch {destroy .m1}
582    menu .m1
583    list [catch {.m1 cget -gorp} msg] $msg [destroy .m1]
584} {1 {unknown option "-gorp"} {}}
585test menu-3.13 {MenuWidgetCmd procedure, "cget" option} {
586    catch {destroy .m1}
587    menu .m1
588    .m1 configure -postcommand "Some string"
589    list [catch {.m1 cget -postcommand} msg] $msg [destroy .m1]
590} {0 {Some string} {}}
591test menu-3.14 {MenuWidgetCmd procedure, "clone" option} {
592    catch {destroy .m1}
593    menu .m1
594    list [catch {.m1 clone} msg] $msg [destroy .m1]
595} {1 {wrong # args: should be ".m1 clone newMenuName ?menuType?"} {}}
596test menu-3.15 {MenuWidgetCmd procedure, "clone" option} {
597    catch {destroy .m1}
598    menu .m1
599    list [catch {.m1 clone a b c d} msg] $msg [destroy .m1]
600} {1 {wrong # args: should be ".m1 clone newMenuName ?menuType?"} {}}
601test menu-3.16 {MenuWidgetCmd procedure, "clone" option} {
602    catch {destroy .m1}
603    menu .m1
604    list [catch {.m1 clone .m1.clone1} msg] $msg [destroy .m1]
605} {0 {} {}}
606test menu-3.17 {MenuWidgetCmd procedure, "clone" option} {
607    catch {destroy .m1}
608    menu .m1
609    list [catch {.m1 clone .m1.clone1 tearoff} msg] $msg [destroy .m1]
610} {0 {} {}}
611test menu-3.18 {MenuWidgetCmd procedure, "configure" option} {
612    catch {destroy .m1}
613    menu .m1
614    list [catch {llength [.m1 configure]} msg] $msg [destroy .m1]
615} {0 20 {}}
616test menu-3.19 {MenuWidgetCmd procedure, "configure" option} {
617    catch {destroy .m1}
618    menu .m1
619    list [catch {.m1 configure -gorp} msg] $msg [destroy .m1]
620} {1 {unknown option "-gorp"} {}}
621test menu-3.20 {MenuWidgetCmd procedure, "configure" option} {
622    catch {destroy .m1}
623    menu .m1
624    list [catch {.m1 configure -postcommand "A random String"} msg] $msg [destroy .m1]
625} {0 {} {}}
626test menu-3.21 {MenuWidgetCmd procedure, "configure" option} {
627    catch {destroy .m1}
628    menu .m1
629    .m1 configure -postcommand "Another string"
630    list [catch {lindex [.m1 configure -postcommand] 4} msg] $msg [destroy .m1]
631} {0 {Another string} {}}
632test menu-3.22 {MenuWidgetCmd procedure, "delete" option} {
633    catch {destroy .m1}
634    menu .m1
635    list [catch {.m1 delete} msg] $msg [destroy .m1]
636} {1 {wrong # args: should be ".m1 delete first ?last?"} {}}
637test menu-3.23 {MenuWidgetCmd procedure, "delete" option} {
638    catch {destroy .m1}
639    menu .m1
640    list [catch {.m1 delete foo} msg] $msg [destroy .m1]
641} {1 {bad menu entry index "foo"} {}}
642test menu-3.24 {MenuWidgetCmd procedure, "delete" option} {
643    catch {destroy .m1}
644    menu .m1
645    list [catch {.m1 delete 0 "foo"} msg] $msg [destroy .m1]
646} {1 {bad menu entry index "foo"} {}}
647test menu-3.25 {MenuWidgetCmd procedure, "delete" option} {
648    catch {destroy .m1}
649    menu .m1
650    list [catch {.m1 delete 0} msg] $msg [destroy .m1]
651} {0 {} {}}
652test menu-3.26 {MenuWidgetCmd procedure, "delete" option} {
653    catch {destroy .m1}
654    menu .m1
655    .m1 add command -label "foo"
656    list [catch {.m1 delete 1 0} msg] $msg [destroy .m1] 
657} {0 {} {}}
658test menu-3.27 {MenuWidgetCmd procedure, "delete" option} {
659    catch {destroy .m1}
660    menu .m1
661    .m1 add command -label "1"
662    .m1 add command -label "2"
663    .m1 add command -label "3"
664    list [catch {.m1 delete 1 3} msg] $msg [destroy .m1]
665} {0 {} {}}
666test menu-3.28 {MenuWidgetCmd procedure, "delete" option} {
667    catch {destroy .m1}
668    menu .m1
669    .m1 add command -label "1"
670    .m1 add command -label "2"
671    .m1 add command -label "3"
672    .m1 activate 2
673    list [catch {.m1 delete 1 3} msg] $msg [destroy .m1]
674} {0 {} {}}
675test menu-3.29 {MenuWidgetCmd procedure, "delete" option} {
676    catch {destroy .m1}
677    menu .m1
678    .m1 add command -label "1"
679    .m1 add command -label "2"
680    .m1 add command -label "3"
681    .m1 activate 3
682    list [catch {.m1 delete 1} msg] $msg [destroy .m1]
683} {0 {} {}}
684test menu-3.29+1 {MenuWidgetCmd, "delete", Bug 220950} -setup {
685    destroy .m1
686} -body {
687    menu .m1
688    .m1 add command -label "bogus"
689    .m1 add command -label "ok"
690    .m1 delete 10 20
691    .m1 entrycget last -label
692} -cleanup {
693    destroy .m1
694} -result ok
695test menu-3.30 {MenuWidgetCmd procedure, "entrycget" option} {
696    catch {destroy .m1}
697    menu .m1
698    list [catch {.m1 entrycget} msg] $msg [destroy .m1]
699} {1 {wrong # args: should be ".m1 entrycget index option"} {}}
700test menu-3.31 {MenuWidgetCmd procedure, "entrycget" option} {
701    catch {destroy .m1}
702    menu .m1
703    list [catch {.m1 entrycget index option foo} msg] $msg [destroy .m1]
704} {1 {wrong # args: should be ".m1 entrycget index option"} {}}
705test menu-3.32 {MenuWidgetCmd procedure, "entrycget" option} {
706    catch {destroy .m1}
707    menu .m1
708    list [catch {.m1 entrycget foo -label} msg] $msg [destroy .m1]
709} {1 {bad menu entry index "foo"} {}}
710test menu-3.33 {MenuWidgetCmd procedure, "entrycget" option} {
711    catch {destroy .m1}
712    menu .m1
713    .m1 add command -label "test"
714    list [catch {.m1 entrycget 1 -label} msg] $msg [destroy .m1]
715} {0 test {}}
716test menu-3.34 {MenuWidgetCmd procedure, "entryconfigure" option} {
717    catch {destroy .m1}
718    menu .m1
719    list [catch {.m1 entryconfigure} msg] $msg [destroy .m1]
720} {1 {wrong # args: should be ".m1 entryconfigure index ?option value ...?"} {}}
721test menu-3.35 {MenuWidgetCmd procedure, "entryconfigure" option} {
722    catch {destroy .m1}
723    menu .m1
724    list [catch {.m1 entryconfigure foo} msg] $msg [destroy .m1]
725} {1 {bad menu entry index "foo"} {}}
726test menu-3.36 {MenuWidgetCmd procedure, "entryconfigure" option} {
727    catch {destroy .m1}
728    menu .m1
729    .m1 add command -label "test"
730    list [catch {llength [.m1 entryconfigure 1]} msg] $msg [destroy .m1]
731} {0 15 {}}
732test menu-3.37 {MenuWidgetCmd procedure, "entryconfigure" option} {
733    catch {destroy .m1}
734    menu .m1
735    .m1 add command -label "test"
736    list [catch {lindex [.m1 entryconfigure 1 -label] 4} msg] $msg [destroy .m1]
737} {0 test {}}
738test menu-3.38 {MenuWidgetCmd procedure, "entryconfigure" option} {
739    catch {destroy .m1}
740    menu .m1
741    .m1 add command -label "test"
742    .m1 entryconfigure 1 -label "changed"
743    list [catch {lindex [.m1 entryconfigure 1 -label] 4} msg] $msg [destroy .m1]
744} {0 changed {}}
745test menu-3.39 {MenuWidgetCmd procedure, "index" option} {
746    catch {destroy .m1}
747    menu .m1
748    list [catch {.m1 index} msg] $msg [destroy .m1]
749} {1 {wrong # args: should be ".m1 index string"} {}}
750test menu-3.40 {MenuWidgetCmd procedure, "index" option} {
751    catch {destroy .m1}
752    menu .m1
753    list [catch {.m1 index foo} msg] $msg [destroy .m1]
754} {1 {bad menu entry index "foo"} {}}
755test menu-3.41 {MenuWidgetCmd procedure, "index" option} {
756    catch {destroy .m1}
757    menu .m1
758    .m1 add command -label "test"
759    list [catch {.m1 index "test"} msg] $msg [destroy .m1]
760} {0 1 {}}
761test menu-3.42 {MenuWidgetCmd procedure, "insert" option} {
762    catch {destroy .m1}
763    menu .m1
764    list [catch {.m1 insert} msg] $msg [destroy .m1]
765} {1 {wrong # args: should be ".m1 insert index type ?options?"} {}}
766test menu-3.43 {MenuWidgetCmd procedure, "insert" option} {
767    catch {destroy .m1}
768    menu .m1
769    .m1 insert 1 command -label "test"
770    list [catch {.m1 entrycget 1 -label} msg] $msg [destroy .m1]
771} {0 test {}}
772test menu-3.44 {MenuWidgetCmd procedure, "invoke" option} {
773    catch {destroy .m1}
774    menu .m1
775    list [catch {.m1 invoke} msg] $msg [destroy .m1]
776} {1 {wrong # args: should be ".m1 invoke index"} {}}
777test menu-3.45 {MenuWidgetCmd procedure, "invoke" option} {
778    catch {destroy .m1}
779    menu .m1
780    list [catch {.m1 invoke foo} msg] $msg [destroy .m1]
781} {1 {bad menu entry index "foo"} {}}
782test menu-3.46 {MenuWidgetCmd procedure, "invoke" option} {
783    catch {destroy .m1}
784    catch {unset foo}
785    menu .m1
786    .m1 add command -label "set foo" -command "set foo hello"
787    list [catch {.m1 invoke 1} msg] $msg [catch {set foo} msg2] $msg2 [catch {unset foo} msg3] $msg3 [destroy .m1]
788} {0 hello 0 hello 0 {} {}}
789test menu-3.47 {MenuWidgetCmd procedure, "post" option} {
790    catch {destroy .m1}
791    menu .m1
792    .m1 add command -label "On Windows, hit Escape to get this menu to go away"
793    list [catch {.m1 post} msg] $msg [destroy .m1]
794} {1 {wrong # args: should be ".m1 post x y"} {}}
795test menu-3.48 {MenuWidgetCmd procedure, "post" option} {
796    catch {destroy .m1}
797    menu .m1
798    list [catch {.m1 post foo 40} msg] $msg [destroy .m1]
799} {1 {expected integer but got "foo"} {}}
800test menu-3.49 {MenuWidgetCmd procedure, "post" option} {
801    catch {destroy .m1}
802    menu .m1
803    list [catch {.m1 post 40 bar} msg] $msg [destroy .m1]
804} {1 {expected integer but got "bar"} {}}
805test menu-3.50 {MenuWidgetCmd procedure, "post" option} {nonUnixUserInteraction } {
806    catch {destroy .m1}
807    menu .m1
808    .m1 add command -label "menu-3.53: hit Escape" -command "puts hello"
809    list [catch {.m1 post 40 40} msg] $msg [destroy .m1]
810} {0 {} {}}
811test menu-3.51 {MenuWidgetCmd procedure, "postcascade" option} {
812    catch {destroy .m1}
813    menu .m1
814    list [catch {.m1 postcascade} msg] $msg [destroy .m1]
815} {1 {wrong # args: should be ".m1 postcascade index"} {}}
816test menu-3.52 {MenuWidgetCmd procedure, "postcascade" option} {
817    catch {destroy .m1}
818    menu .m1
819    list [catch {.m1 postcascade foo} msg] $msg [destroy .m1]
820} {1 {bad menu entry index "foo"} {}}
821test menu-3.53 {MenuWidgetCmd procedure, "postcascade" option} {nonUnixUserInteraction } {
822    catch {destroy .m1}
823    catch {destroy .m2}
824    menu .m1
825    .m1 add command -label "menu-3.56 - hit Escape"
826    menu .m2
827    .m1 post 40 40
828    .m1 add cascade -menu .m2
829    list [catch {.m1 postcascade 1} msg] $msg [destroy .m1 .m2]
830} {0 {} {}}
831test menu-3.54 {MenuWidgetCmd procedure, "postcascade" option} {
832    catch {destroy .m1}
833    catch {destroy .m2}
834    menu .m1
835    menu .m2
836    .m1 add cascade -menu .m2 -label "menu-3.57 - hit Escape"
837    .m1 postcascade 1
838    list [catch {.m1 postcascade none} msg] $msg [destroy .m1 .m2]
839} {0 {} {}}
840test menu-3.55 {MenuWidgetCmd procedure, "type" option} {
841    catch {destroy .m1}
842    menu .m1
843    list [catch {.m1 type} msg] $msg [destroy .m1]
844} {1 {wrong # args: should be ".m1 type index"} {}}
845test menu-3.56 {MenuWidgetCmd procedure, "type" option} {
846    catch {destroy .m1}
847    menu .m1
848    list [catch {.m1 type foo} msg] $msg [destroy .m1]
849} {1 {bad menu entry index "foo"} {}}
850test menu-3.57 {MenuWidgetCmd procedure, "type" option} {
851    catch {destroy .m1}
852    menu .m1
853    .m1 add command -label "test"
854    list [catch {.m1 type 1} msg] $msg [destroy .m1]
855} {0 command {}}
856test menu-3.58 {MenuWidgetCmd procedure, "type" option} {
857    catch {destroy .m1}
858    menu .m1
859    .m1 add separator
860    list [catch {.m1 type 1} msg] $msg [destroy .m1]
861} {0 separator {}}
862test menu-3.59 {MenuWidgetCmd procedure, "type" option} {
863    catch {destroy .m1}
864    menu .m1
865    .m1 add checkbutton -label "test"
866    list [catch {.m1 type 1} msg] $msg [destroy .m1]
867} {0 checkbutton {}}
868test menu-3.60 {MenuWidgetCmd procedure, "type" option} {
869    catch {destroy .m1}
870    menu .m1
871    .m1 add radiobutton -label "test"
872    list [catch {.m1 type 1} msg] $msg [destroy .m1]
873} {0 radiobutton {}}
874test menu-3.61 {MenuWidgetCmd procedure, "type" option} {
875    catch {destroy .m1}
876    menu .m1
877    .m1 add cascade -label "test"
878    list [catch {.m1 type 1} msg] $msg [destroy .m1]
879} {0 cascade {}}
880test menu-3.62 {MenuWidgetCmd procedure, "type" option} {
881    catch {destroy .m1}
882    menu .m1
883    list [catch {.m1 type 0} msg] $msg [destroy .m1]
884} {0 tearoff {}}
885test menu-3.63 {MenuWidgetCmd procedure, "unpost" option} {
886    catch {destroy .m1}
887    menu .m1
888    list [catch {.m1 unpost foo} msg] $msg [destroy .m1]
889} {1 {wrong # args: should be ".m1 unpost"} {}}
890test menu-3.64 {MenuWidgetCmd procedure, "unpost" option} {nonUnixUserInteraction } {
891    catch {destroy .m1}
892    menu .m1
893    .m1 add command -label "menu-3.68 - hit Escape"
894    .m1 post 40 40 
895    list [catch {.m1 unpost} msg] $msg [destroy .m1]
896} {0 {} {}}
897test menu-3.65 {MenuWidgetCmd procedure, "yposition" option} {
898    catch {destroy .m1}
899    menu .m1
900    list [catch {.m1 yposition} msg] $msg [destroy .m1]
901} {1 {wrong # args: should be ".m1 yposition index"} {}}
902test menu-3.66 {MenuWidgetCmd procedure, "yposition" option} {
903    catch {destroy .m1}
904    menu .m1
905    list [catch {.m1 yposition 1}] [destroy .m1]
906} {0 {}}
907test menu-3.67 {MenuWidgetCmd procedure, bad option} {
908    catch {destroy .m1}
909    menu .m1
910    list [catch {.m1 foo} msg] $msg [destroy .m1]
911} {1 {bad option "foo": must be activate, add, cget, clone, configure, delete, entrycget, entryconfigure, index, insert, invoke, post, postcascade, type, unpost, xposition, or yposition} {}}
912test menu-3.68 {MenuWidgetCmd procedure, fix for bug#508988} {
913    set t .t
914    set m1 .t.m1
915    set c1 .t.c1
916    set c2 .t.c2
917    toplevel .t
918    menu $m1 -tearoff 1
919    menu $c1 -tearoff 1
920    $c1 add command -label c1
921    menu $c2 -tearoff 1
922    $c2 add command -label c2
923    $m1 add cascade -label c1 -menu $c1
924    $t configure -menu $m1
925    $m1 entryconfigure 1 -menu $c2 -label c2
926    $t configure -menu ""
927    set l [list [winfo exists $c1] [winfo exists $c2]]
928    destroy $t;
929    set l;
930} {1 1}
931test menu-3.69 {MenuWidgetCmd procedure, "xposition" option} -setup {
932    catch {destroy .m1}
933    menu .m1
934} -body {
935    .m1 xposition
936} -cleanup {
937    destroy .m1
938} -returnCodes error -result {wrong # args: should be ".m1 xposition index"}
939test menu-3.70 {MenuWidgetCmd procedure, "xposition" option} -setup {
940    catch {destroy .m1}
941    menu .m1
942} -body {
943    .m1 xposition 1
944    subst {} ;# just checking that the xposition does not produce an error...
945} -cleanup {
946    destroy .m1
947} -result {}
948
949test menu-4.1 {TkInvokeMenu: disabled} {
950    catch {destroy .m1}
951    catch {unset foo}
952    menu .m1
953    .m1 add checkbutton -label "test" -variable foo -onvalue on -offvalue off \
954	-state disabled
955    list [catch {.m1 invoke 1} msg] [destroy .m1] $foo
956} {0 {} off}
957test menu-4.2 {TkInvokeMenu: tearoff} {
958    catch {destroy .m1}
959    menu .m1
960    list [catch {.m1 invoke 0} msg] [destroy .m1]
961} {0 {}}
962test menu-4.3 {TkInvokeMenu: checkbutton -on} {
963    catch {destroy .m1}
964    catch {unset foo}
965    menu .m1
966    .m1 add checkbutton -label "test" -variable foo -onvalue on -offvalue off
967    list [catch {.m1 invoke 1} msg] $msg [catch {set foo} msg2] $msg2 [catch {unset foo} msg3] $msg3 [destroy .m1]
968} {0 {} 0 on 0 {} {}}
969test menu-4.4 {TkInvokeMenu: checkbutton -off} {
970    catch {destroy .m1}
971    catch {unset foo}
972    menu .m1
973    .m1 add checkbutton -label "test" -variable foo -onvalue on -offvalue off
974    .m1 invoke 1
975    list [catch {.m1 invoke 1} msg] $msg [catch {set foo} msg2] $msg2 [catch {unset foo} msg3] $msg3 [destroy .m1]
976} {0 {} 0 off 0 {} {}}
977test menu-4.5 {TkInvokeMenu: checkbutton array element} {
978    catch {destroy .m1}
979    catch {unset foo}
980    menu .m1
981    .m1 add checkbutton -label "test" -variable foo(1) -onvalue on 
982    list [catch {.m1 invoke 1} msg] $msg [catch {set foo(1)} msg2] $msg2 [catch {unset foo} msg3] $msg3 [destroy .m1]
983} {0 {} 0 on 0 {} {}}
984test menu-4.6 {TkInvokeMenu: radiobutton} {
985    catch {destroy .m1}
986    catch {unset foo}
987    menu .m1
988    .m1 add radiobutton -label "1" -variable foo -value one
989    .m1 add radiobutton -label "2" -variable foo -value two
990    .m1 add radiobutton -label "3" -variable foo -value three
991    list [catch {.m1 invoke 1} msg] $msg [catch {set foo} msg2] $msg2 [catch {unset foo} msg3] $msg3 [destroy .m1]
992} {0 {} 0 one 0 {} {}}
993test menu-4.7 {TkInvokeMenu: radiobutton} {
994    catch {destroy .m1}
995    catch {unset foo}
996    menu .m1
997    .m1 add radiobutton -label "1" -variable foo -value one
998    .m1 add radiobutton -label "2" -variable foo -value two
999    .m1 add radiobutton -label "3" -variable foo -value three
1000    list [catch {.m1 invoke 2} msg] $msg [catch {set foo} msg2] $msg2 [catch {unset foo} msg3] $msg3 [destroy .m1]
1001} {0 {} 0 two 0 {} {}}
1002test menu-4.8 {TkInvokeMenu: radiobutton} {
1003    catch {destroy .m1}
1004    catch {unset foo}
1005    menu .m1
1006    .m1 add radiobutton -label "1" -variable foo -value one
1007    .m1 add radiobutton -label "2" -variable foo -value two
1008    .m1 add radiobutton -label "3" -variable foo -value three
1009    list [catch {.m1 invoke 3} msg] $msg [catch {set foo} msg2] $msg2 [catch {unset foo} msg3] $msg3 [destroy .m1]
1010} {0 {} 0 three 0 {} {}}
1011test menu-4.9 {TkInvokeMenu: radiobutton array element} {
1012    catch {destroy .m1}
1013    catch {unset foo}
1014    menu .m1
1015    .m1 add radiobutton -label "1" -variable foo(2) -value one
1016    .m1 add radiobutton -label "2" -variable foo(2) -value two
1017    .m1 add radiobutton -label "3" -variable foo(2) -value three
1018    list [catch {.m1 invoke 3} msg] $msg [catch {set foo(2)} msg2] $msg2 [catch {unset foo} msg3] $msg3 [destroy .m1]
1019} {0 {} 0 three 0 {} {}}
1020test menu-4.10 {TkInvokeMenu} {
1021    catch {destroy .m1}
1022    catch {unset menu_test}
1023    menu .m1
1024    .m1 add command -label "test" -command "set menu_test menu-4.8"
1025    list [catch {.m1 invoke 1} msg] $msg [catch {set menu_test} msg2] $msg2 [catch {unset menu_test} msg3] $msg3 [destroy .m1]
1026} {0 menu-4.8 0 menu-4.8 0 {} {}}
1027test menu-4.11 {TkInvokeMenu} {
1028    catch {destroy .m1}
1029    menu .m1
1030    .m1 add cascade -label "test" -menu .m1.m2
1031    list [catch {.m1 invoke 1} msg] $msg [destroy .m1]
1032} {0 {} {}}
1033test menu-4.12 {TkInvokeMenu} {
1034    catch {destroy .m1}
1035    menu .m1
1036    .m1 add command -label "test" -command ".m1 delete 1"
1037    list [catch {.m1 invoke 1} msg] $msg [catch {.m1 type "test"} msg2] $msg2 [destroy .m1]
1038} {0 {} 1 {bad menu entry index "test"} {}}
1039
1040test menu-5.1 {DestroyMenuInstance} {
1041    catch {destroy .m1}
1042    menu .m1
1043    list [catch {destroy .m1} msg] $msg
1044} {0 {}}
1045test menu-5.2 {DestroyMenuInstance - cascade menu} {
1046    catch {destroy .m1}
1047    catch {destroy .m2}
1048    menu .m1
1049    .m1 add cascade -menu .m2
1050    menu .m2
1051    list [catch {destroy .m2} msg] $msg [destroy .m1]
1052} {0 {} {}}
1053test menu-5.3 {DestroyMenuInstance - multiple cascade parents} {
1054    catch {destroy .m1}
1055    catch {destroy .m2}
1056    catch {destroy .m3}
1057    menu .m1
1058    .m1 add cascade -menu .m3
1059    menu .m2
1060    .m2 add cascade -menu .m3
1061    menu .m3
1062    list [catch {destroy .m3} msg] $msg [destroy .m1 .m2]
1063} {0 {} {}}
1064test menu-5.4 {DestroyMenuInstance - multiple cascade parents} {
1065    catch {destroy .m1}
1066    catch {destroy .m2}
1067    catch {destroy .m3}
1068    catch {destroy .m4}
1069    menu .m1
1070    .m1 add cascade -menu .m4
1071    menu .m2
1072    .m2 add cascade -menu .m4
1073    menu .m3
1074    .m3 add cascade -menu .m4
1075    menu .m4
1076    list [catch {destroy .m4} msg] $msg [destroy .m1 .m2 .m3]
1077} {0 {} {}}
1078test menu-5.5 {DestroyMenuInstance - cascades of cloned menus} {
1079    catch {destroy .m1}
1080    catch {destroy .m2}
1081    menu .m1
1082    menu .m2
1083    .m1 add cascade -menu .m2
1084    . configure -menu .m1
1085    list [catch {destroy .m2} msg] $msg [.m1 entrycget 1 -menu] [. configure -menu ""] [destroy .m1]
1086} {0 {} .m2 {} {}}
1087test menu-5.6 {DestroyMenuInstance - cascades of cloned menus} {
1088    catch {destroy .m1}
1089    catch {destroy .m2}
1090    catch {destroy .t2}
1091    menu .m1
1092    .m1 add cascade -menu .m2
1093    menu .m2
1094    . configure -menu .m1
1095    toplevel .t2
1096    wm geometry .t2 +0+0
1097    .t2 configure -menu .m1
1098    list [catch {destroy .m2} msg] $msg [. configure -menu ""] [destroy .t2 .m1]
1099} {0 {} {} {}}
1100test menu-5.7 {DestroyMenuInstance - basic clones} {
1101    catch {destroy .m1}
1102    menu .m1
1103    set tearoff [tk::TearOffMenu .m1]
1104    list [catch {destroy $tearoff} msg] $msg [destroy .m1]
1105} {0 {} {}}
1106test menu-5.8 {DestroyMenuInstance - multiple clones} {
1107    catch {destroy .m1}
1108    menu .m1
1109    set tearoff1 [tk::TearOffMenu .m1]
1110    set tearoff2 [tk::TearOffMenu .m1]
1111    list [catch {destroy $tearoff1} msg] $msg [destroy .m1]
1112} {0 {} {}}
1113test menu-5.9 {DestroyMenuInstace - master menu} {
1114    catch {destroy .m1}
1115    menu .m1
1116    tk::TearOffMenu .m1
1117    list [catch {destroy .m1} msg] $msg
1118} {0 {}}
1119test menu-5.10 {DestroyMenuInstance - freeing entries} {
1120    catch {destroy .m1}
1121    menu .m1
1122    .m1 add command -label "foo"
1123    list [catch {destroy .m1} msg] $msg
1124} {0 {}}
1125test menu-5.11 {DestroyMenuInstace - no entries} {
1126    catch {destroy .m1}
1127    menu .m1
1128    .m1 configure -tearoff 0
1129    list [catch {destroy .m1} msg] $msg
1130} {0 {}}
1131test menu-5.12 {DestroyMenuInstance - platform data} {
1132    catch {destroy .m1}
1133    menu .m1
1134    list [catch {destroy .m1} msg] $msg
1135} {0 {}}
1136test menu-5.13 {DestroyMenuInstance - clones when mismatched tearoffs} {
1137    catch {destroy .m1}
1138    catch {destroy .m2}
1139    menu .m1
1140    menu .m2
1141    .m1 add cascade -menu .m2
1142    set tearoff [tk::TearOffMenu .m1 40 40]
1143    list [destroy .m2] [destroy .m1]
1144} {{} {}}
1145
1146test menu-6.1 {TkDestroyMenu} {
1147    catch {destroy .m1}
1148    menu .m1
1149    list [catch {destroy .m1} msg] $msg
1150} {0 {}}
1151test menu-6.2 {TkDestroyMenu - reentrancy} {
1152    catch {destroy .m1}
1153    catch {destroy .m2}
1154    menu .m1
1155    bind .m1 <Destroy> {destroy .m1}
1156    menu .m2
1157    bind .m2 <Destroy> {destroy .m2}
1158    list [catch {destroy .m1} msg] $msg [destroy .m2]
1159} {0 {} {}}
1160test menu-6.3 {TkDestroyMenu - reentrancy} {
1161    catch {destroy .m1}
1162    catch {destroy .m2}
1163    catch {destroy .m3}
1164    menu .m1
1165    bind .m1 <Destroy> {destroy .m2}
1166    .m1 clone .m2
1167    .m1 clone .m3
1168    list [catch {destroy .m1} msg] $msg [winfo exists .m2]
1169} {0 {} 0}
1170test menu-6.4 {TkDestroyMenu - reentrancy - clones} {
1171    catch {destroy .m1}
1172    catch {destroy .m2}
1173    menu .m1
1174    .m1 clone .m2
1175    .m1 clone .m1.m3
1176    list [catch {destroy .m1} msg] $msg
1177} {0 {}}
1178test menu-6.5 {TkDestroyMenu} {
1179    catch {destroy .m1}
1180    catch {destroy .m2}
1181    menu .m1
1182    .m1 clone .m2
1183    destroy .m1
1184    winfo exists .m2
1185} {0}
1186test menu-6.6 {TkDestroyMenu} {
1187    catch {destroy .m1}
1188    catch {destroy .m2}
1189    menu .m1
1190    .m1 clone .m2 tearoff
1191    list [catch {destroy .m1} msg] $msg
1192} {0 {}}
1193test menu-6.7 {TkDestroyMenu} {
1194    catch {destroy .m1}
1195    catch {destroy .m2}
1196    menu .m1
1197    .m1 clone .m2
1198    destroy .m2
1199    list [catch {destroy .m1} msg] $msg
1200} {0 {}}
1201test menu-6.8 {TkDestroyMenu} {
1202    catch {destroy .m1}
1203    catch {destroy .m2}
1204    catch {destroy .m3}
1205    menu .m1
1206    .m1 clone .m2
1207    .m1 clone .m3
1208    destroy .m1
1209    list [winfo exists .m2] [winfo exists .m3]
1210} {0 0}
1211test menu-6.9 {TkDestroyMenu} {
1212    catch {destroy .m1}
1213    catch {destroy .m2}
1214    catch {destroy .m3}
1215    menu .m1
1216    .m1 clone .m2
1217    .m1 clone .m3
1218    list [catch {destroy .m2} msg] $msg [catch {destroy .m3} msg2] $msg2 [catch {destroy .m1} msg3] $msg3
1219} {0 {} 0 {} 0 {}}
1220test menu-6.10 {TkDestroyMenu} {
1221    catch {destroy .m1}
1222    catch {destroy .m2}
1223    catch {destroy .m3}
1224    menu .m1
1225    .m1 clone .m2
1226    .m1 clone .m3
1227    list [catch {destroy .m3} msg] $msg [catch {destroy .m1} msg2] $msg2
1228} {0 {} 0 {}}
1229test menu-6.11 {TkDestroyMenu} {
1230    catch {destroy .m1}
1231    catch {destroy .m2}
1232    catch {destroy .m3}
1233    catch {destroy .m4}
1234    menu .m1
1235    .m1 clone .m2
1236    .m1 clone .m3
1237    .m1 clone .m4
1238    list [catch {destroy .m2} msg1] $msg1 [catch {destroy .m1} msg2] $msg2
1239} {0 {} 0 {}}
1240test menu-6.12 {TkDestroyMenu} {
1241    catch {destroy .m1}
1242    catch {destroy .m2}
1243    catch {destroy .m3}
1244    catch {destroy .m4}
1245    menu .m1
1246    .m1 clone .m2
1247    .m1 clone .m3
1248    .m1 clone .m4
1249    list [catch {destroy .m3} msg1] $msg1 [catch {destroy .m1} msg2] $msg2
1250} {0 {} 0 {}}
1251test menu-6.13 {TkDestroyMenu} {
1252    catch {destroy .m1}
1253    catch {destroy .m2}
1254    catch {destroy .m3}
1255    catch {destroy .m4}
1256    menu .m1
1257    .m1 clone .m2
1258    .m1 clone .m3
1259    .m1 clone .m4
1260    list [catch {destroy .m4} msg1] $msg1 [catch {destroy .m1} msg2] $msg2
1261} {0 {} 0 {}}
1262test menu-6.14 {TkDestroyMenu} {
1263    catch {destroy .m1}
1264    menu .m1
1265    . configure -menu .m1
1266    list [catch {destroy .m1} msg] $msg [. configure -menu ""]
1267} {0 {} {}}
1268test menu-6.15 {TkDestroyMenu} {
1269    catch {destroy .m1}
1270    catch {destroy .t2}
1271    menu .m1
1272    toplevel .t2
1273    wm geometry .t2 +0+0
1274    . configure -menu .m1
1275    .t2 configure -menu .m1
1276    list [catch {destroy .m1} msg] $msg [destroy .t2] [. configure -menu ""]
1277} {0 {} {} {}}
1278test menu-6.16 {TkDestroyMenu} {
1279    catch {destroy .m1}
1280    catch {destroy .t2}
1281    catch {destroy .t3}
1282    menu .m1
1283    toplevel .t2
1284    wm geometry .t2 +0+0
1285    toplevel .t3
1286    wm geometry .t3 +0+0
1287    . configure -menu .m1
1288    .t2 configure -menu .m1
1289    .t3 configure -menu .m1
1290    list [catch {destroy .m1} msg] $msg [destroy .t2] [destroy .t3] [. configure -menu ""]
1291} {0 {} {} {} {}}
1292
1293test menu-7.1 {UnhookCascadeEntry} {
1294    catch {destroy .m1}
1295    menu .m1
1296    .m1 add command -label "test"
1297    list [catch {destroy .m1} msg] $msg
1298} {0 {}}
1299test menu-7.2 {UnhookCascadeEntry} {
1300    catch {destroy .m1}
1301    menu .m1
1302    .m1 add cascade -menu .m2
1303    list [catch {destroy .m1} msg] $msg
1304} {0 {}}
1305test menu-7.3 {UnhookCascadeEntry} {
1306    catch {destroy .m1}
1307    catch {destroy .m2}
1308    menu .m1
1309    menu .m2
1310    .m2 add cascade -menu .cascade
1311    .m1 add cascade -menu .cascade
1312    list [catch {destroy .m1} msg] $msg [destroy .m2]
1313} {0 {} {}}
1314test menu-7.4 {UnhookCascadeEntry} {
1315    catch {destroy .m1}
1316    catch {destroy .m2}
1317    menu .m1
1318    menu .m2
1319    .m1 add cascade -menu .cascade
1320    .m2 add cascade -menu .cascade
1321    list [catch {destroy .m1} msg] $msg [destroy .m2]
1322} {0 {} {}}
1323test menu-7.5 {UnhookCascadeEntry} {
1324    catch {destroy .m1}
1325    catch {destroy .m2}
1326    catch {destroy .m3}
1327    menu .m1
1328    menu .m2
1329    menu .m3
1330    .m1 add cascade -menu .cascade
1331    .m2 add cascade -menu .cascade
1332    .m3 add cascade -menu .cascade
1333    list [catch {destroy .m1} msg] $msg [destroy .m2 .m3]
1334} {0 {} {}}
1335test menu-7.6 {UnhookCascadeEntry} {
1336    catch {destroy .m1}
1337    catch {destroy .m2}
1338    catch {destroy .m3}
1339    menu .m1
1340    menu .m2
1341    menu .m3
1342    .m1 add cascade -menu .cascade
1343    .m2 add cascade -menu .cascade
1344    .m3 add cascade -menu .cascade
1345    list [catch {destroy .m2} msg] $msg [destroy .m1 .m3]
1346} {0 {} {}}
1347test menu-7.7 {UnhookCascadeEntry} {
1348    catch {destroy .m1}
1349    catch {destroy .m2}
1350    catch {destroy .m3}
1351    menu .m1
1352    menu .m2
1353    menu .m3
1354    .m1 add cascade -menu .cascade
1355    .m2 add cascade -menu .cascade
1356    .m3 add cascade -menu .cascade
1357    list [catch {destroy .m3} msg] $msg [destroy .m1 .m2]
1358} {0 {} {}}
1359test menu-7.8 {UnhookCascadeEntry} {
1360    catch {destroy .m1}
1361    catch {destroy .m2}
1362    menu .m1
1363    menu .m2
1364    .m1 add cascade -menu .m2
1365    list [catch {destroy .m1} msg] $msg [destroy .m2]
1366} {0 {} {}}
1367test menu-7.9 {UnhookCascadeEntry} {
1368    catch {destroy .m1}
1369    catch {destroy .m2}
1370    menu .m1
1371    menu .m2
1372    .m1 add cascade -menu .m2
1373    destroy .m1
1374    list [catch {destroy .m2} msg] $msg
1375} {0 {}}
1376
1377test menu-8.1 {DestroyMenuEntry} {
1378    catch {destroy .m1}
1379    catch {destroy .m2}
1380    menu .m1
1381    menu .m2
1382    .m1 add cascade -menu .m2
1383    list [catch {.m1 delete 1} msg] $msg [destroy .m1 .m2]
1384} {0 {} {}}
1385test menu-8.2 {DestroyMenuEntry} hasEarthPhoto {
1386    catch {image delete image1a}
1387    catch {destroy .m1}
1388    image create photo image1a -file $earthPhotoFile
1389    menu .m1
1390    .m1 add command -image image1a
1391    list [catch {.m1 delete 1} msg] $msg [destroy .m1] [image delete image1a]
1392} {0 {} {} {}}
1393test menu-8.3 {DestroyMenuEntry} testImageType {
1394    catch {eval image delete [image names]}
1395    catch {destroy .m1}
1396    image create test image1
1397    image create test image2
1398    menu .m1
1399    .m1 add checkbutton -image image1 -selectimage image2
1400    .m1 invoke 1
1401    list [catch {.m1 delete 1} msg] $msg [destroy .m1] [eval image delete [image names]]
1402} {0 {} {} {}}
1403test menu-8.4 {DestroyMenuEntry} {
1404    catch {destroy .m1}
1405    menu .m1
1406    .m1 add checkbutton -variable foo
1407    list [catch {.m1 delete 1} msg] $msg [destroy .m1]
1408} {0 {} {}} 
1409test menu-8.5 {DestroyMenuEntry} {
1410    catch {destroy .m1}
1411    menu .m1
1412    .m1 add command -label "test"
1413    list [catch {.m1 delete 1} msg] $msg [destroy .m1]
1414} {0 {} {}}
1415test menu-8.6 {DestroyMenuEntry} {
1416    catch {destroy .m1}
1417    menu .m1
1418    .m1 add command -label "one"
1419    .m1 add command -label "two"
1420    list [catch {.m1 delete 1} msg] $msg [.m1 entrycget 1 -label] [destroy .m1]
1421} {0 {} two {}}
1422test menu-8.7 {DestroyMenuEntry} {
1423    catch {destroy .m1}
1424    catch {destroy .m2}
1425    menu .m1
1426    .m1 add command -label "one"
1427    .m1 clone .m2 tearoff
1428    list [catch {.m2 delete 0} msg] $msg [destroy .m1]
1429} {0 {} {}}
1430
1431# test menu-9 - Can only change when fonts change on system, which cannot
1432# be done from tcl.
1433
1434test menu-9.1 {ConfigureMenu} {
1435    catch {destroy .m1}
1436    menu .m1
1437    list [catch {.m1 configure -postcommand "beep"} msg] $msg [.m1 cget -postcommand] [destroy .m1]    
1438} {0 {} beep {}}
1439test menu-9.2 {ConfigureMenu} {
1440    catch {destroy .m1}
1441    menu .m1
1442    .m1 add command -label "test"
1443    list [catch {.m1 configure -tearoff 0} msg] $msg [.m1 entrycget 1 -label] [destroy .m1]
1444} {0 {} test {}}
1445test menu-9.3 {ConfigureMenu} {
1446    catch {destroy .m1}
1447    menu .m1
1448    list [catch {.m1 configure -postcommand "beep"} msg] $msg [.m1 cget -postcommand] [destroy .m1]
1449} {0 {} beep {}}
1450test menu-9.4 {ConfigureMenu} {
1451    catch {destroy .m1}
1452    menu .m1
1453    .m1 add command -label "test"
1454    list [catch {.m1 configure -fg red} msg] $msg [destroy .m1]
1455} {0 {} {}}
1456test menu-9.5 {ConfigureMenu} {
1457    catch {destroy .m1}
1458    menu .m1
1459    .m1 add command -label "test"
1460    .m1 add command -label "two"
1461    list [catch {.m1 configure -fg red} msg] $msg [destroy .m1]
1462} {0 {} {}}
1463test menu-9.6 {ConfigureMenu} {
1464    catch {destroy .m1}
1465    menu .m1
1466    .m1 add command -label "test"
1467    .m1 add command -label "two"
1468    .m1 add command -label "three"
1469    list [catch {.m1 configure -fg red} msg] $msg [destroy .m1]
1470} {0 {} {}}
1471test menu-9.7 {ConfigureMenu} {
1472    catch {destroy .m1}
1473    catch {destroy .m2}
1474    menu .m1
1475    .m1 clone .m2 tearoff
1476    list [catch {.m1 configure -fg red} msg] $msg [.m2 cget -fg] [destroy .m1]
1477} {0 {} red {}}
1478test menu-9.8 {ConfigureMenu} {
1479    catch {destroy .m1}
1480    catch {destroy .m2}
1481    menu .m1
1482    .m1 clone .m2 tearoff
1483    list [catch {.m2 configure -fg red} msg] $msg [.m1 cget -fg] [destroy .m1]
1484} {0 {} red {}}
1485test menu-9.9 {ConfigureMenu} {
1486    catch {destroy .m1}
1487    menu .m1
1488    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""] [destroy .m1]
1489} {0 {} {} {}}
1490
1491test menu-10.1 {PostProcessEntry: array variable} {
1492    catch {destroy .m1}
1493    catch {unset foo}
1494    menu .m1
1495    set foo(1) on
1496    .m1 add checkbutton -variable foo(1) -onvalue on -offvalue off -label "Nonsense"
1497    list [catch {set foo(1)} msg] $msg [destroy .m1]
1498} {0 on {}}
1499test menu-10.2 {PostProcessEntry: array variable} {
1500    catch {destroy .m1}
1501    catch {unset foo}
1502    menu .m1
1503    .m1 add checkbutton -variable foo(1) -onvalue on -offvalue off -label "Nonsense"
1504    list [catch {set foo(1)} msg] $msg [destroy .m1]
1505} {0 off {}}
1506
1507test menu-11.1 {ConfigureMenuEntry} {
1508    catch {destroy .m1}
1509    catch {unset foo}
1510    menu .m1
1511    .m1 add checkbutton -variable foo -onvalue on -offvalue off -label "Nonsense"
1512    list [catch {.m1 entryconfigure 1 -variable bar} msg] $msg [.m1 entrycget 1 -variable] [destroy .m1]
1513} {0 {} bar {}}
1514test menu-11.2 {ConfigureMenuEntry} {
1515    catch {destroy .m1}
1516    menu .m1
1517    .m1 add command -label "test"
1518    list [catch {.m1 entryconfigure 1 -label ""} msg] $msg [.m1 entrycget 1 -label] [destroy .m1]
1519} {0 {} {} {}}
1520test menu-11.3 {ConfigureMenuEntry} {
1521    catch {destroy .m1}
1522    menu .m1
1523    .m1 add command
1524    list [catch {.m1 entryconfigure 1 -label "test"} cmd] $cmd [.m1 entrycget 1 -label] [destroy .m1]
1525} {0 {} test {}}
1526test menu-11.4 {ConfigureMenuEntry} {
1527    catch {destroy .m1}
1528    menu .m1 
1529    .m1 add command
1530    list [catch {.m1 entryconfigure 1 -accel "S"} msg] $msg [.m1 entrycget 1 -accel] [destroy .m1]
1531} {0 {} S {}}
1532test menu-11.5 {ConfigureMenuEntry} {
1533    catch {destroy .m1}
1534    menu .m1
1535    .m1 add command
1536    list [catch {.m1 entryconfigure 1 -label "test"} msg] $msg [.m1 entrycget 1 -label] [destroy .m1]
1537} {0 {} test {}}
1538test menu-11.6 {ConfigureMenuEntry} {
1539    catch {destroy .m1}
1540    menu .m1
1541    .m1 add command
1542    list [catch {.m1 entryconfigure 1 -label "test"} msg] $msg [destroy .m1]
1543} {0 {} {}}
1544test menu-11.7 {ConfigureMenuEntry} {
1545    catch {destroy .m1}
1546    catch {destroy .m2}
1547    menu .m2
1548    menu .m1
1549    .m1 add cascade
1550    list [catch {.m1 entryconfigure 1 -label "test" -menu .m2} msg] $msg [destroy .m1 .m2]
1551} {0 {} {}}
1552test menu-11.8 {ConfigureMenuEntry} {
1553    catch {destroy .m1}
1554    menu .m1
1555    .m1 add cascade
1556    list [catch {.m1 entryconfigure 1 -label "test" -menu .m2} msg] $msg [destroy .m1]
1557} {0 {} {}}
1558test menu-11.9 {ConfigureMenuEntry} {
1559    catch {destroy .m1}
1560    menu .m1
1561    .m1 add cascade -menu .m3
1562    list [catch {.m1 entryconfigure 1 -label "test" -menu .m2} msg] $msg [destroy .m1]
1563} {0 {} {}}
1564test menu-11.10 {ConfigureMenuEntry} {
1565    catch {destroy .m1}
1566    menu .m1
1567    .m1 add cascade
1568    list [catch {.m1 entryconfigure 1 -label "test" -menu .m2} msg] $msg [destroy .m1]
1569} {0 {} {}}
1570test menu-11.11 {ConfigureMenuEntry} {
1571    catch {destroy .m1}
1572    menu .m1
1573    .m1 add cascade -menu .m2
1574    list [catch {.m1 entryconfigure 1 -label "test" -menu .m2} msg] $msg [destroy .m1]
1575} {0 {} {}}
1576test menu-11.12 {ConfigureMenuEntry} {
1577    catch {destroy .m1}
1578    catch {destroy .m2}
1579    catch {destroy .m3}
1580    catch {destroy .m4}
1581    catch {destroy .m5}
1582    menu .m1
1583    menu .m2 
1584    .m2 add cascade -menu .m1
1585    menu .m3 
1586    .m3 add cascade -menu .m1
1587    menu .m4 
1588    .m4 add cascade -menu .m1
1589    menu .m5 
1590    .m5 add cascade
1591    list [catch {.m5 entryconfigure 1 -label "test" -menu .m1} msg] $msg [destroy .m1 .m2 .m3 .m4 .m5]
1592} {0 {} {}}
1593test menu-11.13 {ConfigureMenuEntry} {
1594    catch {destroy .m1}
1595    catch {destroy .m2}
1596    catch {destroy .m3}
1597    catch {destroy .m4}
1598    menu .m1
1599    menu .m2 
1600    .m2 add cascade -menu .m1
1601    menu .m3 
1602    .m3 add cascade -menu .m1
1603    menu .m4 
1604    .m4 add cascade -menu .m1
1605    list [catch {.m3 entryconfigure 1 -label "test" -menu .m1} msg] $msg [destroy .m1 .m2 .m3 .m4]
1606} {0 {} {}}
1607test menu-11.14 {ConfigureMenuEntry} {
1608    catch {destroy .m1}
1609    menu .m1
1610    .m1 add checkbutton
1611    list [catch {.m1 entryconfigure 1 -variable "test"} msg] $msg [.m1 entrycget 1 -variable] [destroy .m1]
1612} {0 {} test {}}
1613test menu-11.15 {ConfigureMenuEntry} {
1614    catch {destroy .m1}
1615    menu .m1
1616    list [catch {.m1 add checkbutton -label "test"} msg] $msg [.m1 entrycget 1 -variable] [destroy .m1]
1617} {0 {} test {}}
1618test menu-11.16 {ConfigureMenuEntry} {
1619    catch {destroy .m1}
1620    menu .m1
1621    list [catch {.m1 add radiobutton -label "test"} msg] $msg [destroy .m1]
1622} {0 {} {}}
1623test menu-11.17 {ConfigureMenuEntry} {
1624    catch {destroy .m1}
1625    menu .m1
1626    .m1 add checkbutton
1627    list [catch {.m1 entryconfigure 1 -onvalue "test"} msg] $msg [.m1 entrycget 1 -onvalue] [destroy .m1]
1628} {0 {} test {}}
1629test menu-11.18 {ConfigureMenuEntry} testImageType {
1630    catch {destroy .m1}
1631    catch {image delete image1}
1632    menu .m1
1633    .m1 add command
1634    image create test image1
1635    list [catch {.m1 entryconfigure 1 -image image1} msg] $msg [destroy .m1] [image delete image1]
1636} {0 {} {} {}}
1637test menu-11.19 {ConfigureMenuEntry} {testImageType hasEarthPhoto} {
1638    catch {destroy .m1}
1639    catch {image delete image1}
1640    catch {image delete image2}
1641    image create test image1
1642    image create photo image2 -file $earthPhotoFile
1643    menu .m1
1644    .m1 add command -image image1
1645    list [catch {.m1 entryconfigure 1 -image image2} msg] $msg [destroy .m1] [image delete image1] [image delete image2]
1646} {0 {} {} {} {}}
1647test menu-11.20 {ConfigureMenuEntry} {testImageType hasEarthPhoto} {
1648    catch {destroy .m1}
1649    catch {image delete image1}
1650    catch {image delete image2}
1651    image create photo image1 -file $earthPhotoFile
1652    image create test image2
1653    menu .m1
1654    .m1 add checkbutton -image image1
1655    list [catch {.m1 entryconfigure 1 -selectimage image2} msg] $msg [destroy .m1] [image delete image1] [image delete image2]
1656} {0 {} {} {} {}}
1657test menu-11.21 {ConfigureMenuEntry} {testImageType hasEarthPhoto} {
1658    catch {destroy .m1}
1659    catch {image delete image1}
1660    catch {image delete image2}
1661    catch {image delete image3}
1662    image create photo image1 -file $earthPhotoFile
1663    image create test image2
1664    image create test image3
1665    menu .m1
1666    .m1 add checkbutton -image image1 -selectimage image2
1667    list [catch {.m1 entryconfigure 1 -selectimage image3} msg] $msg [destroy .m1] [image delete image1] [image delete image2] [image delete image3]
1668} {0 {} {} {} {} {}}
1669
1670test menu-12.1 {ConfigureMenuCloneEntries} {
1671    catch {destroy .m1}
1672    catch {destroy .m2}
1673    catch {destroy .m3}
1674    menu .m1
1675    .m1 clone .m2
1676    .m2 configure -tearoff 0
1677    .m1 clone .m3
1678    .m1 add command -label "test"
1679    .m1 add command -label "test2"
1680    list [list [catch {.m1 entryconfigure 1 -gork "foo"} msg] $msg] [destroy .m1]
1681} {{1 {unknown option "-gork"}} {}}
1682test menu-12.2 {ConfigureMenuCloneEntries} {
1683    catch {destroy .m1}
1684    catch {destroy .m2}
1685    catch {destroy .m3}
1686    catch {destroy .m4}
1687    menu .m1
1688    .m1 clone .m2
1689    menu .m3
1690    .m1 add cascade -menu .m3
1691    menu .m4
1692    list [catch {.m1 entryconfigure 1 -menu .m4} msg] $msg [destroy .m1] [destroy .m3] [destroy .m4]
1693} {0 {} {} {} {}}
1694test menu-12.3 {ConfigureMenuCloneEntries} {
1695    catch {destroy .m1}
1696    catch {destroy .m2}
1697    menu .m1
1698    .m1 clone .m2
1699    .m1 add cascade -label dummy
1700    list [catch {.m1 entryconfigure dummy -menu .m3} msg] $msg [destroy .m1]
1701} {0 {} {}}
1702
1703test menu-12.4 {ConfigureMenuCloneEntries} {
1704     catch {destroy .m1}
1705     catch {destroy .m2}
1706     menu .m1
1707     .m1 add cascade -label File -menu .m1.foo
1708     menu .m1.foo
1709     .m1.foo add command -label bar
1710     .m1 clone .m2
1711     list [catch {.m1 entryconfigure File -state disabled} msg1] $msg1 [destroy .m1]
1712} {0 {} {}}
1713
1714test menu-13.1 {TkGetMenuIndex} {
1715    catch {destroy .m1}
1716    menu .m1
1717    .m1 add command -label "active"
1718    .m1 add command -label "test2"
1719    .m1 add command -label "test3"
1720    .m1 activate 2
1721    list [catch {.m1 entrycget active -label} msg] $msg [destroy .m1]
1722} {0 test2 {}}
1723test menu-13.2 {TkGetMenuIndex} {
1724    catch {destroy .m1}
1725    menu .m1
1726    .m1 add command -label "last"
1727    .m1 add command -label "test2"
1728    .m1 add command -label "test3"
1729    .m1 activate 2
1730    list [catch {.m1 entrycget last -label} msg] $msg [destroy .m1]
1731} {0 test3 {}}
1732test menu-13.3 {TkGetMenuIndex} {
1733    catch {destroy .m1}
1734    menu .m1
1735    .m1 add command -label "last"
1736    .m1 add command -label "test2"
1737    .m1 add command -label "test3"
1738    .m1 activate 2
1739    list [catch {.m1 entrycget end -label} msg] $msg [destroy .m1]
1740} {0 test3 {}}
1741test menu-13.4 {TkGetMenuIndex} {
1742    catch {destroy .m1}
1743    menu .m1
1744    .m1 add command -label "test"
1745    list [catch {.m1 insert last command -label "test2"} msg] $msg [.m1 entrycget last -label] [destroy .m1]
1746} {0 {} test2 {}}
1747test menu-13.5 {TkGetMenuIndex} {
1748    catch {destroy .m1}
1749    menu .m1
1750    .m1 add command -label "test"
1751    list [catch {.m1 insert end command -label "test2"} msg] $msg [.m1 entrycget end -label] [destroy .m1]
1752} {0 {} test2 {}}
1753test menu-13.6 {TkGetMenuIndex} {
1754    catch {destroy .m1}
1755    menu .m1
1756    .m1 add command -label "active"
1757    .m1 add command -label "test2"
1758    .m1 add command -label "test3"
1759    .m1 activate 2
1760    list [catch {.m1 entrycget none -label} msg] $msg [destroy .m1]
1761} {0 {} {}}
1762#test menu-13.7 - Need to add @test here.
1763test menu-13.7 {TkGetMenuIndex} {
1764    catch {destroy .m1}
1765    menu .m1
1766    .m1 add command -label "active"
1767    .m1 add command -label "test2"
1768    .m1 add command -label "test3"
1769    list [catch {.m1 entrycget 1 -label} msg] $msg [destroy .m1]
1770} {0 active {}}
1771test menu-13.8 {TkGetMenuIndex} {
1772    catch {destroy .m1}
1773    menu .m1
1774    .m1 add command -label "active"
1775    list [catch {.m1 entrycget -1 -label} msg] $msg [destroy .m1]
1776} {1 {bad menu entry index "-1"} {}}
1777test menu-13.9 {TkGetMenuIndex} {
1778    catch {destroy .m1}
1779    menu .m1
1780    .m1 add command -label "test"
1781    .m1 add command -label "test2"
1782    list [catch {.m1 entrycget 999 -label} msg] $msg [destroy .m1]
1783} {0 test2 {}}
1784test menu-13.10 {TkGetMenuIndex} {
1785    catch {destroy .m1}
1786    menu .m1
1787    .m1 insert 999 command -label "test"
1788    list [catch {.m1 entrycget 1 -label} msg] $msg [destroy .m1]
1789} {0 test {}}
1790test menu-13.11 {TkGetMenuIndex} {
1791    catch {destroy .m1}
1792    menu .m1
1793    .m1 add command -label "1test"
1794    list [catch {.m1 entrycget 1test -label} msg] $msg [destroy .m1]
1795} {0 1test {}}
1796test menu-13.12 {TkGetMenuIndex} {
1797    catch {destroy .m1}
1798    menu .m1
1799    .m1 add command -label "test"
1800    .m1 add command -label "test2" -command "beep"
1801    .m1 add command -label "test3"
1802    list [catch {.m1 entrycget test2 -command} msg] $msg [destroy .m1]
1803} {0 beep {}}
1804
1805test menu-14.1 {MenuCmdDeletedProc} {
1806    catch {destroy .m1}
1807    menu .m1
1808    list [catch {destroy .m1} msg] $msg
1809} {0 {}}
1810test menu-14.2 {MenuCmdDeletedProc} {
1811    catch {destroy .m1}
1812    menu .m1
1813    .m1 clone .m2
1814    list [catch {destroy .m1} msg] $msg
1815} {0 {}}
1816
1817test menu-15.1 {MenuNewEntry} {
1818    catch {destroy .m1}
1819    menu .m1
1820    list [catch {.m1 add command -label "test"} msg] $msg [destroy .m1]
1821} {0 {} {}}
1822test menu-15.2 {MenuNewEntry} {
1823    catch {destroy .m1}
1824    menu .m1
1825    .m1 add command -label "test"
1826    .m1 add command -label "test3"
1827    list [catch {.m1 insert 2 command -label "test2"} msg] $msg [destroy .m1]
1828} {0 {} {}}
1829test menu-15.3 {MenuNewEntry} {
1830    catch {destroy .m1}
1831    menu .m1
1832    .m1 add command -label "test"
1833    list [catch {.m1 add command -label "test2"} msg] $msg [destroy .m1]
1834} {0 {} {}}
1835test menu-15.4 {MenuNewEntry} {
1836    catch {destroy .m1}
1837    menu .m1
1838    list [catch {.m1 add command -label "test"} msg] $msg [destroy .m1]
1839} {0 {} {}}
1840
1841test menu-16.1 {MenuAddOrInsert} {
1842    catch {destroy .m1}
1843    menu .m1
1844    list [catch {.m1 insert foo command -label "test"} msg] $msg [destroy .m1]
1845} {1 {bad menu entry index "foo"} {}}
1846test menu-16.2 {MenuAddOrInsert} {
1847    catch {destroy .m1}
1848    menu .m1
1849    .m1 add command -label "test"
1850    list [catch {.m1 insert test command -label "foo"} msg] $msg [destroy .m1]
1851} {0 {} {}}
1852test menu-16.3 {MenuAddOrInsert} {
1853    catch {destroy .m1}
1854    menu .m1
1855    list [catch {.m1 insert -1 command -label "test"} msg] $msg [destroy .m1]
1856} {1 {bad menu entry index "-1"} {}}
1857test menu-16.4 {MenuAddOrInsert} {
1858    catch {destroy .m1}
1859    menu .m1
1860    .m1 add command -label "test"
1861    .m1 insert 0 command -label "test2"
1862    list [catch {.m1 entrycget 1 -label} msg] $msg [destroy .m1]
1863} {0 test2 {}}
1864test menu-16.5 {MenuAddOrInsert} {
1865    catch {destroy .m1}
1866    menu .m1
1867    list [catch {.m1 add cascade} msg] $msg [destroy .m1]
1868} {0 {} {}}
1869test menu-16.6 {MenuAddOrInsert} {
1870    catch {destroy .m1}
1871    menu .m1
1872    list [catch {.m1 add checkbutton} msg] $msg [destroy .m1]
1873} {0 {} {}}
1874test menu-16.7 {MenuAddOrInsert} {
1875    catch {destroy .m1}
1876    menu .m1
1877    list [catch {.m1 add command} msg] $msg [destroy .m1]
1878} {0 {} {}}
1879test menu-16.8 {MenuAddOrInsert} {
1880    catch {destroy .m1}
1881    menu .m1
1882    list [catch {.m1 add radiobutton} msg] $msg [destroy .m1]
1883} {0 {} {}}
1884test menu-16.9 {MenuAddOrInsert} {
1885    catch {destroy .m1}
1886    menu .m1
1887    list [catch {.m1 add separator} msg] $msg [destroy .m1]
1888} {0 {} {}}
1889test menu-16.10 {MenuAddOrInsert} {
1890    catch {destroy .m1}
1891    menu .m1
1892    list [catch {.m1 add blork} msg] $msg [destroy .m1]
1893} {1 {bad menu entry type "blork": must be cascade, checkbutton, command, radiobutton, or separator} {}}
1894test menu-16.11 {MenuAddOrInsert} {
1895    catch {destroy .m1}
1896    menu .m1
1897    list [catch {.m1 add command} msg] $msg [destroy .m1]
1898} {0 {} {}}
1899test menu-16.12 {MenuAddOrInsert} {
1900    catch {destroy .m1}
1901    catch {destroy .m2}
1902    catch {destroy .m3}
1903    menu .m1
1904    .m1 clone .m2
1905    .m2 clone .m3
1906    list [catch {.m2 add command -label "test"} msg1] $msg1 [catch {.m1 entrycget 1 -label} msg2] $msg2 [catch {.m3 entrycget 1 -label} msg3] $msg3 [destroy .m1]
1907} {0 {} 0 test 0 test {}}
1908test menu-16.13 {MenuAddOrInsert} {
1909    catch {destroy .m1}
1910    catch {destroy .m2}
1911    catch {destroy .m3}
1912    menu .m1
1913    .m1 clone .m2
1914    .m2 clone .m3
1915    list [catch {.m3 add command -label "test"} msg1] $msg1 [catch {.m1 entrycget 1 -label} msg2] $msg2 [catch {.m2 entrycget 1 -label} msg3] $msg3 [destroy .m1]
1916} {0 {} 0 test 0 test {}}
1917test menu-16.14 {MenuAddOrInsert} {
1918    catch {destroy .m1}
1919    menu .m1
1920    list [catch {.m1 add command -blork} msg] $msg [destroy .m1]
1921} {1 {unknown option "-blork"} {}}
1922test menu-16.15 {MenuAddOrInsert} {
1923    catch {destroy .m1}
1924    catch {destroy .container}
1925    menu .m1
1926    .m1 add command -label "File"
1927    menu .container
1928    . configure -menu .container
1929    list [catch {.container add cascade -label "File" -menu .m1} msg] $msg [. configure -menu ""] [destroy .container .m1]
1930} {0 {} {} {}}
1931test menu-16.16 {MenuAddOrInsert} {
1932    catch {destroy .m1}
1933    catch {destroy .m2}
1934    menu .m1
1935    menu .m2
1936    set tearoff [tk::TearOffMenu .m2]
1937    list [catch {.m2 add cascade -menu .m1} msg] $msg [$tearoff unpost] [catch {destroy .m1} msg2] $msg2 [catch {destroy .m2} msg3] $msg3
1938} {0 {} {} 0 {} 0 {}}
1939test menu-16.17 {MenuAddOrInsert} {
1940    catch {destroy .m1}
1941    catch {destroy .container}
1942    menu .m1
1943    menu .container
1944    . configure -menu .container
1945    set tearoff [tk::TearOffMenu .container]
1946    list [catch {.container add cascade -label "File" -menu .m1} msg] $msg [. configure -menu ""] [destroy .m1 .container]
1947} {0 {} {} {}}
1948test menu-16.18 {MenuAddOrInsert} {
1949    catch {destroy .m1}
1950    catch {destroy .container}
1951    menu .m1
1952    menu .container
1953    .container add cascade -menu .m1
1954    . configure -menu .container
1955    list [catch {.container add cascade -label "File" -menu .m1} msg] $msg [. configure -menu ""] [destroy .m1 .container]
1956} {0 {} {} {}}
1957test menu-16.19 {MenuAddOrInsert - Insert a cascade deep into the tree} {
1958    catch {destroy .menubar}
1959    menu .menubar
1960    menu .menubar.test -tearoff 0
1961    .menubar add cascade -label Test -underline 0 -menu .menubar.test
1962    menu .menubar.test.cascade -tearoff 0
1963    .menubar.test.cascade add command -label SubItem -command "puts SubItemSelected"
1964    . configure -menu .menubar
1965    list [catch {.menubar.test add cascade -label SubMenu \
1966	-menu .menubar.test.cascade} msg] \
1967	[info commands .\#menubar.\#menubar\#test.\#menubar\#test\#cascade] \
1968	[. configure -menu ""] [destroy .menubar]
1969} {0 .#menubar.#menubar#test.#menubar#test#cascade {} {}}
1970
1971test menu-17.1 {MenuVarProc} {
1972    catch {destroy .m1}
1973    catch {unset foo}
1974    menu .m1
1975    set foo "hello"
1976    list [catch {.m1 add checkbutton -variable foo -onvalue hello -offvalue goodbye} msg] $msg [catch {unset foo} msg2] $msg2 [destroy .m1]
1977} {0 {} 0 {} {}}
1978# menu-17.2 - Don't know how to generate the flags in the if
1979test menu-17.2 {MenuVarProc} {
1980    catch {destroy .m1}
1981    catch {unset foo}
1982    menu .m1
1983    list [catch {.m1 add checkbutton -variable foo -onvalue hello -offvalue goodbye} msg] $msg [set foo ""] [destroy .m1]
1984} {0 {} {} {}}
1985test menu-17.3 {MenuVarProc} {
1986    catch {destroy .m1}
1987    catch {unset foo}
1988    menu .m1
1989    set foo "hello"
1990    list [catch {.m1 add checkbutton -variable foo -onvalue hello -offvalue goodbye} msg] $msg [set foo "hello"] [destroy .m1] [catch {unset foo} msg2] $msg2
1991} {0 {} hello {} 0 {}}
1992test menu-17.4 {MenuVarProc} {
1993    catch {destroy .m1}
1994    menu .m1
1995    set foo "goodbye"
1996    list [catch {.m1 add checkbutton -variable foo -onvalue hello -offvalue goodbye} msg] $msg [set foo "hello"] [destroy .m1] [catch {unset foo} msg2] $msg2
1997} {0 {} hello {} 0 {}}
1998test menu-17.5 {MenuVarProc} {
1999    catch {destroy .m1}
2000    menu .m1
2001    set foo "hello"
2002    list [catch {.m1 add checkbutton -variable foo -onvalue hello -offvalue goodbye} msg] $msg [set foo "goodbye"] [destroy .m1] [catch {unset foo} msg2] $msg2
2003} {0 {} goodbye {} 0 {}}
2004
2005test menu-18.1 {TkActivateMenuEntry} {
2006    catch {destroy .m1}
2007    menu .m1
2008    .m1 add command -label "test"
2009    list [catch {.m1 activate 1} msg] $msg [destroy .m1]
2010} {0 {} {}}
2011test menu-18.2 {TkActivateMenuEntry} {
2012    catch {destroy .m1}
2013    menu .m1
2014    .m1 add command -label "test"
2015    list [catch {.m1 activate 0} msg] $msg [destroy .m1]
2016} {0 {} {}}
2017test menu-18.3 {TkActivateMenuEntry} {
2018    catch {destroy .m1}
2019    menu .m1
2020    .m1 add command -label "test"
2021    .m1 add command -label "test2"
2022    .m1 activate 1
2023    list [catch {.m1 activate 2} msg] $msg [destroy .m1]
2024} {0 {} {}}
2025test menu-18.4 {TkActivateMenuEntry} {
2026    catch {destroy .m1}
2027    menu .m1
2028    .m1 add command -label "test"
2029    .m1 add command -label "test2"
2030    .m1 activate 1
2031    list [catch {.m1 activate 1} msg] $msg [destroy .m1]
2032} {0 {} {}}
2033
2034test menu-19.1 {TkPostCommand} {nonUnixUserInteraction } {
2035    catch {destroy .m1}
2036    menu .m1 -postcommand "set menu_test menu-19.1"
2037    .m1 add command -label "menu-19.1 - hit Escape"
2038    list [catch {.m1 post 40 40} msg] $msg [.m1 unpost] [set menu_test] [destroy .m1]
2039} {0 menu-19.1 {} menu-19.1 {}}
2040test menu-19.2 {TkPostCommand} {nonUnixUserInteraction } {
2041    catch {destroy .m1}
2042    menu .m1
2043    .m1 add command -label "menu-19.2 - hit Escape"
2044    list [catch {.m1 post 40 40} msg] $msg [.m1 unpost] [destroy .m1]
2045} {0 {} {} {}}
2046
2047test menu-20.1 {CloneMenu} {
2048    catch {destroy .m1}
2049    catch {destroy .m2}
2050    menu .m1
2051    list [catch {.m1 clone .m2} msg1] $msg1 [destroy .m1]
2052} {0 {} {}}
2053test menu-20.2 {CloneMenu} {
2054    catch {destroy .m1}
2055    catch {destroy .m2}
2056    menu .m1
2057    list [catch {.m1 clone .m2 normal} msg1] $msg1 [destroy .m1]
2058} {0 {} {}}
2059test menu-20.3 {CloneMenu} {
2060    catch {destroy .m1}
2061    catch {destroy .m2}
2062    menu .m1
2063    list [catch {.m1 clone .m2 tearoff} msg1] $msg1 [destroy .m1]
2064} {0 {} {}}
2065test menu-20.4 {CloneMenu} {
2066    catch {destroy .m1}
2067    catch {destroy .m2}
2068    menu .m1
2069    list [catch {.m1 clone .m2 menubar} msg1] $msg1 [destroy .m1]
2070} {0 {} {}}
2071test menu-20.5 {CloneMenu} {
2072    catch {destroy .m1}
2073    catch {destroy .m2}
2074    menu .m1
2075    list [catch {.m1 clone .m2 foo} msg1] $msg1 [destroy .m1]
2076} {1 {bad menu type "foo": must be normal, tearoff, or menubar} {}}
2077test menu-20.6 {CloneMenu - hooking up bookeeping ptrs} {
2078    catch {destroy .m1}
2079    catch {destroy .m2}
2080    menu .m1
2081    list [catch {.m1 clone .m2} msg] $msg [destroy .m1]
2082} {0 {} {}}
2083test menu-20.7 {CloneMenu - hooking up bookeeping ptrs - multiple children} {
2084    catch {destroy .m1}
2085    catch {destroy .m2}
2086    catch {destroy .m3}
2087    menu .m1
2088    .m1 clone .m2
2089    list [catch {.m1 clone .m3} msg] $msg [destroy .m1]
2090} {0 {} {}}
2091test menu-20.8 {CloneMenu - cascade entries} {
2092    catch {destroy .m1}
2093    catch {destroy .foo}
2094    menu .m1
2095    .m1 add cascade -menu .m2
2096    list [catch {.m1 clone .foo} msg] $msg [destroy .m1]
2097} {0 {} {}}
2098test menu-20.9 {CloneMenu - cascades entries} {
2099    catch {destroy .m1}
2100    catch {destroy .m2}
2101    catch {destroy .foo}
2102    menu .m1
2103    .m1 add cascade -menu .m2
2104    menu .m2
2105    list [catch {.m1 clone .foo} msg] $msg [destroy .m1 .m2]
2106} {0 {} {}}
2107test menu-20.10 {CloneMenu - tearoff fields} {
2108    catch {destroy .m1}
2109    catch {destroy .m2}
2110    menu .m1
2111    list [catch {.m1 clone .m2 normal} msg1] $msg1 [catch {.m2 cget -tearoff} msg2] $msg2 [destroy .m1]
2112} {0 {} 0 1 {}}
2113test menu-20.11 {CloneMenu} {
2114    catch {destroy .m1}
2115    catch {destroy .m2}
2116    menu .m1
2117    menu .m2
2118    list [catch {.m1 clone .m2} msg] $msg [destroy .m1 .m2]
2119} {1 {window name "m2" already exists in parent} {}}
2120
2121test menu-21.1 {MenuDoYPosition} {
2122    catch {destroy .m1}
2123    menu .m1
2124    list [catch {.m1 yposition glorp} msg] $msg [destroy .m1]
2125} {1 {bad menu entry index "glorp"} {}}
2126test menu-21.2 {MenuDoYPosition} {
2127    catch {destroy .m1}
2128    menu .m1
2129    .m1 add command -label "Test"
2130    list [catch {.m1 yposition 1}] [destroy .m1]
2131} {0 {}}
2132
2133test menu-22.1 {GetIndexFromCoords} {
2134    catch {destroy .m1}
2135    menu .m1
2136    .m1 add command -label "test"
2137    .m1 configure -tearoff 0
2138    list [catch {.m1 index @5} msg] $msg [destroy .m1]
2139} {0 0 {}}
2140test menu-22.2 {GetIndexFromCoords} {
2141    catch {destroy .m1}
2142    menu .m1
2143    .m1 add command -label "test"
2144    .m1 configure -tearoff 0
2145    list [catch {.m1 index @5,5} msg] $msg [destroy .m1]
2146} {0 0 {}}
2147test menu-22.3 {GetIndexFromCoords: mapped window, y only} unix {
2148    catch {destroy .m1}
2149    menu .m1
2150    .m1 add command -label "test"
2151    .m1 configure -tearoff 0
2152    tk_popup .m1 0 0
2153    tkwait visibility .m1
2154    list [catch {.m1 index @5} msg] $msg [destroy .m1]
2155} {0 0 {}}
2156test menu-22.4 {GetIndexFromCoords: mapped window x,y} unix {
2157    catch {destroy .m1}
2158    menu .m1
2159    .m1 add command -label "test"
2160    .m1 configure -tearoff 0
2161    tk_popup .m1 0 0
2162    tkwait visibility .m1
2163    update
2164    set x [expr {[winfo width .m1] - [.m1 cget -borderwidth] - 1}]
2165    list [catch {.m1 index @$x,5} msg] $msg [destroy .m1]
2166} {0 0 {}}
2167test menu-22.5 {GetIndexFromCoords: mapped wide window} unix {
2168    catch {destroy .m1}
2169    menu .m1
2170    .m1 add command -label "test"
2171    .m1 configure -tearoff 0
2172    tk_popup .m1 0 0
2173    tkwait visibility .m1
2174    wm geometry .m1 200x100
2175    update
2176    set x [expr {[winfo width .m1] - [.m1 cget -borderwidth] - 1}]
2177    list [catch {.m1 index @$x,5} msg] $msg [destroy .m1]
2178} {0 0 {}}
2179
2180test menu-23.1 {RecursivelyDeleteMenu} {
2181    catch {destroy .m1}
2182    menu .m1
2183    . configure -menu .m1
2184    list [catch {. configure -menu ""} msg] $msg [destroy .m1]
2185} {0 {} {}}
2186test menu-23.2 {RecursivelyDeleteMenu} {
2187    catch {destroy .m1}
2188    catch {destroy .m2}
2189    menu .m2
2190    .m2 add command -label "test2"
2191    menu .m1
2192    .m1 add cascade -label "test1" -menu .m2
2193    . configure -menu .m1
2194    list [catch {. configure -menu ""} msg] $msg [destroy .m1 .m2]
2195} {0 {} {}}
2196
2197test menu-24.1 {TkNewMenuName} {
2198    catch {destroy .m1}
2199    menu .m1
2200    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""] [destroy .m1]
2201} {0 {} {} {}}
2202test menu-24.2 {TkNewMenuName} {
2203    catch {destroy .m1}
2204    catch {destroy .m1\#0}
2205    menu .m1
2206    menu .m1\#0
2207    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""] [destroy .m1]
2208} {0 {} {} {}}
2209test menu-24.3 {TkNewMenuName} {
2210    catch {destroy .#m}
2211    menu .#m
2212    rename .#m hideme
2213    list [catch {. configure -menu [menu .m]} $msg] [. configure -menu ""] [destroy .#m] [destroy .m] [destroy hideme]
2214} {0 {} {} {} {}}
2215
2216test menu-25.1 {TkSetWindowMenuBar} {
2217    . configure -menu ""
2218    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""]
2219} {0 {} {}}
2220test menu-25.2 {TkSetWindowMenuBar} {
2221    . configure -menu ""
2222    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""]
2223} {0 {} {}}
2224test menu-25.3 {TkSetWindowMenuBar} {
2225    . configure -menu ""
2226    catch {destroy .m1}
2227    menu .m1
2228    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""] [destroy .m1]
2229} {0 {} {} {}}
2230test menu-25.4 {TkSetWindowMenuBar} {
2231    catch {destroy .m1}
2232    catch {destroy .m2}
2233    . configure -menu ""
2234    menu .m1
2235    . configure -menu .m1
2236    menu .m2
2237    list [catch {. configure -menu .m2} msg] $msg [. configure -menu ""] [destroy .m1 .m2]
2238} {0 {} {} {}}
2239test menu-25.5 {TkSetWindowMenuBar} {
2240    catch {destroy .m1}
2241    catch {destroy .m2}
2242    catch {destroy .m3}
2243    . configure -menu ""
2244    menu .m1
2245    . configure -menu .m1
2246    .m1 clone .m2
2247    menu .m3
2248    list [catch {. configure -menu .m3} msg] $msg [. configure -menu ""] [destroy .m1 .m3]
2249} {0 {} {} {}}
2250test menu-25.6 {TkSetWindowMenuBar} {
2251    catch {destroy .m1}
2252    catch {destroy .m2}
2253    catch {destroy .m3}
2254    . configure -menu ""
2255    menu .m1
2256    .m1 clone .m2
2257    . configure -menu .m2
2258    menu .m3
2259    list [catch {. configure -menu .m3} msg] $msg [. configure -menu ""] [destroy .m1 .m3]
2260} {0 {} {} {}}
2261test menu-25.7 {TkSetWindowMenuBar} {
2262    catch {destroy .m1}
2263    catch {destroy .m2}
2264    . configure -menu ""
2265    menu .m1
2266    menu .m2
2267    . configure -menu .m1
2268    toplevel .t2
2269    .t2 configure -menu .m1
2270    list [catch {.t2 configure -menu .m2} msg] $msg [. configure -menu ""] [destroy .t2 .m1 .m2]
2271} {0 {} {} {}}
2272test menu-25.8 {TkSetWindowMenuBar} {
2273    catch {destroy .m1}
2274    catch {destroy .m2}
2275    catch {destroy .t2}
2276    . configure -menu ""
2277    menu .m1
2278    menu .m2
2279    . configure -menu .m1
2280    toplevel .t2
2281    wm geometry .t2 +0+0
2282    .t2 configure -menu .m1
2283    list [catch {. configure -menu .m2} msg] $msg [. configure -menu ""] [destroy .t2 .m1 .m2]
2284} {0 {} {} {}}
2285test menu-25.9 {TkSetWindowMenuBar} {
2286    catch {destroy .m1}
2287    catch {destroy .m2}
2288    catch {destroy .t2}
2289    catch {destroy .t3}
2290    . configure -menu ""
2291    menu .m1
2292    menu .m2
2293    . configure -menu .m1
2294    toplevel .t2 -menu .m1
2295    wm geometry .t2 +0+0
2296    toplevel .t3 -menu .m1
2297    wm geometry .t3 +0+0
2298    list [catch {.t3 configure -menu .m2} msg] $msg [. configure -menu ""] [destroy .t2 .t3 .m1 .m2]
2299} {0 {} {} {}}
2300test menu-25.10 {TkSetWindowMenuBar} {
2301    catch {destroy .m1}
2302    catch {destroy .m2}
2303    catch {destroy .t2}
2304    catch {destroy .t3}
2305    . configure -menu ""
2306    menu .m1
2307    menu .m2
2308    . configure -menu .m1
2309    toplevel .t2 -menu .m1
2310    wm geometry .t2 +0+0
2311    toplevel .t3 -menu .m1
2312    wm geometry .t3 +0+0
2313    list [catch {.t2 configure -menu .m2} msg] $msg [. configure -menu ""] [destroy .t2 .t3 .m1 .m2]
2314} {0 {} {} {}}
2315test menu-25.11 {TkSetWindowMenuBar} {
2316    catch {destroy .m1}
2317    catch {destroy .m2}
2318    catch {destroy .t2}
2319    catch {destroy .t3}
2320    . configure -menu ""
2321    menu .m1
2322    menu .m2
2323    . configure -menu .m1
2324    toplevel .t2 -menu .m1
2325    wm geometry .t2 +0+0
2326    toplevel .t3 -menu .m1
2327    wm geometry .t3 +0+0
2328    list [catch {. configure -menu .m2} msg] $msg [. configure -menu ""] [destroy .t2 .t3 .m1 .m2]
2329} {0 {} {} {}}
2330test menu-25.12 {TkSetWindowMenuBar} {
2331    catch {destroy .m1}
2332    . configure -menu ""
2333    menu .m1
2334    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""] [destroy .m1]
2335} {0 {} {} {}}
2336test menu-25.13 {TkSetWindowMenuBar} {
2337    . configure -menu ""
2338    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""]
2339} {0 {} {}}
2340test menu-25.14 {TkSetWindowMenuBar} {
2341    catch {destroy .m1}
2342    . configure -menu ""
2343    menu .m1
2344    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""] [destroy .m1]
2345} {0 {} {} {}}
2346test menu-25.15 {TkSetWindowMenuBar} {
2347    . configure -menu ""
2348    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""]
2349} {0 {} {}}
2350test menu-25.16 {TkSetWindowMenuBar} {
2351    catch {destroy .m1}
2352    . configure -menu ""
2353    menu .m1
2354    . configure -menu .m1
2355    list [catch {toplevel .t2 -menu m1} msg] $msg [. configure -menu ""] [destroy .t2 .m1]
2356} {0 .t2 {} {}}
2357
2358test menu-26.1 {DestroyMenuHashTable} {
2359    catch {interp destroy testinterp}
2360    interp create testinterp
2361    load {} Tk testinterp
2362    interp eval testinterp {menu .m1}
2363    list [catch {interp delete testinterp} msg] $msg
2364} {0 {}}
2365
2366test menu-27.1 {GetMenuHashTable} {
2367    catch {interp destroy testinterp}
2368    interp create testinterp
2369    load {} Tk testinterp
2370    list [catch {interp eval testinterp {menu .m1}} msg] $msg [interp delete testinterp]
2371} {0 .m1 {}}
2372
2373test menu-28.1 {TkCreateMenuReferences - not there before} {
2374    catch {destroy .m1}
2375    list [catch {menu .m1} msg] $msg [destroy .m1]
2376} {0 .m1 {}}
2377test menu-28.2 {TkCreateMenuReferences - there already} {
2378    catch {destroy .m1}
2379    catch {destroy .m2}
2380    menu .m1
2381    .m1 add cascade -menu .m2
2382    list [catch {menu .m2} msg] $msg [destroy .m1 .m2]
2383} {0 .m2 {}}
2384
2385test menu-29.1 {TkFindMenuReferences - not there} {
2386    catch {destroy .m1}
2387    . configure -menu ""
2388    menu .m1
2389    .m1 add cascade -menu .m2
2390    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""] [destroy .m1]
2391} {0 {} {} {}}
2392test menu-30.1 {TkFindMenuReferences - there already} {
2393    catch {destroy .m1}
2394    catch {destroy .m2}
2395    . configure -menu ""
2396    menu .m1
2397    menu .m2
2398    .m1 add cascade -menu .m2
2399    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""] [destroy .m1 .m2]
2400} {0 {} {} {}}
2401
2402test menu-31.1 {TkFreeMenuReferences - menuPtr} {
2403    catch {destroy .m1}
2404    menu .m1
2405    list [catch {destroy .m1} msg] $msg
2406} {0 {}}
2407test menu-31.2 {TkFreeMenuReferences - cascadePtr} {
2408    catch {destroy .m1}
2409    . configure -menu ""
2410    menu .m1
2411    .m1 add cascade -menu .m2
2412    list [catch {.m1 entryconfigure 1 -menu .m3} msg] $msg [destroy .m1]
2413} {0 {} {}}
2414test menu-31.3 {TkFreeMenuReferences - topLevelListPtr} {
2415    . configure -menu .m1
2416    list [catch {. configure -menu ""} msg] $msg
2417} {0 {}}
2418test menu-31.4 {TkFreeMenuReferences - not empty} {
2419    catch {destroy .m1}
2420    catch {destroy .m2}
2421    menu .m1
2422    .m1 add cascade -menu .m3
2423    menu .m2
2424    .m2 add cascade -menu .m3
2425    list [catch {.m2 entryconfigure 1 -menu ".foo"} msg] $msg [destroy .m1 .m2]
2426} {0 {} {}}
2427
2428test menu-32.1 {DeleteMenuCloneEntries} {
2429    catch {destroy .m1}
2430    catch {destroy .m2}
2431    menu .m1
2432    .m1 add command -label foo
2433    .m1 clone .m2
2434    list [catch {.m1 delete 1} msg] $msg [destroy .m1]
2435} {0 {} {}}
2436test menu-32.2 {DeleteMenuCloneEntries} {
2437    catch {destroy .m1}
2438    catch {destroy .m2}
2439    menu .m1
2440    .m1 add command -label one
2441    .m1 add command -label two
2442    .m1 add command -label three
2443    .m1 add command -label four
2444    .m1 clone .m2
2445    list [catch {.m1 delete 2 3} msg] $msg [destroy .m1]
2446} {0 {} {}}
2447test menu-32.3 {DeleteMenuCloneEntries} {
2448    catch {destroy .m1}
2449    catch {destroy .m2}
2450    menu .m1 -tearoff 0
2451    .m1 add command -label one
2452    .m1 add command -label two
2453    .m1 add command -label three
2454    .m1 add command -label four
2455    .m1 clone .m2
2456    .m2 configure -tearoff 1
2457    list [catch {.m1 delete 1 2} msg] $msg [destroy .m1]
2458} {0 {} {}}
2459test menu-32.4 {DeleteMenuCloneEntries} {
2460    catch {destroy .m1}
2461    catch {destroy .m2}
2462    menu .m1
2463    .m1 add command -label one
2464    .m1 add command -label two
2465    .m1 add command -label three
2466    .m1 add command -label four
2467    .m1 clone .m2
2468    .m2 configure -tearoff 0
2469    list [catch {.m1 delete 2 3} msg] $msg [destroy .m1]
2470} {0 {} {}}
2471test menu-32.5 {DeleteMenuCloneEntries} {
2472    catch {destroy .m1}
2473    catch {destroy .m2}
2474    menu .m1
2475    .m1 add command -label one
2476    .m1 add command -label two
2477    .m1 clone .m2
2478    .m1 activate one
2479    list [catch {.m1 delete one} msg] $msg [destroy .m1]
2480} {0 {} {}}
2481test menu-32.6 {DeleteMenuCloneEntries - reentrancy - crashes tk8.0} {
2482    catch {destroy .m1}
2483    menu .m1
2484    .m1 add command -label test -command ".m1 delete test ; .m1 add command -label test -command \".m1 delete test\"; .m1 delete test"
2485    list [catch {.m1 invoke test} msg] $msg [destroy .m1]
2486} {0 {} {}}
2487test menu-32.7 {DeleteMenuCloneEntries - one entry} {
2488    catch {destroy .m1}
2489    menu .m1 -tearoff 0
2490    .m1 add command -label Hello
2491    list [catch {.m1 delete Hello} msg] $msg [destroy .m1]
2492} {0 {} {}}
2493test menu-32.8 {Ensure all menu clone commands are deleted} {
2494    # SF bug #465324
2495    catch {destroy .menubar}
2496    catch {destroy .menubar.test}
2497    menu .menubar
2498    . configure -menu .menubar
2499    menu .menubar.test
2500    .menubar.test add command -label "hi"
2501    for {set i 0} {$i < 10} {incr i} {
2502	.menubar add cascade -menu .menubar.test -label "Test"
2503	.menubar delete Test
2504    }
2505
2506    info commands .#menubar*test*
2507} {}
2508test menu-32.9 {Ensure deleting of clones doesn't corrupt menu refs} {
2509    catch {destroy .menubar}
2510    catch {destroy .menubar.test}
2511    
2512    menu .menubar
2513    . configure -menu .menubar
2514    menu .menubar.test
2515    .menubar add cascade -menu .menubar.test -label "Test"
2516    menu .menubar.cascade
2517
2518    .menubar.test add cascade -menu .menubar.cascade -label "Cascade"
2519    set res {}
2520    lappend res [.menubar.test entrycget 1 -menu]
2521    lappend res [.#menubar.#menubar#test entrycget 1 -menu]
2522    destroy .menubar.test
2523    menu .menubar.test
2524    .menubar.test add cascade -menu .menubar.cascade -label "Cascade"
2525    lappend res [.menubar.test entrycget 1 -menu]
2526    lappend res [.#menubar.#menubar#test entrycget 1 -menu]
2527    set res
2528} {.menubar.cascade .#menubar.#menubar#test.#menubar#cascade .menubar.cascade .#menubar.#menubar#test.#menubar#cascade}
2529
2530set l [interp hidden]
2531deleteWindows
2532
2533test menu-33.1 {menu vs command hiding} {
2534    catch {destroy .m}
2535    menu .m
2536    interp hide {} .m
2537    destroy .m
2538    list [winfo children .] [interp hidden]
2539} [list {} $l]
2540
2541# menu-34 MenuInit only called at boot time
2542
2543# creating menus on two different screens then deleting the
2544# menu from the first screen crashes Tk8.3.1
2545#
2546test menu-35.1 {menus on multiple screens - crashes tk8.3.1, Bug 5454} \
2547	{altDisplay} {
2548    toplevel .one
2549    menu .one.m
2550    toplevel .two -screen $::env(TK_ALT_DISPLAY)
2551    menu .two.m
2552    destroy .one
2553    destroy .two
2554} {}
2555
2556test menu-36.1 {menu -underline string overruns Bug 1599877} {} {
2557    # ensure that -underline does not do string overruns [Bug 1599877]
2558    catch {destroy .m}
2559    menu .m
2560    .m add command -label "File" -underline [expr {1<<30}]
2561    . configure -menu .m
2562    update
2563    tk::TraverseToMenu . "e"
2564} {}
2565
2566# cleanup
2567deleteWindows
2568cleanupTests
2569return
2570