# This file is a Tcl script to test menus in Tk.  It is
# organized in the standard fashion for Tcl tests. This
# file tests the Macintosh-specific features of the menu
# system.
#
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.
#
# RCS: @(#) $Id: winMenu.test,v 1.1.1.1 1999/06/25 17:36:19 damon Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    source [file join [pwd] [file dirname [info script]] defs.tcl]
}

if {[lsearch [image types] test] < 0} {
    puts "This application hasn't been compiled with the \"test\" image"
    puts "type, so I can't run this test.  Are you sure you're using"
    puts "tktest instead of wish?"
    ::tcltest::cleanupTests
    return
}

proc deleteWindows {} {
    foreach i [winfo children .] {
    	catch [destroy $i]
    }
}

deleteWindows
wm geometry . {}
raise .

test winMenu-1.1 {GetNewID} {pcOnly} {
    catch {destroy .m1}
    list [catch {menu .m1} msg] $msg [destroy .m1]
} {0 .m1 {}}
# Basically impossible to test menu IDs wrapping.

test winMenu-2.1 {FreeID} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {destroy .m1} msg] $msg
} {0 {}}

test winMenu-3.1 {TkpNewMenu} {pcOnly} {
    catch {destroy .m1}
    list [catch {menu .m1} msg] $msg [catch {destroy .m1} msg2] $msg2
} {0 .m1 0 {}}
test winMenu-3.2 {TkpNewMenu} {pcOnly} {
    catch {destroy .m1}
    . configure -menu ""
    menu .m1
    .m1 add command -label "foo"
    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""] [catch {destroy .m1} msg2] $msg2
} {0 {} {} 0 {}}

test winMenu-4.1 {TkpDestroyMenu} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {destroy .m1} msg] $msg
} {0 {}}
test winMenu-4.2 {TkpDestroyMenu - help menu} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add cascade -menu .m1.system
    . configure -menu .m1
    list [catch {destroy .m1.system} msg] $msg [. configure -menu ""] [destroy .m1]
} {0 {} {} {}}

test winMenu-5.1 {TkpDestroyMenuEntry} {pcOnly} {
    catch {destroy .m1}
    . configure -menu ""
    menu .m1
    .m1 add command -label "test"
    update idletasks
    list [catch {.m1 delete 1} msg] $msg [destroy .m1]
} {0 {} {}}

test winMenu-6.1 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    list [catch {menu .m1} msg] $msg [destroy .m1]
} {0 .m1 {}}
test winMenu-6.2 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    catch {image delete image1}
    menu .m1
    image create test image1
    list [catch {.m1 add command -image image1} msg] $msg [destroy .m1] [image delete image1]
} {0 {} {} {}}
test winMenu-6.3 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command -bitmap questhead} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-6.4 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-6.5 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command -label "foo"} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-6.6 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command -label "This string has one & in it"} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-6.7 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command -label "The & should be underlined." -underline 4} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-6.8 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command -label "The * should be underlined." -underline 4} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-6.9 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command -label "foo" -accel "bar"} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-6.10 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command -label "This string has one & in it" -accel "bar"} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-6.11 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command -label "The & should be underlined." -underline 4 -accel "bar"} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-6.12 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command -label "The * should be underlined." -underline 4 -accel "bar"} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-6.13 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command -label "foo" -accel "&bar"} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-6.14 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command -label "This string has one & in it" -accel "&bar"} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-6.15 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command -label "The & should be underlined." -underline 4 -accel "&bar"} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-6.16 {GetEntryText} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command -label "The * should be underlined." -underline 4 -accel "&bar"} msg] $msg [destroy .m1]
} {0 {} {}}

