# Commands covered:  treectrl's widget command column
#
# This file contains a collection of tests for the column widget command of
# the tktreectrl extension.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 2000 by Scriptics Corporation.
# Copyright (c) 2002 by Christian Krone.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# CVS: @(#) $Id: column.test,v 1.3 2003/01/04 13:18:30 krischan Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest 2
    namespace import ::tcltest::*
}

package require Tk
package_require treectrl

test column-0.1 {some needed preparations} -body {
    pack [treectrl .t]
} -result {}

test column-0.2 {create an image} -body {
    image create photo emptyImg
} -result {emptyImg}

test column-1.1 {missing args} -body {
    .t column
} -returnCodes error -result {wrong # args: should be ".t column command ?arg arg...?"}

test column-1.2 {unknown command} -body {
    .t column foo
} -returnCodes error -result {bad command "foo": must be bbox, cget, configure, delete, index, move, neededwidth, or width}

test column-1.3 {configure: no column exists with numerical index} -body {
    .t column configure 0
} -returnCodes error -result {bad column index "0": there are no columns}

test column-1.4 {configure: no column exists with tag} -body {
    .t column configure column0
} -returnCodes error -result {column with tag "column0" doesn't exist}

test column-1.5 {configure: create and fill a column} -body {
    .t column configure 0 -tag column0
    .t element create e rect -width 482
    .t style create s
    .t style elements s e
    set i [.t item create]
    .t item style set $i 0 s
    .t item lastchild root $i
} -result {1}

test column-1.6 {configure: create another column} -body {
    .t column configure 1 -tag column1
} -result {}

test column-2.1 {column bbox: missing args} -body {
    .t column bbox
} -returnCodes error -result {wrong # args: should be ".t column bbox column"}

test column-2.2 {column bbox: invalid column} -body {
    .t column bbox foo
} -returnCodes error -result {column with tag "foo" doesn't exist}

test column-2.3 {column bbox: tree doesn't show headers} -body {
    .t configure -showheader 0
    .t column bbox column0
} -result {}

test column-2.4 {column bbox} -body {
    .t configure -showheader 1
    .t column bbox 0
} -result {0 3 501 7}

test column-2.5 {column bbox: tail column not allowed} -body {
    .t column bbox tail
} -returnCodes error -result {can't specify "tail" for this command}

test column-3.1 {column configure: missing args} -body {
    .t column configure
} -returnCodes error -result {wrong # args: should be ".t column configure column ?option? ?value?"}

test column-3.2 {column configure: invalid column} -body {
    .t column configure foo
} -returnCodes error -result {column with tag "foo" doesn't exist}

test column-3.3 {column configure: list all options} -body {
    .t column configure column1
} -result {{-arrow {} {} none none} {-arrowside {} {} right right} {-arrowgravity {} {} left left} {-arrowpad {} {} 6 6} {-bitmap {} {} {} {}} {-background {} {} #d9d9d9 #d9d9d9} {-borderwidth {} {} 2 2} {-button {} {} 1 1} {-expand {} {} 0 0} {-font {} {} {} {}} {-image {} {} {} {}} {-imagepadx {} {} 6 6} {-imagepady {} {} 0 0} {-itembackground {} {} {} {}} {-justify {} {} left left} {-minwidth {} {} {} {}} {-relief {} {} raised raised} {-stepwidth {} {} {} {}} {-sunken {} {} 0 0} {-tag {} {} {} column1} {-text {} {} {} {}} {-textcolor {} {} Black Black} {-textpadx {} {} 6 6} {-textpady {} {} 0 0} {-width {} {} {} {}} {-visible {} {} 1 1} {-widthhack {} {} 0 0}}

test column-3.4 {column configure: tail column} -body {
    .t column configure tail
} -result {{-arrow {} {} none none} {-arrowside {} {} right right} {-arrowgravity {} {} left left} {-arrowpad {} {} 6 6} {-bitmap {} {} {} {}} {-background {} {} #d9d9d9 #d9d9d9} {-borderwidth {} {} 2 2} {-button {} {} 1 1} {-expand {} {} 0 0} {-font {} {} {} {}} {-image {} {} {} {}} {-imagepadx {} {} 6 6} {-imagepady {} {} 0 0} {-itembackground {} {} {} {}} {-justify {} {} left left} {-minwidth {} {} {} {}} {-relief {} {} raised raised} {-stepwidth {} {} {} {}} {-sunken {} {} 0 0} {-tag {} {} {} tail} {-text {} {} {} {}} {-textcolor {} {} Black Black} {-textpadx {} {} 6 6} {-textpady {} {} 0 0} {-width {} {} {} {}} {-visible {} {} 1 1} {-widthhack {} {} 0 0}}

test column-3.5 {column configure: invalid -arrow} -body {
    .t column configure column1 -arrow straight
} -returnCodes error -result {bad arrow "straight": must be none, up, or down}

test column-3.6 {column configure/cget: -arrow} -body {
    .t column configure column1 -arrow up
    .t column cget column1 -arrow
} -result {up}

test column-3.7 {column configure: invalid -arrowside} -body {
    .t column configure column1 -arrowside up
} -returnCodes error -result {bad arrowside "up": must be left or right}

test column-3.8 {column configure/cget: -arrowside} -body {
    .t column configure column1 -arrowside left
    .t column cget column1 -arrowside
} -result {left}

test column-3.9 {column configure: invalid -arrowgravity} -body {
    .t column configure column1 -arrowgravity both
} -returnCodes error -result {bad arrowgravity "both": must be left or right}

test column-3.10 {column configure/cget: -arrowgravity} -body {
    .t column configure column1 -arrowgravity right
    .t column cget column1 -arrowgravity
} -result {right}

test column-3.11 {column configure: invalid -arrowpad} -body {
    .t column configure column1 -arrowpad x
} -returnCodes error -result {bad pad amount "x": must be a list of 1 or 2 positive screen distances}

test column-3.11a {column configure: invalid 2 element -arrowpad} -body {
    .t column configure column1 -arrowpad {3 x}
} -returnCodes error -result {bad pad amount "3 x": must be a list of 1 or 2 positive screen distances}

test column-3.12 {column configure/cget: -arrowpad} -body {
    .t column configure column1 -arrowpad 8
    .t column cget column1 -arrowpad
} -result {8}

test column-3.12a {column configure/cget: 2 element -arrowpad} -body {
    .t column configure column1 -arrowpad {8 5}
    .t column cget column1 -arrowpad
} -result {8 5}

test column-3.13 {column configure: invalid -bitmap} -body {
    .t column configure column1 -bitmap foo
} -returnCodes error -result {bitmap "foo" not defined}

test column-3.14 {column configure/cget: -bitmap} -body {
    .t column configure column1 -bitmap questhead
    .t column cget column1 -bitmap
} -result {questhead}

test column-3.15 {column configure: invalid -background} -body {
    .t column configure column1 -background foo
} -returnCodes error -result {unknown color name "foo"}

test column-3.16 {column configure/cget: -background} -body {
    .t column configure column1 -background magenta
    .t column cget column1 -background
} -result {magenta}

test column-3.17 {column configure: invalid -borderwidth} -body {
    .t column configure column1 -borderwidth x
} -returnCodes error -result {bad screen distance "x"}

test column-3.18 {column configure/cget: -borderwidth} -body {
    .t column configure column1 -borderwidth 4
    .t column cget column1 -borderwidth
} -result {4}

test column-3.19 {column configure: invalid -button} -body {
    .t column configure column1 -button ""
} -returnCodes error -result {expected boolean value but got ""}

test column-3.20 {column configure/cget: -button} -body {
    .t column configure column1 -button off
    .t column cget column1 -button
} -result {0}

test column-3.21 {column configure: invalid -expand} -body {
    .t column configure column1 -expand ew
} -returnCodes error -result {expected boolean value but got "ew"}

test column-3.22 {column configure/cget: -expand} -body {
    .t column configure column1 -expand true
    .t column cget column1 -expand
} -result {1}

test column-3.23 {column configure: invalid -image} -body {
    .t column configure column1 -image questhead
} -returnCodes error -result {image "questhead" doesn't exist}

test column-3.24 {column configure/cget: -image} -body {
    .t column configure column1 -image emptyImg
    .t column cget column1 -image
} -result {emptyImg}

test column-3.25 {column configure: invalid -imagepadx} -body {
    .t column configure column1 -imagepadx y
} -returnCodes error -result {bad pad amount "y": must be a list of 1 or 2 positive screen distances}

test column-3.25a {column configure: invalid 2 element -imagepadx} -body {
    .t column configure column1 -imagepadx "y \{"
} -returnCodes error -result {unmatched open brace in list}

test column-3.26 {column configure/cget: -imagepadx} -body {
    .t column configure column1 -imagepadx 9 -imagepady 4
    list [.t column cget column1 -imagepadx] \
	 [.t column cget column1 -imagepady]
} -result {9 4}

test column-3.26a {column configure/cget: 2 element -imagepadx/y} -body {
    .t column configure column1 -imagepadx {9 0} -imagepady {4 3}
    list [.t column cget column1 -imagepadx] \
	 [.t column cget column1 -imagepady]
} -result {{9 0} {4 3}}

test column-3.27 {column configure: invalid -itembackground} -body {
    .t column configure column1 -itembackground no
} -returnCodes error -result {unknown color name "no"}

test column-3.28 {column configure/cget: simple -itembackground} -body {
    .t column configure column1 -itembackground blue
    .t column cget column1 -itembackground
} -result {blue}

test column-3.29 {column configure: invalid -itembackground list} -body {
    .t column configure column1 -itembackground {blue selected green active}
} -returnCodes error -result {unknown color name "selected"}

test column-3.30 {column configure/cget: -itembackground list} -body {
    .t column configure column1 -itembackground {blue green magenta red}
    .t column cget column1 -itembackground
} -result {blue green magenta red}

test column-3.31 {column configure: invalid -justify} -body {
    .t column configure column1 -justify no
} -returnCodes error -result {bad justification "no": must be left, right, or center}

test column-3.32 {column configure/cget: simple -justify} -body {
    .t column configure column1 -justify center
    .t column cget column1 -justify
} -result {center}

test column-3.33 {column configure: invalid -minwidth} -body {
    .t column configure column1 -minwidth z
} -returnCodes error -result {bad screen distance "z"}

test column-3.34 {column configure/cget: -minwidth} -body {
    .t column configure column1 -minwidth 25
    .t column cget column1 -minwidth
} -result {25}

test column-3.35 {column configure: invalid -relief} -body {
    .t column configure column1 -relief yes
} -returnCodes error -result {bad relief "yes": must be flat, groove, raised, ridge, solid, or sunken}

test column-3.36 {column configure/cget: -relief} -body {
    .t column configure column1 -relief sunken
    .t column cget column1 -relief
} -result {sunken}

test column-3.37 {column configure: invalid -stepwidth} -body {
    .t column configure column1 -stepwidth "\t"
} -returnCodes error -result {bad screen distance "	"}

test column-3.38 {column configure/cget: -stepwidth} -body {
    .t column configure column1 -stepwidth 125
    .t column cget column1 -stepwidth
} -result {125}

test column-3.39 {column configure: invalid -sunken} -body {
    .t column configure column1 -sunken groove
} -returnCodes error -result {expected boolean value but got "groove"}

test column-3.40 {column configure/cget: -sunken} -body {
    .t column configure column1 -sunken on
    .t column cget column1 -sunken
} -result {1}

test column-3.41 {column configure: -text} -body {
    .t column configure column1 -text "Text above Column 1"
    .t column cget column1 -text
} -result {Text above Column 1}

test column-3.42 {column configure: invalid -textpadx} -body {
    .t column configure column1 -textpadx baz
} -returnCodes error -result {bad pad amount "baz": must be a list of 1 or 2 positive screen distances}

test column-3.42a {column configure: invalid 2 element -textpadx} -body {
    .t column configure column1 -textpadx {foo bar baz}
} -returnCodes error -result {bad pad amount "foo bar baz": must be a list of 1 or 2 positive screen distances}

test column-3.43 {column configure/cget: -textpadx/y} -body {
    .t column configure column1 -textpadx 8 -textpady 5
    list [.t column cget column1 -textpadx] \
	 [.t column cget column1 -textpady]
} -result {8 5}

test column-3.43a {column configure/cget: 2 element -textpadx/y} -body {
    .t column configure column1 -textpadx {8 4} -textpady {4 5}
    list [.t column cget column1 -textpadx] \
	 [.t column cget column1 -textpady]
} -result {{8 4} {4 5}}

test column-3.44 {column configure: invalid -width} -body {
    .t column configure column1 -width all
} -returnCodes error -result {bad screen distance "all"}

test column-3.45 {column configure/cget: -width} -body {
    .t column configure column1 -width 250
    .t column cget column1 -width
} -result {250}

test column-3.46 {column configure: invalid -visible} -body {
    .t column configure column1 -visible never
} -returnCodes error -result {expected boolean value but got "never"}

test column-3.47 {column configure/cget: -visible} -body {
    .t column configure column1 -visible no
    .t column cget column1 -visible
} -result {0}

test column-3.48 {column configure: invalid -widthhack} -body {
    .t column configure column1 -widthhack ok
} -returnCodes error -result {expected boolean value but got "ok"}

test column-3.49 {column configure/cget: -widthhack} -body {
    .t column configure column1 -widthhack yes
    .t column cget column1 -widthhack
} -result {1}

test column-4.1 {column configure: -tag} -body {
    .t column configure column1 -tag column2
    .t column cget column1 -tag
} -returnCodes error -result {column with tag "column1" doesn't exist}

test column-4.2 {column configure: -tag} -body {
    .t column cget column2 -tag
} -result {column2}

test column-4.3 {column cget: -tag of tail} -body {
    .t column cget tail -tag
} -result {tail}

test column-4.4 {column configure/cget: -tag of tail} -body {
    .t column configure tail -tag head
} -returnCodes error -result {can't change tag of tail column}

test column-4.5 {column cget: specify tail by its tag} -body {
    .t column cget head -tag
} -returnCodes error -result {column with tag "head" doesn't exist}

test column-5.1 {column delete: missing args} -body {
    .t column delete
} -returnCodes error -result {wrong # args: should be ".t column delete column"}

test column-5.2 {column delete: column tail} -body {
    .t column delete tail
} -returnCodes error -result {can't specify "tail" for this command}

test column-5.3 {column delete: first column} -body {
    .t column delete 0
} -result {}

test column-5.4 {suprise, surprise: column 0 still exists} -body {
    .t column cget 0 -tag
} -result {column2}

test column-6.1 {column index: missing args} -body {
    .t column index
} -returnCodes error -result {wrong # args: should be ".t column index column"}

test column-6.2 {column index: the easy case} -body {
    .t column index 0
} -result {0}

test column-6.3 {column index} -body {
    .t column index column2
} -result {0}

test column-6.4 {column index: tail column} -body {
    .t column index tail
} -result {1}

test column-7.1 {column move: missing args} -body {
    .t column move
} -returnCodes error -result {wrong # args: should be ".t column move column before"}

test column-7.2 {column move: invalid column} -body {
    .t column move 0 2
} -returnCodes error -result {bad column index "2": must be from 0 to 0}

test column-7.3 {column move: invalid column} -body {
    .t column configure 1 -tag column1
    .t column configure 2 -tag column3
    .t column move 0 2
    .t column index column2
} -result {1}

test column-7.4 {correct moved?} -body {
    set res {}
    for {set x 0} {$x < [.t numcolumns]} {incr x} {
	lappend res [.t column cget $x -tag]
    }
    set res
} -result {column1 column2 column3}

test column-7.5 {column move: tail to the left} -body {
    .t column move tail 0
} -returnCodes error -result {can't specify "tail" for this command}

test column-7.6 {column move: tail as before is ok} -body {
    .t column move 0 tail
    .t column index column1
} -result {2}

test column-8.1 {column width: missing args} -body {
    .t column width
} -returnCodes error -result {wrong # args: should be ".t column width column"}

test column-8.2 {column width: invalid column} -body {
    .t column width foo
} -returnCodes error -result {column with tag "foo" doesn't exist}

test column-8.3 {column width: tail column returns always 0} -body {
    .t column width tail
} -result {0}

test column-8.4 {column width} -body {
    .t element create eText2 text -font {{courier -12}} -text "Hello World"
    .t style create testStyle3
    .t style elements testStyle3 eText2
    .t item style set 1 column1 testStyle3
    update idletasks
    list [.t column width column1] [font measure {courier -12} "Hello World"]
} -result {77 77}

test column-9.1 {column neededwidth: missing args} -body {
    .t column neededwidth
} -returnCodes error -result {wrong # args: should be ".t column neededwidth column"}

test column-9.2 {column neededwidth: invalid column} -body {
    .t column neededwidth foo
} -returnCodes error -result {column with tag "foo" doesn't exist}

test column-9.3 {column neededwidth: tail column returns always 0} -body {
    .t column neededwidth tail
} -result {0}

test column-9.4 {column neededwidth} -body {
    .t column neededwidth column1
} -result {77}

test column-99.1 {some needed cleanup} -body {
    destroy .t
} -result {}

# cleanup
image delete emptyImg
::tcltest::cleanupTests
return
