# This file is a Tcl script to test out the "frame" and "toplevel"
# commands of Tko. It is organized in the standard fashion for Tcl
# tests.
#
# Copyright (c) 1994 The Regents of the University of California.
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.

package require tcltest
namespace import ::tcltest::*
namespace eval ::TEST {

proc ::TEST::deleteWindows {} {
    destroy {*}[winfo children .]
}

# ::TEST::eatColors --
# Creates a toplevel window and allocates enough colors in it to
# use up all the slots in the colormap.
#
# Arguments:
# w -		Name of toplevel window to create.

proc ::TEST::eatColors {w} {
    catch {destroy $w}
    ::tko::toplevel $w
    wm geom $w +0+0
    canvas $w.c -width 400 -height 200 -bd 0
    pack $w.c
    for {set y 0} {$y < 8} {incr y} {
	for {set x 0} {$x < 40} {incr x} {
	    set color [format #%02x%02x%02x [expr $x*6] [expr $y*30] 0]
	    $w.c create rectangle [expr 10*$x] [expr 20*$y] \
		    [expr 10*$x + 10] [expr 20*$y + 20] -outline {} \
		    -fill $color
	}
    }
    update
}

# ::TEST::colorsFree --
#
# Returns 1 if there appear to be free colormap entries in a window,
# 0 otherwise.
#
# Arguments:
# w -			Name of window in which to check.
# red, green, blue -	Intensities to use in a trial color allocation
#			to see if there are colormap entries free.

proc ::TEST::colorsFree {w {red 31} {green 245} {blue 192}} {
    set vals [winfo rgb $w [format #%02x%02x%02x $red $green $blue]]
    expr ([lindex $vals 0]/256 == $red) && ([lindex $vals 1]/256 == $green) \
	    && ([lindex $vals 2]/256 == $blue)
}

#
# Test ::tko::frame configuration options
#
test frame-1.1 {frame configuration options} -setup {
	deleteWindows
} -body {
    ::tko::frame .f -class NewFrame
    .f configure -class
} -cleanup {
    deleteWindows
} -result {-class class Class TkoFrame NewFrame}

test frame-1.2 {frame configuration options} -setup {
    deleteWindows
} -body {
    ::tko::frame .f -class NewFrame
    .f configure -class Different
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {*: option "-class" is readonly}

test frame-1.3 {frame configuration options} -setup {
	deleteWindows
} -body {
    ::tko::frame .f -colormap new
    .f configure -colormap
} -cleanup {
    deleteWindows
} -result {-colormap colormap Colormap {} new}

test frame-1.4 {frame configuration options} -setup {
    deleteWindows
} -body {
    ::tko::frame .f -colormap new
    .f configure -colormap .
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {*: option "-colormap" is readonly}

test frame-1.5 {frame configuration options} -setup {
	deleteWindows
} -body {
    ::tko::frame .f -visual default
    .f configure -visual
} -cleanup {
    deleteWindows
} -result {-visual visual Visual {} default}

test frame-1.6 {frame configuration options} -setup {
    deleteWindows
} -body {
    ::tko::frame .f -visual default
    .f configure -visual best
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {*: option "-visual" is readonly}

test frame-1.7 {frame configuration options} -setup {
	deleteWindows
} -body {
    ::tko::frame .f -screen bogus
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {unknown options: -screen bogus}

test frame-1.8 {frame configuration options} -setup {
	deleteWindows
} -body {
    ::tko::frame .f -container true
} -cleanup {
    deleteWindows
} -result {.f}

test frame-1.9 {frame configuration options} -setup {
    deleteWindows
} -body {
    ::tko::frame .f -container true
    .f configure -container
} -cleanup {
    deleteWindows
} -result {-container container Container 0 1}

test frame-1.10 {frame configuration options} -setup {
	deleteWindows
} -body {
    ::tko::frame .f -container bogus
} -cleanup {
    deleteWindows
} -returnCodes error -result {expected boolean value but got "bogus"}

test frame-1.11 {frame configuration options} -setup {
	deleteWindows
} -body {
    ::tko::frame .f
    .f configure -container 1
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {*: option "-container" is readonly}

test frame-1.12 {frame configuration options} -setup {
	deleteWindows
} -body {
    # Make sure all options can be set to the default value
    ::tko::frame .f
    set opts {}
    foreach opt [.f configure] {
        if {[llength $opt] == 5} {
            lappend opts [lindex $opt 0] [lindex $opt 4]
        }
    }
    eval ::tko::frame .g $opts
    destroy .f .g
} -cleanup {
    deleteWindows
} -result {}

destroy .f
::tko::frame .f
test frame-1.13 {frame configuration options} -body {
    .f configure -background #ff0000
    lindex [.f configure -background] 4
} -cleanup {
    .f configure -background [lindex [.f configure -background] 3]
} -result {#ff0000}

test frame-1.14 {frame configuration options} -body {
    .f configure -background non-existent
} -returnCodes error -match glob -result {*: unknown color name "non-existent"}

test frame-1.15 {frame configuration options} -body {
    .f configure -bd 4
    lindex [.f configure -bd] 4
} -cleanup {
    .f configure -bd [lindex [.f configure -bd] 3]
} -result {4}

test frame-1.16 {frame configuration options} -body {
    .f configure -bd badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-1.17 {frame configuration options} -body {
    .f configure -bg #00ff00
    lindex [.f configure -bg] 4
} -cleanup {
    .f configure -bg [lindex [.f configure -bg] 3]
} -result {#00ff00}

test frame-1.18 {frame configuration options} -body {
    .f configure -bg non-existent
} -returnCodes error -match glob -result {*: unknown color name "non-existent"}

test frame-1.19 {frame configuration options} -body {
    .f configure -borderwidth 1.3
    lindex [.f configure -borderwidth] 4
} -cleanup {
    .f configure -borderwidth [lindex [.f configure -borderwidth] 3]
} -result {1}

test frame-1.20 {frame configuration options} -body {
    .f configure -borderwidth badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-1.21 {frame configuration options} -body {
    .f configure -cursor arrow
    lindex [.f configure -cursor] 4
} -cleanup {
    .f configure -cursor [lindex [.f configure -cursor] 3]
} -result {arrow}

test frame-1.22 {frame configuration options} -body {
    .f configure -cursor badValue
} -returnCodes error -match glob -result {*: bad cursor spec "badValue"}

test frame-1.23 {frame configuration options} -body {
    .f configure -height 100
    lindex [.f configure -height] 4
} -cleanup {
    .f configure -height [lindex [.f configure -height] 3]
} -result {100}

test frame-1.24 {frame configuration options} -body {
    .f configure -height not_a_number
} -returnCodes error -match glob -result {*: bad screen distance "not_a_number"}

test frame-1.25 {frame configuration options} -body {
    .f configure -highlightbackground #112233
    lindex [.f configure -highlightbackground] 4
} -cleanup {
    .f configure -highlightbackground [lindex [.f configure -highlightbackground] 3]
} -result {#112233}

test frame-1.26 {frame configuration options} -body {
    .f configure -highlightbackground ugly
} -returnCodes error -match glob -result {*: unknown color name "ugly"}

test frame-1.27 {frame configuration options} -body {
    .f configure -highlightcolor #123456
    lindex [.f configure -highlightcolor] 4
} -cleanup {
    .f configure -highlightcolor [lindex [.f configure -highlightcolor] 3]
} -result {#123456}

test frame-1.28 {frame configuration options} -body {
    .f configure -highlightcolor non-existent
} -returnCodes error -match glob -result {*: unknown color name "non-existent"}

test frame-1.29 {frame configuration options} -body {
    .f configure -highlightthickness 6
    lindex [.f configure -highlightthickness] 4
} -cleanup {
    .f configure -highlightthickness [lindex [.f configure -highlightthickness] 3]
} -result {6}

test frame-1.30 {frame configuration options} -body {
    .f configure -highlightthickness badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-1.31 {frame configuration options} -body {
    .f configure -padx 3
    lindex [.f configure -padx] 4
} -cleanup {
    .f configure -padx [lindex [.f configure -padx] 3]
} -result {3}

test frame-1.32 {frame configuration options} -body {
    .f configure -padx badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-1.33 {frame configuration options} -body {
    .f configure -pady 4
    lindex [.f configure -pady] 4
} -cleanup {
    .f configure -pady [lindex [.f configure -pady] 3]
} -result {4}

test frame-1.34 {frame configuration options} -body {
    .f configure -pady badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-1.35 {frame configuration options} -body {
    .f configure -relief ridge
    lindex [.f configure -relief] 4
} -cleanup {
    .f configure -relief [lindex [.f configure -relief] 3]
} -result {ridge}

test frame-1.36 {frame configuration options} -body {
    .f configure -relief badValue
} -returnCodes error -match glob -result {*: bad relief "badValue": must be flat, groove, raised, ridge, solid, or sunken}

test frame-1.37 {frame configuration options} -body {
    .f configure -takefocus {any string}
    lindex [.f configure -takefocus] 4
} -cleanup {
    .f configure -takefocus [lindex [.f configure -takefocus] 3]
} -result {any string}

test frame-1.38 {frame configuration options} -body {
    .f configure -width 32
    lindex [.f configure -width] 4
} -cleanup {
    .f configure -width [lindex [.f configure -width] 3]
} -result {32}

test frame-1.39 {frame configuration options} -body {
    .f configure -width badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}
destroy .f

#
# Test ::tko::toplevel configuration options
#

test frame-2.1 {toplevel configuration options} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 200 -height 100 -class NewClass
    wm geometry .t +0+0
    .t configure -class
} -cleanup {
    deleteWindows
} -result {-class class Class TkoToplevel NewClass}

test frame-2.2 {toplevel configuration options} -setup {
    deleteWindows
} -body {
    ::tko::toplevel .t -width 200 -height 100 -class NewClass
    wm geometry .t +0+0
    .t configure -class Another
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {*: option "-class" is readonly}

test frame-2.3 {toplevel configuration options} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 200 -height 100 -colormap new
    wm geometry .t +0+0
    .t configure -colormap
} -cleanup {
    deleteWindows
} -result {-colormap colormap Colormap {} new}

test frame-2.4 {toplevel configuration options} -setup {
    deleteWindows
} -body {
    ::tko::toplevel .t -width 200 -height 100 -colormap new
    wm geometry .t +0+0
    .t configure -colormap .
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {*: option "-colormap" is readonly}

test frame-2.5 {toplevel configuration options} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 200 -height 100
    wm geometry .t +0+0
    .t configure -container 1
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {*: option "-container" is readonly}

test frame-2.6 {toplevel configuration options} -setup {
    deleteWindows
} -body {
    catch {destroy .t}
    ::tko::toplevel .t -width 200 -height 100
    wm geometry .t +0+0
    catch {.t configure -container 1}
    .t configure -container
} -cleanup {
    deleteWindows
} -result {-container container Container 0 0}

test frame-2.7 {toplevel configuration options} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 200 -height 100 -colormap bogus
} -cleanup {
    deleteWindows
} -returnCodes error -result {bad window path name "bogus"}

test frame-2.8 {toplevel configuration options} -constraints {
    win
} -setup {
	deleteWindows
} -body {
    catch {destroy .t}
    ::tko::toplevel .t -width 200 -height 100 -use 0x44022
#    wm geometry .t +0+0
#    .t configure -use 0x44022
} -cleanup {
    deleteWindows
} -returnCodes error -result {window "0x44022" doesn't exist}

test frame-2.9 {toplevel configuration options} -constraints {
    win
} -setup {
    deleteWindows
} -body {
    catch {destroy .t}
    ::tko::toplevel .t -width 200 -height 100
    wm geometry .t +0+0
    catch {.t configure -use 0x44022}
    .t configure -use
} -cleanup {
    deleteWindows
} -result {-use use Use {} {}}

test frame-2.10 {toplevel configuration options} -constraints {
    nonwin
} -setup {
    deleteWindows
} -body {
    catch {destroy .t}
    ::tko::toplevel .t -width 200 -height 100
    wm geometry .t +0+0
    .t configure -use 0x44022
} -cleanup {
    deleteWindows
} -returnCodes error -result {can't modify -use option after widget is created}

test frame-2.11 {toplevel configuration options} -constraints {
    nonwin
} -setup {
	deleteWindows
} -body {
    catch {destroy .t}
    ::tko::toplevel .t -width 200 -height 100
    wm geometry .t +0+0
    catch {.t configure -use 0x44022}
    .t configure -use
} -cleanup {
    deleteWindows
} -result {-use use Use {} {}}

test frame-2.12 {toplevel configuration options} -setup {
	deleteWindows
} -body {
    catch {destroy .t}
    ::tko::toplevel .t -width 200 -height 100 -visual default
    wm geometry .t +0+0
    .t configure -visual
} -cleanup {
    deleteWindows
} -result {-visual visual Visual {} default}

test frame-2.13 {toplevel configuration options} -setup {
    deleteWindows
} -body {
    catch {destroy .t}
    ::tko::toplevel .t -width 200 -height 100 -visual default
    wm geometry .t +0+0
    .t configure -visual best
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {*: option "-visual" is readonly}

test frame-2.14 {toplevel configuration options} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 200 -height 100 -visual who_knows?
} -cleanup {
    deleteWindows
} -returnCodes error -result {unknown or ambiguous visual name "who_knows?": class must be best, directcolor, grayscale, greyscale, pseudocolor, staticcolor, staticgray, staticgrey, truecolor, or default}

test frame-2.15 {toplevel configuration options} -constraints haveDISPLAY -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 200 -height 100 -screen $env(DISPLAY)
    wm geometry .t +0+0
    string compare [.t configure -screen] "-screen screen Screen {} $env(DISPLAY)"
} -cleanup {
    deleteWindows
} -result {0}

test frame-2.16 {toplevel configuration options} -constraints haveDISPLAY -setup {
    deleteWindows
} -body {
    ::tko::toplevel .t -width 200 -height 100 -screen $env(DISPLAY)
    wm geometry .t +0+0
    .t configure -screen another
} -cleanup {
    deleteWindows
} -returnCodes error -result {can't modify -screen option after widget is created}

test frame-2.17 {toplevel configuration options} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 200 -height 100 -screen bogus
} -cleanup {
    deleteWindows
} -returnCodes error -result {couldn't connect to display "bogus"}


test frame-2.18 {toplevel configuration options} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -container 1 -width 300 -height 120
    wm geometry .t +0+0
    ::tko::toplevel .x -container 1 -use [winfo id .t]
} -cleanup {
    deleteWindows
} -returnCodes error -result {windows cannot have both the -use and the -container option set}

test frame-2.19 {toplevel configuration options} -setup {
	deleteWindows
    set opts {}
} -body {
    # Make sure all options can be set to the default value
    ::tko::toplevel .f
    foreach opt [.f configure] {
        if {[llength $opt] == 5} {
            lappend opts [lindex $opt 0] [lindex $opt 4]
        }
    }
    eval ::tko::toplevel .g $opts
    destroy .f .g
} -cleanup {
    deleteWindows
} -result {}

destroy .t
::tko::toplevel .t -width 300 -height 150
wm geometry .t +0+0
update
test frame-2.20 {toplevel configuration options} -body {
    .t configure -background #ff0000
    lindex [.t configure -background] 4
} -result {#ff0000}

test frame-2.21 {toplevel configuration options} -body {
    .t configure -background non-existent
} -returnCodes error -match glob -result {*: unknown color name "non-existent"}

test frame-2.22 {toplevel configuration options} -body {
    .t configure -bd 4
    lindex [.t configure -bd] 4
} -result {4}

test frame-2.23 {toplevel configuration options} -body {
    .t configure -bd badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-2.24 {toplevel configuration options} -body {
    .t configure -bg #00ff00
    lindex [.t configure -bg] 4
} -result {#00ff00}

test frame-2.25 {toplevel configuration options} -body {
    .t configure -bg non-existent
} -returnCodes error -match glob -result {*: unknown color name "non-existent"}

test frame-2.26 {toplevel configuration options} -body {
    .t configure -borderwidth 1.3
    lindex [.t configure -borderwidth] 4
} -result {1}

test frame-2.27 {toplevel configuration options} -body {
    .t configure -borderwidth badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-2.28 {toplevel configuration options} -body {
    .t configure -cursor arrow
    lindex [.t configure -cursor] 4
} -result {arrow}

test frame-2.29 {toplevel configuration options} -body {
    .t configure -cursor badValue
} -returnCodes error -match glob -result {*: bad cursor spec "badValue"}

test frame-2.30 {toplevel configuration options} -body {
    .t configure -height 100
    lindex [.t configure -height] 4
} -result {100}

test frame-2.31 {toplevel configuration options} -body {
    .t configure -height not_a_number
} -returnCodes error -match glob -result {*: bad screen distance "not_a_number"}

test frame-2.32 {toplevel configuration options} -body {
    .t configure -highlightcolor #123456
    lindex [.t configure -highlightcolor] 4
} -result {#123456}

test frame-2.33 {toplevel configuration options} -body {
    .t configure -highlightcolor non-existent
} -returnCodes error -match glob -result {*: unknown color name "non-existent"}

test frame-2.34 {toplevel configuration options} -body {
    .t configure -highlightthickness 3
    lindex [.t configure -highlightthickness] 4
} -result {3}

test frame-2.35 {toplevel configuration options} -body {
    .t configure -highlightthickness badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-2.36 {toplevel configuration options} -body {
    .t configure -padx 3
    lindex [.t configure -padx] 4
} -result {3}

test frame-2.37 {toplevel configuration options} -body {
    .t configure -padx badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-2.38 {toplevel configuration options} -body {
    .t configure -pady 4
    lindex [.t configure -pady] 4
} -result {4}

test frame-2.39 {toplevel configuration options} -body {
    .t configure -pady badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-2.40 {toplevel configuration options} -body {
    .t configure -relief ridge
    lindex [.t configure -relief] 4
} -result {ridge}

test frame-2.41 {toplevel configuration options} -body {
    .t configure -relief badValue
} -returnCodes error -match glob -result {*: bad relief "badValue": must be flat, groove, raised, ridge, solid, or sunken}

test frame-2.42 {toplevel configuration options} -body {
    .t configure -width 32
    lindex [.t configure -width] 4
} -result {32}

test frame-2.43 {toplevel configuration options} -body {
    .t configure -width badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}
destroy .t

#
# Test ::tko::labelframe configuration options
#
test frame-3.1 {TkCreateFrame procedure} -body {
    ::tko::frame
} -returnCodes error -result {wrong # args: should be "::tko::frame pathName ?-option value ...?"}

test frame-3.2 {TkCreateFrame procedure} -setup {
	deleteWindows
    ::tko::frame .f
} -body {
    .f configure -class
} -cleanup {
    deleteWindows
} -result {-class class Class TkoFrame TkoFrame}

test frame-3.3 {TkCreateFrame procedure} -setup {
	deleteWindows
    ::tko::toplevel .t
    wm geometry .t +0+0
} -body {
    .t configure -class
} -cleanup {
    deleteWindows
} -result {-class class Class TkoToplevel TkoToplevel}

test frame-3.4 {TkCreateFrame procedure} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 350 -class NewClass -bg black -visual default -height 90
    wm geometry .t +0+0
    update
    list [lindex [.t configure -width] 4] \
	    [lindex [.t configure -background] 4] \
	    [lindex [.t configure -height] 4]
} -cleanup {
    deleteWindows
} -result {350 black 90}

# Be sure that the -class, -colormap, and -visual options are processed
# before configuring the widget.

test frame-3.5 {TkCreateFrame procedure} -setup {
	deleteWindows
} -body {
    option add *NewFrame.background #123456
    ::tko::frame .f -class NewFrame
    lindex [.f configure -background] 4
} -cleanup {
    deleteWindows
    option clear
} -result {#123456}

test frame-3.6 {TkCreateFrame procedure} -setup {
	deleteWindows
} -body {
    option add *NewFrame.background #123456
    ::tko::frame .f -class NewFrame
    lindex [.f configure -background] 4
} -cleanup {
    deleteWindows
    option clear
} -result {#123456}

test frame-3.7 {TkCreateFrame procedure} -setup {
	deleteWindows
} -body {
    option add *NewFrame.background #332211
    option add *f.class NewFrame
    ::tko::frame .f
    list [lindex [.f configure -class] 4] [lindex [.f configure -background] 4]
} -cleanup {
    deleteWindows
    option clear
} -result {NewFrame #332211}

test frame-3.8 {TkCreateFrame procedure} -setup {
	deleteWindows
} -body {
    option add *Silly.background #122334
    option add *f.Class Silly
    ::tko::frame .f
    list [lindex [.f configure -class] 4] [lindex [.f configure -background] 4]
} -cleanup {
    deleteWindows
    option clear
} -result {Silly #122334}

test frame-3.9 {TkCreateFrame procedure, -use option} -constraints {
    unix
} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -container 1 -width 300 -height 120
    wm geometry .t +0+0
    ::tko::toplevel .x -width 140 -height 300 -use [winfo id .t] -bg green
    tkwait visibility .x
    list [expr {[winfo rootx .x] - [winfo rootx .t]}] \
	    [expr {[winfo rooty .x] - [winfo rooty .t]}] \
	    [winfo width .t] [winfo height .t]
} -cleanup {
    deleteWindows
} -result {0 0 140 300}

test frame-3.10 {TkCreateFrame procedure, -use option} -constraints {
    unix
} -setup {
    deleteWindows
} -body {
    ::tko::toplevel .t -container 1 -width 300 -height 120
    wm geometry .t +0+0
    option add *x.use [winfo id .t]
    ::tko::toplevel .x -width 140 -height 300 -bg green
    tkwait visibility .x
    list [expr {[winfo rootx .x] - [winfo rootx .t]}] \
	    [expr {[winfo rooty .x] - [winfo rooty .t]}] \
	    [winfo width .t] [winfo height .t]
} -cleanup {
    destroy .t
    option clear
} -result {0 0 140 300}

# The tests below require specific display characteristics (i.e. that
# they are run on a pseudocolor display of depth 8).  Even so, they
# are non-portable: some machines don't seem to ever run out of
# colors.
if {[testConstraint defaultPseudocolor8]} {
    ::TEST::eatColors .t1
}
test frame-3.11 {TkCreateFrame procedure} -constraints {
	defaultPseudocolor8 nonPortable
} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 300 -height 200 -bg #475601
    wm geometry .t +0+0
    update
    ::TEST::colorsFree .t
} -cleanup {
    deleteWindows
} -result {0}

test frame-3.12 {TkCreateFrame procedure} -constraints {
	defaultPseudocolor8 nonPortable
} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 300 -height 200 -bg #475601 -colormap new
    wm geometry .t +0+0
    update
    ::TEST::colorsFree .t
} -cleanup {
    deleteWindows
} -result {1}

test frame-3.13 {TkCreateFrame procedure} -constraints {
	defaultPseudocolor8 nonPortable
} -setup {
	deleteWindows
} -body {
    option add *t.class Toplevel2
    option add *Toplevel2.colormap new
    ::tko::toplevel .t -width 300 -height 200 -bg #475601
    wm geometry .t +0+0
    update
    option clear
    ::TEST::colorsFree .t
} -cleanup {
    deleteWindows
} -result {1}

test frame-3.14 {TkCreateFrame procedure} -constraints {
	defaultPseudocolor8 nonPortable
} -setup {
	deleteWindows
} -body {
    option add *t.class Toplevel3
    option add *Toplevel3.Colormap new
    ::tko::toplevel .t -width 300 -height 200 -bg #475601 -colormap new
    wm geometry .t +0+0
    update
    option clear
    ::TEST::colorsFree .t
} -cleanup {
    deleteWindows
} -result {1}

test frame-3.15 {TkCreateFrame procedure, -use and -colormap} -constraints {
    defaultPseudocolor8 unix nonPortable
} -setup {
    deleteWindows
} -body {
    ::tko::toplevel .t -container 1 -width 300 -height 120
    wm geometry .t +0+0
    ::tko::toplevel .x -width 140 -height 300 -use [winfo id .t] -bg green -colormap new
    tkwait visibility .x
    list [::TEST::colorsFree .t] [::TEST::colorsFree .x]
} -cleanup {
    destroy .t
} -result {0 1}

test frame-3.16 {TkCreateFrame procedure} -constraints {
	defaultPseudocolor8 nonPortable
} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 300 -height 200 -bg #475601 -visual default
    wm geometry .t +0+0
    update
    ::TEST::colorsFree .t
} -cleanup {
    deleteWindows
} -result {0}

test frame-3.17 {TkCreateFrame procedure} -constraints {
	defaultPseudocolor8 nonPortable
} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 300 -height 200 -bg #475601 -visual default \
	    -colormap new
    wm geometry .t +0+0
    update
    ::TEST::colorsFree .t
} -cleanup {
    deleteWindows
} -result {1}

test frame-3.18 {TkCreateFrame procedure} -constraints {
	defaultPseudocolor8 haveGrayscale8 nonPortable
} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -visual {grayscale 8} -width 300 -height 200 -bg #434343
    wm geometry .t +0+0
    update
    ::TEST::colorsFree .t 131 131 131
} -cleanup {
    deleteWindows
} -result {1}

test frame-3.19 {TkCreateFrame procedure} -constraints {
	defaultPseudocolor8 haveGrayscale8 nonPortable
} -setup {
	deleteWindows
} -body {
    option add *t.class T4
    option add *T4.visual {grayscale 8}
    ::tko::toplevel .t -width 300 -height 200 -bg #434343
    wm geometry .t +0+0
    update
    option clear
    list [::TEST::colorsFree .t 131 131 131] [lindex [.t configure -visual] 4]
} -cleanup {
    deleteWindows
} -result {1 {grayscale 8}}

test frame-3.20 {TkCreateFrame procedure} -constraints {
	defaultPseudocolor8 haveGrayscale8 nonPortable
} -setup {
	deleteWindows
} -body {
    set x ok
    option add *t.class T5
    option add *T5.Visual {grayscale 8}
    ::tko::toplevel .t -width 300 -height 200 -bg #434343
    wm geometry .t +0+0
    update
    option clear
    list [::TEST::colorsFree .t 131 131 131] [lindex [.t configure -visual] 4]
} -cleanup {
    deleteWindows
} -result {1 {grayscale 8}}

test frame-3.21 {TkCreateFrame procedure} -constraints {
	defaultPseudocolor8 haveGrayscale8 nonPortable
} -setup {
	deleteWindows
} -body {
    set x ok
    ::tko::toplevel .t -visual {grayscale 8} -width 300 -height 200 -bg #434343
    wm geometry .t +0+0
    update
    ::TEST::colorsFree .t 131 131 131
} -cleanup {
    deleteWindows
} -result {1}
if {[testConstraint defaultPseudocolor8]} {
    destroy .t1
}

test frame-3.22 {TkCreateFrame procedure, default dimensions} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t
    wm geometry .t +0+0
    update
    set result "[winfo reqwidth .t] [winfo reqheight .t]"
    ::tko::frame .t.f -bg red
    pack .t.f
    update
    lappend result [winfo reqwidth .t.f] [winfo reqheight .t.f]
} -cleanup {
    deleteWindows
} -result {200 200 1 1}

test frame-3.23 {TkCreateFrame procedure} -setup {
    deleteWindows
} -body {
    ::tko::frame .f -gorp glob
} -returnCodes error -result {unknown options: -gorp glob}

test frame-3.24 {TkCreateFrame procedure} -setup {
    deleteWindows
} -body {
    ::tko::toplevel .t -width 300 -height 200 -colormap new -bogus option
    wm geometry .t +0+0
} -returnCodes error -result {unknown options: -bogus option}


test frame-4.1 {TkCreateFrame procedure} -setup {
	deleteWindows
} -body {
    catch {::tko::frame .f -gorp glob}
    winfo exists .f
} -result 0

test frame-4.2 {TkCreateFrame procedure} -setup {
	deleteWindows
} -body {
    list [::tko::frame .f -width 200 -height 100] [winfo exists .f]
} -cleanup {
    deleteWindows
} -result {.f 1}


::tko::frame .f -highlightcolor black

test frame-5.1 {FrameWidgetCommand procedure} -body {
    .f
} -returnCodes error -result {wrong # args: should be ".f method ?arg ...?"}

test frame-5.2 {FrameWidgetCommand procedure, cget option} -body {
    .f cget
} -returnCodes error -result {wrong # args: should be ".f cget option"}

test frame-5.3 {FrameWidgetCommand procedure, cget option} -body {
    .f cget a b
} -returnCodes error -result {wrong # args: should be ".f cget option"}

test frame-5.4 {FrameWidgetCommand procedure, cget option} -body {
    .f cget -gorp
} -returnCodes error -result {unknown option "-gorp"}

test frame-5.5 {FrameWidgetCommand procedure, cget option} -body {
    .f cget -highlightcolor
} -result {black}

test frame-5.6 {FrameWidgetCommand procedure, cget option} -body {
    .f cget -screen
} -returnCodes error -result {unknown option "-screen"}

test frame-5.7 {FrameWidgetCommand procedure, cget option} -setup {
    destroy .t
} -body {
    ::tko::toplevel .t
    .t cget -screen
} -cleanup {
    destroy .t
} -returnCodes ok -match glob -result *

test frame-5.8 {FrameWidgetCommand procedure, configure option} -body {
    llength [.f configure]
} -result {18}

test frame-5.9 {FrameWidgetCommand procedure, configure option} -body {
    .f configure -gorp
} -returnCodes error -result {unknown option "-gorp"}

test frame-5.10 {FrameWidgetCommand procedure, configure option} -body {
    .f configure -gorp bogus
} -returnCodes error -result {unknown option "-gorp"}

test frame-5.11 {FrameWidgetCommand procedure, configure option} -body {
    .f configure -width 200 -height
} -returnCodes error -result {wrong # args: should be ".f configure ?-option value ..?"}

test frame-5.12 {FrameWidgetCommand procedure} -body {
    .f swizzle
} -returnCodes error -result {unknown method "swizzle": must be cget or configure}

test frame-5.13 {FrameWidgetCommand procedure, configure option} -body {
    llength [. configure]
} -result {21}
destroy .f

test frame-6.1 {ConfigureFrame procedure} -setup {
	deleteWindows
} -body {
    ::tko::frame .f -width 150
    list [winfo reqwidth .f] [winfo reqheight .f]
} -cleanup {
    deleteWindows
} -result {150 1}

test frame-6.2 {ConfigureFrame procedure} -setup {
	deleteWindows
} -body {
    ::tko::frame .f -height 97
    list [winfo reqwidth .f] [winfo reqheight .f]
} -cleanup {
    deleteWindows
} -result {1 97}

test frame-6.3 {ConfigureFrame procedure} -setup {
	deleteWindows
} -body {
    ::tko::frame .f
    set result {}
    lappend result [winfo reqwidth .f] [winfo reqheight .f]
    .f configure -width 100 -height 180
    lappend result [winfo reqwidth .f] [winfo reqheight .f]
    .f configure -width 0 -height 0
    lappend result [winfo reqwidth .f] [winfo reqheight .f]
} -cleanup {
    deleteWindows
} -result {1 1 100 180 100 180}

test frame-7.1 {FrameEventProc procedure} -setup {
	deleteWindows
} -body {
    ::tko::frame .frame2
    set result [info commands .frame2]
    destroy .frame2
    lappend result [info commands .frame2]
} -result {.frame2 {}}

test frame-7.2 {FrameEventProc procedure} -setup {
	deleteWindows
    set x {}
} -body {
    frame .f1 -bg #543210
    rename .f1 .f2
    lappend x [winfo children .]
    lappend x [.f2 cget -bg]
    destroy .f1
    lappend x [info command .f*] [winfo children .]
} -cleanup {
    deleteWindows
} -result {.f1 #543210 {} {}}

test frame-8.1 {FrameCmdDeletedProc procedure} -setup {
	deleteWindows
} -body {
    ::tko::frame .f1
    rename .f1 {}
    list [info command .f*] [winfo children .]
} -cleanup {
    deleteWindows
} -result {{} {}}

test frame-8.2 {FrameCmdDeletedProc procedure} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .f1 -menu .m
    wm geometry .f1 +0+0
    update
    rename .f1 {}
    update
    list [info command .f*] [winfo children .]
} -cleanup {
    deleteWindows
} -result {{} {}}
#
# This one fails with the dash-patch!!!! Still don't know why  :-(
#
#test frame-8.3 {FrameCmdDeletedProc procedure} -setup {
#    eval destroy [winfo children .]
#    deleteWindows
#} -body {
#    ::tko::toplevel .f1 -menu .m
#    wm geometry .f1 +0+0
#    menu .m
#    update
#    rename .f1 {}
#    update
#    list [info command .f*] [winfo children .]
#} -cleanup {
#    eval destroy [winfo children .]
#    deleteWindows
#} -result {{} .m}

test frame-9.1 {MapFrame procedure} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 100 -height 400
    wm geometry .t +0+0
    set result [winfo ismapped .t]
    update idletasks
    lappend result [winfo ismapped .t]
} -cleanup {
    deleteWindows
} -result {0 1}

test frame-9.2 {MapFrame procedure} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t -width 100 -height 400
    wm geometry .t +0+0
    destroy .t
    update
    winfo exists .t
} -result {0}

test frame-9.3 {MapFrame procedure, window deleted while mapping} -setup {
	deleteWindows
} -body {
    ::tko::toplevel .t2 -width 200 -height 200
    wm geometry .t2 +0+0
    tkwait visibility .t2
    ::tko::toplevel .t -width 100 -height 400
    wm geometry .t +0+0
    ::tko::frame .t2.f -width 50 -height 50
    bind .t2.f <Configure> {destroy .t}
    pack .t2.f -side top
    update idletasks
    winfo exists .t
} -cleanup {
    deleteWindows
} -result {0}


test frame-10.1 {frame widget vs hidden commands} -setup {
	deleteWindows
} -body {
    set l [interp hidden]
    ::tko::frame .t
    interp hide {} .t
    destroy .t
    set res1 [list [winfo children .] [interp hidden]]
    set res2 [list {} $l]
    expr {$res1 eq $res2}
} -result 1


test frame-11.1 {TkInstallFrameMenu} -setup {
	deleteWindows
} -body {
    menu .m1
    .m1 add cascade -menu .m1.system
    menu .m1.system -tearoff 0
    .m1.system add command -label foo
    ::tko::toplevel .t -menu .m1
} -cleanup {
    deleteWindows
} -result {.t}

test frame-11.2 {TkInstallFrameMenu - frame renamed} -setup {
	deleteWindows
} -body {
    catch {rename foo {}}
    menu .m1
    .m1 add cascade -menu .m1.system
    menu .m1.system -tearoff 0
    .m1.system add command -label foo
    ::tko::toplevel .t
    rename .t foo
} -cleanup {
    deleteWindows
} -result {}


test frame-12.1 {FrameWorldChanged procedure} -setup {
	deleteWindows
} -body {
    # Test -bd -padx and -pady
    ::tko::frame .f -borderwidth 2 -padx 3 -pady 4
    place .f -x 0 -y 0 -width 40 -height 40
    pack [::tko::frame .f.f] -fill both -expand 1
    update
    list [winfo x .f.f] [winfo y .f.f] [winfo width .f.f] [winfo height .f.f]
} -cleanup {
    deleteWindows
} -result {5 6 30 28}

test frame-12.2 {FrameWorldChanged procedure} -setup {
	deleteWindows
} -body {
    # Test all -labelanchor positions
    set font {helvetica 12}
    ::tko::labelframe .f -highlightthickness 1 -bd 3 -padx 1 -pady 2 -font $font \
            -text "Mupp"
    set fh [expr {[font metrics $font -linespace] + 2 - 3}]
    set fw [expr {[font measure $font "Mupp"] + 2 - 3}]
    if {$fw < 0} {set fw 0}
    if {$fh < 0} {set fh 0}
    place .f -x 0 -y 0 -width 100 -height 100
    pack [::tko::frame .f.f] -fill both -expand 1

    set result {}
    foreach lp {nw n ne en e es se s sw ws w wn} {
        .f configure -labelanchor $lp
        update
        set expx 5
        set expy 6
        set expw 90
        set exph 88
        switch -glob $lp {
            n* {incr expy $fh ; incr exph -$fh}
            s* {incr exph -$fh}
            w* {incr expx $fw ; incr expw -$fw}
            e* {incr expw -$fw}
        }
        lappend result [expr {\
                [winfo x .f.f] == $expx && [winfo y .f.f] == $expy &&\
                [winfo width .f.f] == $expw && [winfo height .f.f] == $exph}]
    }
    return $result
} -cleanup {
    deleteWindows
} -result {1 1 1 1 1 1 1 1 1 1 1 1}

test frame-12.3 {FrameWorldChanged procedure} -setup {
	deleteWindows
} -body {
    # Check reaction on font change
    font create myfont -family courier -size 10
    ::tko::labelframe .f -font myfont -text Mupp
    place .f -x 0 -y 0 -width 40 -height 40
    pack [::tko::frame .f.f] -fill both -expand 1
    update
    set h1 [font metrics myfont -linespace]
    set y1 [winfo y .f.f]
    font configure myfont -size 20
    update
    set h2 [font metrics myfont -linespace]
    set y2 [winfo y .f.f]
    expr {($h2 - $h1) - ($y2 - $y1)}
} -cleanup {
    deleteWindows
    font delete myfont
} -result {0}


test frame-13.1 {labelframe configuration options} -setup {
	deleteWindows
} -body {
    ::tko::labelframe .f -class NewFrame
    .f configure -class
} -cleanup {
    deleteWindows
} -result {-class class Class TkoLabelframe NewFrame}

test frame-13.2 {labelframe configuration options} -setup {
    deleteWindows
} -body {
    ::tko::labelframe .f -class NewFrame
    .f configure -class Different
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {*: option "-class" is readonly}

test frame-13.3 {labelframe configuration options} -setup {
	deleteWindows
} -body {
    ::tko::labelframe .f -colormap new
} -cleanup {
    deleteWindows
} -result {.f}

test frame-13.4 {labelframe configuration options} -setup {
	deleteWindows
} -body {
    ::tko::labelframe .f -visual default
} -cleanup {
    deleteWindows
} -result {.f}

test frame-13.5 {labelframe configuration options} -setup {
	deleteWindows
} -body {
    ::tko::labelframe .f -screen bogus
} -cleanup {
    deleteWindows
} -returnCodes error -result {unknown options: -screen bogus}

test frame-13.6 {labelframe configuration options} -setup {
	deleteWindows
} -body {
    labelframe .f -container true
} -cleanup {
    deleteWindows
} -result {.f}

# Removed. Should be deprectaed in frame too.
#test frame-13.7 {labelframe configuration options} -setup {
#    deleteWindows
#} -body {
#    ::tko::labelframe .f -container true
#    .f configure -container
#} -cleanup {
#    deleteWindows
#} -result {-container container Container 0 1}
#
#test frame-13.8 {labelframe configuration options} -setup {
#	deleteWindows
#} -body {
#     ::tko::labelframe .f -container bogus
#} -cleanup {
#    deleteWindows
#} -returnCodes error -result {expected boolean value but got "bogus"}
#
#test frame-13.9 {labelframe configuration options} -setup {
#	deleteWindows
#} -body {
#    ::tko::labelframe .f
#    .f configure -container 1
#} -cleanup {
#    deleteWindows
#} -returnCodes error -result {can't modify -container option after widget is created}

destroy .f
::tko::labelframe .f
test frame-13.10 {labelframe configuration options} -body {
    .f configure -background #ff0000
    lindex [.f configure -background] 4
} -cleanup {
    .f configure -background [lindex [.f configure -background] 3]
} -result {#ff0000}

test frame-13.11 {labelframe configuration options} -body {
        .f configure -background non-existent
} -returnCodes error -match glob -result {*: unknown color name "non-existent"}

test frame-13.12 {labelframe configuration options} -body {
    .f configure -bd 4
    lindex [.f configure -bd] 4
} -cleanup {
    .f configure -bd [lindex [.f configure -bd] 3]
} -result {4}

test frame-13.13 {labelframe configuration options} -body {
        .f configure -bd badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-13.14 {labelframe configuration options} -body {
    .f configure -bg #00ff00
    lindex [.f configure -bg] 4
} -cleanup {
    .f configure -bg [lindex [.f configure -bg] 3]
} -result {#00ff00}

test frame-13.15 {labelframe configuration options} -body {
        .f configure -bg non-existent
} -returnCodes error -match glob -result {*: unknown color name "non-existent"}

test frame-13.16 {labelframe configuration options} -body {
    .f configure -borderwidth 1.3
    lindex [.f configure -borderwidth] 4
} -cleanup {
    .f configure -borderwidth [lindex [.f configure -borderwidth] 3]
} -result {1}

test frame-13.17 {labelframe configuration options} -body {
        .f configure -borderwidth badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-13.18 {labelframe configuration options} -body {
    .f configure -cursor arrow
    lindex [.f configure -cursor] 4
} -cleanup {
    .f configure -cursor [lindex [.f configure -cursor] 3]
} -result {arrow}

test frame-13.19 {labelframe configuration options} -body {
        .f configure -cursor badValue
} -returnCodes error -match glob -result {*: bad cursor spec "badValue"}

test frame-13.20 {labelframe configuration options} -body {
    .f configure -fg #0000ff
    lindex [.f configure -fg] 4
} -cleanup {
    .f configure -fg [lindex [.f configure -fg] 3]
} -result {#0000ff}

test frame-13.21 {labelframe configuration options} -body {
        .f configure -fg non-existent
} -returnCodes error -match glob -result {*: unknown color name "non-existent"}

test frame-13.22 {labelframe configuration options} -body {
    .f configure -font {courier 8}
    lindex [.f configure -font] 4
} -cleanup {
    .f configure -font [lindex [.f configure -font] 3]
} -result {courier 8}

test frame-13.23 {labelframe configuration options} -body {
    .f configure -foreground #ff0000
    lindex [.f configure -foreground] 4
} -cleanup {
    .f configure -foreground [lindex [.f configure -foreground] 3]
} -result {#ff0000}

test frame-13.24 {labelframe configuration options} -body {
        .f configure -foreground non-existent
} -returnCodes error -match glob -result {*: unknown color name "non-existent"}

test frame-13.25 {labelframe configuration options} -body {
    .f configure -height 100
    lindex [.f configure -height] 4
} -cleanup {
    .f configure -height [lindex [.f configure -height] 3]
} -result {100}

test frame-13.26 {labelframe configuration options} -body {
        .f configure -height not_a_number
} -returnCodes error -match glob -result {*: bad screen distance "not_a_number"}

test frame-13.27 {labelframe configuration options} -body {
    .f configure -highlightbackground #112233
    lindex [.f configure -highlightbackground] 4
} -cleanup {
    .f configure -highlightbackground [lindex [.f configure -highlightbackground] 3]
} -result {#112233}

test frame-13.28 {labelframe configuration options} -body {
        .f configure -highlightbackground ugly
} -returnCodes error -match glob -result {*: unknown color name "ugly"}

test frame-13.29 {labelframe configuration options} -body {
    .f configure -highlightcolor #123456
    lindex [.f configure -highlightcolor] 4
} -cleanup {
    .f configure -highlightcolor [lindex [.f configure -highlightcolor] 3]
} -result {#123456}

test frame-13.30 {labelframe configuration options} -body {
        .f configure -highlightcolor non-existent
} -returnCodes error -match glob -result {*: unknown color name "non-existent"}

test frame-13.31 {labelframe configuration options} -body {
    .f configure -highlightthickness 6
    lindex [.f configure -highlightthickness] 4
} -cleanup {
    .f configure -highlightthickness [lindex [.f configure -highlightthickness] 3]
} -result {6}

test frame-13.32 {labelframe configuration options} -body {
        .f configure -highlightthickness badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-13.33 {labelframe configuration options} -body {
    .f configure -labelanchor se
    lindex [.f configure -labelanchor] 4
} -cleanup {
    .f configure -labelanchor [lindex [.f configure -labelanchor] 3]
} -result {se}

test frame-13.34 {labelframe configuration options} -body {
        .f configure -labelanchor badValue
} -returnCodes error -match glob -result {*: bad labelanchor "badValue": must be e, en, es, n, ne, nw, s, se, sw, w, wn, or ws}

test frame-13.35 {labelframe configuration options} -body {
    .f configure -padx 3
    lindex [.f configure -padx] 4
} -cleanup {
    .f configure -padx [lindex [.f configure -padx] 3]
} -result {3}

test frame-13.36 {labelframe configuration options} -body {
        .f configure -padx badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-13.37 {labelframe configuration options} -body {
    .f configure -pady 4
    lindex [.f configure -pady] 4
} -cleanup {
    .f configure -pady [lindex [.f configure -pady] 3]
} -result {4}

test frame-13.38 {labelframe configuration options} -body {
        .f configure -pady badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}

test frame-13.39 {labelframe configuration options} -body {
    .f configure -relief ridge
    lindex [.f configure -relief] 4
} -cleanup {
    .f configure -relief [lindex [.f configure -relief] 3]
} -result {ridge}

test frame-13.40 {labelframe configuration options} -body {
        .f configure -relief badValue
} -returnCodes error -match glob -result {*: bad relief "badValue": must be flat, groove, raised, ridge, solid, or sunken}

test frame-13.41 {labelframe configuration options} -body {
    .f configure -takefocus {any string}
    lindex [.f configure -takefocus] 4
} -cleanup {
    .f configure -takefocus [lindex [.f configure -takefocus] 3]
} -result {any string}

test frame-13.42 {labelframe configuration options} -body {
    .f configure -text {any string}
    lindex [.f configure -text] 4
} -cleanup {
    .f configure -text [lindex [.f configure -text] 3]
} -result {any string}

test frame-13.43 {labelframe configuration options} -body {
    .f configure -width 32
    lindex [.f configure -width] 4
} -cleanup {
    .f configure -width [lindex [.f configure -width] 3]
} -result {32}

test frame-13.44 {labelframe configuration options} -body {
        .f configure -width badValue
} -returnCodes error -match glob -result {*: bad screen distance "badValue"}
destroy .f

test frame-14.1 {labelframe labelwidget option} -setup {
	deleteWindows
} -body {
    # Test that label is moved in stacking order
    label .l -text Mupp -font {helvetica 8}
    ::tko::labelframe .f -labelwidget .l
    pack .f
    ::tko::frame .f.f -width 50 -height 50
    pack .f.f
    update
    list [winfo children .] [winfo width .f] \
        [expr {[winfo height .f] - [winfo height .l]}]
} -cleanup {
    deleteWindows
} -result {{.f .l} 54 52}

test frame-14.2 {labelframe labelwidget option} -setup {
	deleteWindows
} -body {
    # Test the labelframe's reaction if the label is destroyed
    label .l -text Aratherlonglabel
    ::tko::labelframe .f -labelwidget .l
    pack .f
    label .f.l -text Mupp
    pack .f.l
    update
    set res [list [.f cget -labelwidget]]
    lappend res [expr {[winfo width .f] - [winfo width .l]}]
    destroy .l
    lappend res [.f cget -labelwidget]
    update
    lappend res [expr {[winfo width .f] - [winfo width .f.l]}]
} -cleanup {
    deleteWindows
} -result {.l 12 {} 4}

test frame-14.3 {labelframe labelwidget option} -setup {
	deleteWindows
} -body {
    # Test the labelframe's reaction if the label is stolen
    label .l -text Aratherlonglabel
    ::tko::labelframe .f -labelwidget .l
    pack .f
    label .f.l -text Mupp
    pack .f.l
    update
    set res [list [.f cget -labelwidget]]
    lappend res [expr {[winfo width .f] - [winfo width .l]}]
    pack .l
    lappend res [.f cget -labelwidget]
    update
    lappend res [expr {[winfo width .f] - [winfo width .f.l]}]
} -cleanup {
    deleteWindows
} -result {.l 12 {} 4}

test frame-14.4 {labelframe labelwidget option} -setup {
	deleteWindows
} -body {
    # Test the label's reaction if the labelframe is destroyed
    label .l -text Mupp
    ::tko::labelframe .f -labelwidget .l
    pack .f
    update
    set res [list [winfo manager .l]]
    destroy .f
    lappend res [winfo manager .l]
} -cleanup {
    deleteWindows
} -result {labelframe {}}

test frame-14.5 {labelframe labelwidget option} -setup {
	deleteWindows
} -body {
    # Test that the labelframe reacts on changes in label
    label .l -text Aratherlonglabel
    ::tko::labelframe .f -labelwidget .l
    pack .f
    label .f.l -text Mupp
    pack .f.l
    update
    set first [winfo width .f]
    set res [expr {[winfo width .f] - [winfo width .l]}]
    .l configure -text Shorter
    update
    lappend res [expr {[winfo width .f] - [winfo width .l]}]
    lappend res [expr {[winfo width .f] < $first}]
    .l configure -text Alotlongerthananytimebefore
    update
    lappend res [expr {[winfo width .f] - [winfo width .l]}]
    lappend res [expr {[winfo width .f] > $first}]
} -cleanup {
    deleteWindows
} -result {12 12 1 12 1}

test frame-14.6 {labelframe labelwidget option} -setup {
	deleteWindows
} -body {
    # Destroying a labelframe with a child label caused a crash
    # when not handling mapping of the label correctly.
    # This test does not test anything directly, it's just ment
    # to catch if the same mistake is made again.
    ::tko::labelframe .f
    pack .f
    label .f.l -text Mupp
    .f configure -labelwidget .f.l
    update
} -cleanup {
    deleteWindows
} -result {}

test frame-20.1 {configure optionadd wrong args} -setup {
    deleteWindows
} -body {
    ::tko::frame .f
    .f configure optionadd
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {wrong # args: *}

test frame-20.2 {configure optionadd wrong args} -setup {
    deleteWindows
} -body {
    ::tko::frame .f
    .f configure optionadd -option
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {wrong # args: *}

test frame-20.3 {configure optionadd wrong synonym} -setup {
    deleteWindows
} -body {
    ::tko::frame .f
    .f configure optionadd -option mmm
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {wrong synonym name for option*}

test frame-20.3 {configure optionadd missing command} -setup {
    deleteWindows
} -body {
    ::tko::frame .f
    .f configure optionadd -option option Option value
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {unknown method "-option": must be*}

test frame-20.4 {configure optionadd} -setup {
    deleteWindows
} -body {
    ::tko::frame .f
    ::oo::objdefine .f method -option {} {}
    .f configure optionadd -option option Option value
    .f cget -option
} -cleanup {
    deleteWindows
} -result {value}

test frame-20.5 {configure optionadd modify} -setup {
    deleteWindows
} -body {
    ::tko::frame .f
    ::oo::objdefine .f method -option {} {my variable tko; set tko(-option) new}
    .f configure optionadd -option option Option value
    .f cget -option
} -cleanup {
    deleteWindows
} -result {new}

test frame-20.6 {configure optiondel} -setup {
    deleteWindows
} -body {
    ::tko::frame .f
    .f configure optiondel -notexist
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {unknown option "-notexist"}

test frame-20.7 {configure optionaddand optiondel} -setup {
    deleteWindows
} -body {
    ::tko::frame .f
    ::oo::objdefine .f method -option {} {}
    set ret [llength [.f configure]]
    .f configure optionadd -option option Option value
    lappend ret [llength [.f configure]]
    .f cget -option
    .f configure optiondel -option
    lappend ret [llength [.f configure]]
} -cleanup {
    deleteWindows
} -result {18 19 18}

test frame-20.8 {configure optionadd readonly} -setup {
    deleteWindows
} -body {
    ::tko::frame .f
    ::oo::objdefine .f method -option {} {}
    set ret [llength [.f configure]]
    .f configure optionadd -option option Option value 1
    if {[.f cget -option] ne {value}} {error "option not set"}
    .f configure -option test
} -cleanup {
    deleteWindows
} -returnCodes error -match glob -result {* is readonly}

test frame-20.9 {configure optionvar get} -setup {
    deleteWindows
} -body {
    ::tko::frame .f
    ::oo::objdefine .f method -option {} {}
    .f configure optionadd -option option Option value
    set [.f configure optionvar](-option)
} -cleanup {
    deleteWindows
} -result {value}

test frame-20.10 {configure optionvar set} -setup {
    deleteWindows
} -body {
    ::tko::frame .f
    ::oo::objdefine .f method -option {} {}
    .f configure optionadd -option option Option value
    set [.f configure optionvar](-option) other
    .f cget -option
} -cleanup {
    deleteWindows
} -result {other}

deleteWindows
rename ::TEST::eatColors {}
rename ::TEST::colorsFree {}

# cleanup
cleanupTests
}
catch {namespace delete ::TEST}

# vim: set ts=4 sw=4 sts=4 ff=unix et :