test winMenu-7.1 {ReconfigureWindowsMenu - system menu item removal} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add cascade -menu .m1.system
    menu .m1.system
    .m1.system add command -label foo
    update idletasks
    .m1.system add command -label bar
    list [catch {update idletasks} msg] $msg [. configure -menu ""] [destroy .m1]
} {0 {} {} {}}
test winMenu-7.2 {ReconfigureWindowsMenu - menu item removal} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label Hello
    update idletasks
    .m1 add command -label foo
    list [catch {update idletasks} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-7.3 {ReconfigureWindowsMenu - zero items} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add command -label Hello
    .m1 delete Hello
    list [catch {update idletasks} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-7.4 {ReconfigureWindowsMenu - one item} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add command -label Hello
    list [catch {update idletasks} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-7.5 {ReconfigureWindowsMenu - two items} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add command -label One
    .m1 add command -label Two
    list [catch {update idletasks} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-7.6 {ReconfigureWindowsMenu - separator item} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add separator
    list [catch {update idletasks} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-7.7 {ReconfigureWindowsMenu - non-text item} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add command -label Hello
    list [catch {update idletasks} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-7.8 {ReconfigureWindowsMenu - disabled item} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add command -label Hello -state disabled
    list [catch {update idletasks} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-7.9 {ReconfigureWindowsMenu - non-selected checkbutton} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add checkbutton -label Hello
    list [catch {update idletasks} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-7.10 {ReconfigureWindowsMenu - non-selected radiobutton} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add radiobutton -label Hello
    list [catch {update idletasks} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-7.11 {ReconfigureWindowsMenu - selected checkbutton} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add checkbutton -label Hello
    .m1 invoke Hello
    list [catch {update idletasks} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-7.12 {ReconfigureWindowsMenu - selected radiobutton} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add radiobutton -label Hello
    .m1 invoke Hello
    list [catch {update idletasks} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-7.13 {ReconfigureWindowsMenu - cascade missing} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add cascade -label Hello
    list [catch {update idletasks} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-7.14 {ReconfigureWindowsMenu - cascade} {pcOnly} {
    catch {destroy .m1}
    catch {destroy .m2}
    menu .m1 -tearoff 0
    menu .m2
    .m1 add cascade -menu .m2 -label Hello
    list [catch {update idletasks} msg] $msg [destroy .m1] [destroy .m2]
} {0 {} {} {}}
test winMenu-7.15 {ReconfigureWindowsMenu - menubar without system menu} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add cascade -menu .m1.file
    menu .m1.file -tearoff 0
    . configure -menu .m1
    list [catch {update idletasks} msg] $msg [. configure -menu ""] [destroy .m1]
} {0 {} {} {}}
test winMenu-7.16 {ReconfigureWindowsMenu - system menu already created} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add cascade -menu .m1.system
    menu .m1.system -tearoff 0
    . configure -menu .m1
    update idletasks
    .m1.system add command -label Hello
    list [catch {update idletasks} msg] $msg [. configure -menu ""] [destroy .m1]
} {0 {} {} {}}
test winMenu-7.17 {ReconfigureWindowsMenu - system menu update pending} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add cascade -menu .m1.system
    menu .m1.system -tearoff 0
    . configure -menu .m1
    list [catch {update idletasks} msg] $msg [. configure -menu ""] [destroy .m1]
} {0 {} {} {}}
test winMenu-7.18 {ReconfigureWindowsMenu - system menu update not pending} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add cascade -menu .m1.system
    menu .m1.system -tearoff 0
    .m1.system add command -label Hello
    update idletasks
    . configure -menu .m1
    list [catch {update idletasks} msg] $msg [. configure -menu ""] [destroy .m1]
} {0 {} {} {}}
test winMenu-7.19 {ReconfigureWindowsMenu - column break} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add command -label one
    .m1 add command -label two -columnbreak 1
    list [catch {update idletasks} msg] $msg [destroy .m1]
} {0 {} {}}

#Don't know how to generate nested post menus
test winMenu-8.1 {TkpPostMenu} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -postcommand "blork"
    list [catch {.m1 post 40 40} msg] $msg [destroy .m1]
} {1 {invalid command name "blork"} {}}
test winMenu-8.2 {TkpPostMenu} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -postcommand "destroy .m1"
    list [.m1 post 40 40] [winfo exists .m1]
} {{} 0}
test winMenu-8.3 {TkpPostMenu - popup menu} {pcOnly userInteraction} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "winMenu-8.3: Hit ESCAPE."
    list [.m1 post 40 40] [destroy .m1]
} {{} {}}
test winMenu-8.4 {TkpPostMenu - menu button} {pcOnly userInteraction} {
    catch {destroy .mb}
    menubutton .mb -text test -menu .mb.menu
    menu .mb.menu
    .mb.menu add command -label "winMenu-8.4 - Hit ESCAPE."
    pack .mb
    list [tkMbPost .mb] [destroy .m1]
} {{} {}}
test winMenu-8.5 {TkpPostMenu - update not pending} {pcOnly userInteraction} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "winMenu-8.5 - Hit ESCAPE."
    update idletasks
    list [catch {.m1 post 40 40} msg] $msg [destroy .m1]
} {0 {} {}}

test winMenu-9.1 {TkpMenuNewEntry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [catch {.m1 add command} msg] $msg [destroy .m1]
} {0 {} {}}

test winMenu-10.1 {TkwinMenuProc} {pcOnly userInteraction} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "winMenu-10.1: Hit ESCAPE."
    list [.m1 post 40 40] [destroy .m1]
} {{} {}}

# Can't generate a WM_INITMENU without a Tk menu yet.
test winMenu-11.1 {TkWinHandleMenuEvent - WM_INITMENU} {pcOnly userInteraction} {
    catch {destroy .m1}
    catch {unset foo}
    menu .m1 -postcommand "set foo test"
    .m1 add command -label "winMenu-11.1: Hit ESCAPE."
    list [.m1 post 40 40] [set foo] [unset foo] [destroy .m1]
} {test test {} {}}
test winMenu-11.2 {TkWinHandleMenuEvent - WM_COMMAND} {pcOnly userInteraction} {
    catch {destroy .m1}
    catch {unset foo}
    menu .m1
    .m1 add checkbutton -variable foo -label "winMenu-11.2: Please select this menu item."
    list [.m1 post 40 40] [update] [set foo] [unset foo] [destroy .m1]
} {{} {} 1 {} {}}
test winMenu-11.3 {TkWinHandleMenuEvent - WM_COMMAND} {pcOnly userInteraction} {
    catch {destroy .m1}
    catch {unset foo}
    proc bgerror {args} {
	global foo errorInfo
	set foo [list $args $errorInfo]
    }
    menu .m1
    .m1 add command -command {error 1} -label "winMenu-11.2: Please select this menu item."
    list [.m1 post 40 40] [update] [set foo] [unset foo] [destroy .m1]
} {{} {} {1 {1
    while executing
"error 1"
    (menu invoke)}} {} {}}

# Can't test WM_MENUCHAR
test winMenu-11.4 {TkWinHandleMenuEvent - WM_MEASUREITEM} {pcOnly userInteraction} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "winMenu-11.3: Hit ESCAPE."
    list [.m1 post 40 40] [destroy .m1]
} {{} {}}
test winMenu-11.5 {TkWinHandleMenuEvent - WM_MEASUREITEM} {pcOnly userInteraction} {
    catch {destroy .m1}
    menu .m1
    .m1 add checkbutton -label "winMenu-11.4: Hit ESCAPE" -hidemargin 1
    list [.m1 post 40 40] [destroy .m1]
} {{} {}}
test winMenu-11.6 {TkWinHandleMenuEvent - WM_DRAWITEM} {pcOnly userInteraction} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "winMenu-11.5: Hit ESCAPE."
    list [.m1 post 40 40] [destroy .m1]
} {{} {}}
test winMenu-11.7 {TkWinHandleMenuEvent - WM_DRAWITEM - item disabled} \
	{pcOnly userInteraction} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "winMenu-11.6: Hit ESCAPE." -state disabled
    list [.m1 post 40 40] [destroy .m1]
} {{} {}}
test winMenu-11.8 {TkWinHandleMenuEvent - WM_INITMENU - not pending} \
	{pcOnly userInteraction} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add command -label "winMenu-11.7: Hit ESCAPE"
    update idletasks
    list [catch {.m1 post 40 40} msg] $msg [destroy .m1]
} {0 {} {}}

test winMenu-12.1 {TkpSetWindowMenuBar} {pcOnly} {
    catch {destroy .m1}
    . configure -menu ""
    menu .m1
    .m1 add command -label foo
    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""] [catch {destroy .m1} msg2] $msg2
} {0 {} {} 0 {}}
test winMenu-12.2 {TkpSetWindowMenuBar} {pcOnly} {
    catch {destroy .m1}
    . configure -menu ""
    menu .m1
    .m1 add command -label foo
    . configure -menu .m1
    list [catch {. configure -menu ""} msg] $msg [catch {destroy .m1} msg2] $msg2
} {0 {} 0 {}}
test winMenu-12.3 {TkpSetWindowMenuBar - no update pending} {pcOnly} {
    catch {destroy .m1}
    . configure -menu ""
    menu .m1 -tearoff 0
    .m1 add command -label foo
    update idletasks
    list [catch {. configure -menu .m1} msg] $msg [. configure -menu ""] [destroy .m1]
} {0 {} {} {}}

test winMenu-13.1 {TkpSetMainMenubar - nothing to do} {emptyTest pcOnly} {} {}

test winMenu-14.1 {GetMenuIndicatorGeometry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add checkbutton -label foo
    list [catch {tkTearOffMenu .m1 40 40}] [destroy .m1]
} {0 {}}
test winMenu-14.2 {GetMenuIndicatorGeometry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add checkbutton -label foo -hidemargin 1
    list [catch {tkTearOffMenu .m1 40 40}] [destroy .m1]
} {0 {}}

test winMenu-15.1 {GetMenuAccelGeometry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add cascade -label foo -accel Ctrl+U
    list [catch {tkTearOffMenu .m1 40 40}] [destroy .m1]
} {0 {}}
test winMenu-15.2 {GetMenuAccelGeometry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo
    list [catch {tkTearOffMenu .m1 40 40}] [destroy .m1]
} {0 {}}
test winMenu-15.3 {GetMenuAccelGeometry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo -accel "Ctrl+U"
    list [catch {tkTearOffMenu .m1 40 40}] [destroy .m1]
} {0 {}}

test winMenu-16.1 {GetTearoffEntryGeometry} {pcOnly userInteraction} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "winMenu-19.1: Hit ESCAPE."
    list [.m1 post 40 40] [destroy .m1]
} {{} {}}

test winMenu-17.1 {GetMenuSeparatorGeometry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add separator
    list [catch {tkTearOffMenu .m1 40 40}] [destroy .m1]
} {0 {}}

# Currently, the only callers to DrawWindowsSystemBitmap want things
# centered vertically, and either centered or right aligned horizontally.
test winMenu-18.1 {DrawWindowsSystemBitmap - center aligned} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add checkbutton -label foo
    .m1 invoke foo
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-18.2 {DrawWindowsSystemBitmap - right aligned} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add cascade -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}

test winMenu-19.1 {DrawMenuEntryIndicator - not checkbutton or radiobutton} \
	{pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-19.2 {DrawMenuEntryIndicator - not selected} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add checkbutton -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-19.3 {DrawMenuEntryIndicator - checkbutton} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add checkbutton -label foo
    .m1 invoke foo
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-19.4 {DrawMenuEntryIndicator - radiobutton} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add radiobutton -label foo
    .m1 invoke foo
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-19.5 {DrawMenuEntryIndicator - disabled} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add checkbutton -label foo
    .m1 invoke foo
    .m1 entryconfigure foo -state disabled
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-19.6 {DrawMenuEntryIndicator - indicator not on} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add checkbutton -label foo -indicatoron 0
    .m1 invoke foo
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}

test winMenu-20.1 {DrawMenuEntryAccelerator - disabled} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -disabledforeground red
    .m1 add command -label foo -accel "Ctrl+U" -state disabled
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-20.2 {DrawMenuEntryAccelerator - normal text} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo -accel "Ctrl+U"
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-20.3 {DrawMenuEntryAccelerator - disabled, no disabledforeground} \
	{pcOnly} {
    catch {destroy .m1}
    menu .m1 -disabledforeground ""
    .m1 add command -label foo -accel "Ctrl+U" -state disabled
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-20.4 {DrawMenuEntryAccelerator - cascade, drawArrow true} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add cascade -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-20.5 {DrawMenuEntryAccelerator - cascade, drawArrow false} \
	{pcOnly userInteraction} {
    catch {destroy .m1}
    menu .m1
    .m1 add cascade -label "winMenu-23.5: Hit ESCAPE."
    list [.m1 post 40 40] [destroy .m1]
} {{} {}}

test winMenu-21.1 {DrawMenuSeparator} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add separator
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}

test winMenu-22.1 {DrawMenuUnderline} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo -underline 0
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}   

test winMenu-23.1 {Don't know how to test MenuKeyBindProc} \
	{pcOnly emptyTest} {} {}
test winMenu-24.1 {TkpInitializeMenuBindings called at boot time} \
	{pcOnly emptyTest} {} {}

test winMenu-25.1 {DrawMenuEntryLabel - normal} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-25.2 {DrawMenuEntryLabel - disabled with fg} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -disabledforeground red
    .m1 add command -label foo -state disabled
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-25.3 {DrawMenuEntryLabel - disabled with no fg} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -disabledforeground ""
    .m1 add command -label foo -state disabled
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}

test winMenu-26.1 {TkpComputeMenubarGeometry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add cascade -label File
    list [. configure -menu .m1] [. configure -menu ""] [destroy .m1]
} {{} {} {}}

test winMenu-27.1 {DrawTearoffEntry} {pcOnly userInteraction} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "winMenu-24.4: Hit ESCAPE."
    list [.m1 post 40 40] [destroy .m1]
} {{} {}}

test winMenu-28.1 {TkpConfigureMenuEntry - update pending} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add command -label Hello
    list [catch {.m1 add command -label Two} msg] $msg [destroy .m1]
} {0 {} {}}
test winMenu-28.2 {TkpConfigureMenuEntry - update not pending} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add command -label One
    update idletasks
    list [catch {.m1 add command -label Two} msg] $msg [destroy .m1]
} {0 {} {}}

test winMenu-29.1 {TkpDrawMenuEntry - gc for active and not strict motif} \
	{pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    .m1 entryconfigure 1 -state active
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.2 {TkpDrawMenuEntry - gc for active menu item with its own gc} \
	{pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo -activeforeground red
    set tearoff [tkTearOffMenu .m1 40 40]
    .m1 entryconfigure 1 -state active
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.3 {TkpDrawMenuEntry - gc for active and strict motif} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    set tk_strictMotif 1
    .m1 add command -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    .m1 entryconfigure 1 -state active
    list [update] [destroy .m1] [set tk_strictMotif 0]
} {{} {} 0}
test winMenu-29.4 \
	{TkpDrawMenuEntry - gc for disabled with disabledfg and custom entry} \
	{pcOnly} {
    catch {destroy .m1}
    menu .m1 -disabledforeground blue
    .m1 add command -label foo -state disabled -background red
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.5 {TkpDrawMenuEntry - gc for disabled with disabledFg} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -disabledforeground blue
    .m1 add command -label foo -state disabled
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.6 {TkpDrawMenuEntry - gc for disabled - no disabledFg} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -disabledforeground ""
    .m1 add command -label foo -state disabled
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.7 {TkpDrawMenuEntry - gc for normal - custom entry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo -foreground red
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.8 {TkpDrawMenuEntry - gc for normal} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.9 {TkpDrawMenuEntry - gc for indicator - custom entry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add checkbutton -label foo -selectcolor orange
    .m1 invoke 1
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.10 {TkpDrawMenuEntry - gc for indicator} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add checkbutton -label foo
    .m1 invoke 1
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.11 {TkpDrawMenuEntry - border - custom entry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo -activebackground green
    set tearoff [tkTearOffMenu .m1 40 40]
    .m1 entryconfigure 1 -state active
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.12 {TkpDrawMenuEntry - border} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    .m1 entryconfigure 1 -state active
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.13 {TkpDrawMenuEntry - active border - strict motif} {pcOnly} {
    catch {destroy .m1}
    set tk_strictMotif 1
    menu .m1
    .m1 add command -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    .m1 entryconfigure 1 -state active
    list [update] [destroy .m1] [set tk_strictMotif 0]
} {{} {} 0}
test winMenu-29.14 {TkpDrawMenuEntry - active border - custom entry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo -activeforeground yellow
    set tearoff [tkTearOffMenu .m1 40 40]
    .m1 entryconfigure 1 -state active
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.15 {TkpDrawMenuEntry - active border} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    .m1 entryconfigure 1 -state active
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.16 {TkpDrawMenuEntry - font - custom entry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo -font "Helvectica 72"
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.17 {TkpDrawMenuEntry - font} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -font "Courier 72"
    .m1 add command -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.18 {TkpDrawMenuEntry - separator} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add separator
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.19 {TkpDrawMenuEntry - standard} {pcOnly} {
    catch {destroy .mb}
    menu .m1
    .m1 add command -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.20 {TkpDrawMenuEntry - disabled cascade item} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add cascade -label File -menu .m1.file
    menu .m1.file
    .m1.file add command -label foo
    .m1 entryconfigure File -state disabled
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.21 {TkpDrawMenuEntry - indicator} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add checkbutton -label winMenu-31.20
    .m1 invoke winMenu-31.20
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-29.22 {TkpDrawMenuEntry - indicator} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add checkbutton -label winMenu-31.21 -hidemargin 1
    .m1 invoke winMenu-31.21
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}

test winMenu-30.1 {GetMenuLabelGeometry - image} {pcOnly} {
    catch {destroy .m1}
    catch {image delete image1}
    menu .m1
    image create test image1
    .m1 add command -image image1
    list [update idletasks] [destroy .m1] [image delete image1]
} {{} {} {}}
test winMenu-30.2 {GetMenuLabelGeometry - bitmap} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -bitmap questhead
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-30.3 {GetMenuLabelGeometry - no text} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-30.4 {GetMenuLabelGeometry - text} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "This is a test."
    list [update idletasks] [destroy .m1]
} {{} {}}

test winMenu-31.1 {DrawMenuEntryBackground} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    list [update] [destroy .m1]
} {{} {}}
test winMenu-31.2 {DrawMenuEntryBackground} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label foo
    set tearoff [tkTearOffMenu .m1 40 40]
    $tearoff activate 0
    list [update] [destroy .m1]
} {{} {}}

test winMenu-32.1 {TkpComputeStandardMenuGeometry - no entries} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.2 {TkpComputeStandardMenuGeometry - one entry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "one"
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.3 {TkpComputeStandardMenuGeometry - more than one entry} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "one"
    .m1 add command -label "two"
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.4 {TkpComputeStandardMenuGeometry - separator} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add separator
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.5 {TkpComputeStandardMenuGeometry - tearoff entry} {unixOnly} {
    catch {destroy .m1}
    menubutton .mb -text "test" -menu .mb.m
    menu .mb.m
    .mb.m add command -label test
    pack .mb
    catch {tkMbPost .mb}
    list [update] [destroy .mb]
} {{} {}}
test winMenu-32.6 {TkpComputeStandardMenuGeometry - standard label geometry} \
	{pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "test"
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.7 {TkpComputeStandardMenuGeometry - different font for entry} \
	{pcOnly} {
    catch {destroy .m1}
    menu .m1 -font "Helvetica 12"
    .m1 add command -label "test" -font "Courier 12"
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.8 {TkpComputeStandardMenuGeometry - second entry larger} \
	{pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "test"
    .m1 add command -label "test test"
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.9 {TkpComputeStandardMenuGeometry - first entry larger} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "test test"
    .m1 add command -label "test"
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.10 {TkpComputeStandardMenuGeometry - accelerator} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "test" -accel "Ctrl+S"
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.11 {TkpComputeStandardMenuGeometry - second accel larger} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "test" -accel "1"
    .m1 add command -label "test" -accel "1 1"
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.12 {TkpComputeStandardMenuGeometry - second accel smaller} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label "test" -accel "1 1"
    .m1 add command -label "test" -accel "1"
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.13 {TkpComputeStandardMenuGeometry - indicator} {pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add checkbutton -label test
    .m1 invoke 1
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.14 \
	{TkpComputeStandardMenuGeometry - second indicator less or equal} \
	{pcOnly} {
    catch {destroy .m1}
    catch {image delete image1}
    image create test image1
    menu .m1
    .m1 add checkbutton -image image1
    .m1 invoke 1
    .m1 add checkbutton -label test
    .m1 invoke 2
    list [update idletasks] [destroy .m1] [image delete image1]
} {{} {} {}}
test winMenu-32.15 {TkpComputeStandardMenuGeometry - second indicator larger} \
	{unixOnly} {
    catch {destroy .m1}
    catch {image delete image1}
    image create test image1
    menu .m1
    .m1 add checkbutton -image image1
    .m1 invoke 1
    .m1 add checkbutton -label test
    .m1 invoke 2
    list [update idletasks] [destroy .m1] [image delete image1]
} {{} {} {}}
test winMenu-32.16 {TkpComputeStandardMenuGeometry - zero sized menus} \
	{pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.17 {TkpComputeStandardMenuGeometry - first column bigger} \
	{pcOnly} {
    catch {destroy .m1}
    menu .m1
    .m1 add command -label one
    .m1 add command -label two
    .m1 add command -label three -columnbreak 1
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.18 {TkpComputeStandardMenuGeometry - second column bigger} \
	{pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add command -label one
    .m1 add command -label two -columnbreak 1
    .m1 add command -label three
    list [update idletasks] [destroy .m1]
} {{} {}}
test winMenu-32.19 {TkpComputeStandardMenuGeometry - three columns} {pcOnly} {
    catch {destroy .m1}
    menu .m1 -tearoff 0
    .m1 add command -label one
    .m1 add command -label two -columnbreak 1
    .m1 add command -label three
    .m1 add command -label four
    .m1 add command -label five -columnbreak 1
    .m1 add command -label six
    list [update idletasks] [destroy .m1]    
} {{} {}}

test winMenu-33.1 {TkpNotifyTopLevelCreate - no menu yet} {pcOnly} {
    catch {destroy .t2}
    catch {destroy .m1}
    toplevel .t2 -menu .m1
    wm geometry .t2 +0+0
    list [update idletasks] [destroy .t2]
} {{} {}}
test winMenu-33.2 {TkpNotifyTopLevelCreate - menu} {pcOnly} {
    catch {destroy .t2}
    catch {destroy .m1}
    menu .m1
    menu .m1.system
    .m1 add cascade -menu .m1.system
    .m1.system add separator
    .m1.system add command -label foo
    toplevel .t2 -menu .m1
    wm geometry .t2 +0+0
    list [update idletasks] [destroy .m1] [destroy .t2]
} {{} {} {}}

test winMenu-34.1 {TkpMenuInit called at boot time} {emptyTest pcOnly} {} {}

# cleanup
deleteWindows
::tcltest::cleanupTests
return












