# This file is a Tcl script to test out [incr Widgets] Combobox class.
# It is organized in the standard fashion for Tcl tests with the following
# notation for test case labels:
#
#   1.x - Construction/Destruction tests
#   2.x - Configuration option tests
#   3.x - Method tests
#
# Copyright (c) 1995 John S. Sigler
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.

package require tcltest
namespace import -force ::tcltest::*
loadTestedCommands

if [catch {package require Iwidgets 4.0}] {
  # Let's try modifying the auto_path.  Note that the IWIDGETS_LIBRARY
  # env var is initialized in the Makefile when doing a 'make test'.
  # If sourcing this file independently, this variable must be set manually.
  if ![info exists env(IWIDGETS_LIBRARY)] {
    error "Unable to locate Iwidgets package.  Set your IWIDGETS_LIBRARY\
      environment\nvariable to the directory that contains iwidgets.tcl"
  }
  lappend auto_path $env(IWIDGETS_LIBRARY)
  package require Iwidgets 4.0
}

if {[string compare test [info procs test]] == 1} {
    source defs
}

wm geometry . {}
raise .

set c 1
set o 1
set m 1

#
# Initial construction test
#
test Combobox-1.$c {Combobox construction} {
    iwidgets::Combobox .cb
    pack .cb -padx 10 -pady 10 -fill x -expand yes
    update 
} {}

incr c

#
# Option tests which are successful.
#
test Combobox-2.$o {configuration option} {
    llength [.cb configure]
} {52}

incr o

image create bitmap flagup -file $tk_library/demos/images/flagup.[expr {
    [package vcompare [package present Tk] 8.5] < 0 ? "bmp" : "xbm"
}]

foreach test {
    {-listheight 150 150}
    {-width 20 20}
    {-textvariable option option}
    {-labeltext Combobox: Combobox:} 
    {-labelpos nw nw}
    {-labelpos n n}
    {-labelpos ne ne}
    {-labelpos w w}
    {-labelimage flagup flagup}
    {-labelpos nw nw}
    {-labelpos n n}
    {-labelpos ne ne}
    {-labelpos w w}
    {-labelimage {} {}} 
    {-borderwidth 10 10}
    {-borderwidth 2 2}
    {-background steelblue steelblue}
    {-foreground white white}
    {-background grey85 grey85}
    {-foreground Black Black}
    {-textvariable {} {}}
    {-state disabled disabled}
    {-state normal normal}
    {-textvariable option option}
    {-arrowrelief groove groove}
    {-arrowrelief flat flat}
    {-arrowrelief raised raised}
    {-selectioncommand {doit} {@scope :: doit}}
    {-selectioncommand {} {}}
    {-cursor {} {}}
	{-grab global global}
	{-grab local local}
    {-textvariable {} {} }
    {-dropdown false false}
    {-dropdown true true}
    {-textvariable option option}
    {-editable true true}
    {-editable false false}
    {-relief raised raised}
    {-relief groove groove}
    {-relief flat flat}
    {-relief sunken sunken}
    {-exportselection 1 1}
    {-exportselection 0 0}
    {-invalid {catch {blt_bell}} {catch {blt_bell}} }
    {-labelmargin 2 2}
    {-labelfont -Adobe-Helvetica-Bold-R-Normal--*-120-*  \
	-Adobe-Helvetica-Bold-R-Normal--*-120-*}
    {-margin 5 5}
    {-popupcursor hand1 hand1}
    {-popupcursor hand2 hand2}
    {-selectbackground \#b2dfee \#b2dfee}
    {-selectbackground steelblue steelblue}
    {-selectborderwidth 1 1}
    {-selectforeground Black Black}
    {-sticky w w}
    {-sticky nw nw}
    {-sticky n n}
    {-sticky ne ne}
    {-sticky e e}
    {-sticky se se}
    {-sticky s s}
    {-sticky sw sw}
    {-sticky news news}
    {-textbackground white white}
    {-textfont 10x20 10x20}
    {-textfont -Adobe-Helvetica-Medium-R-Normal--*-120-* \
	-Adobe-Helvetica-Medium-R-Normal--*-120-*} 
    {-textvariable {} {} }
    {-unique true true}
    {-validate alpha alpha}
    {-validate {} {}}
    {-dropdown false false}
    {-hscrollmode dynamic static}
    {-hscrollmode dynamic dynamic}
    {-vscrollmode dynamic static}
	{-grab global global}
    {-vscrollmode dynamic dynamic}
    {-dropdown true true}} {
	set option [lindex $test 0]
	test Combobox-2.$o "configuration options, $option" {
	    .cb configure $option [lindex $test 2]
	    lindex [.cb configure $option] 4
	} [lindex $test 2]
	update 
	incr o
    }

#
# Option tests which fail and produce errors.
#
foreach test {
    {-borderwidth bogus {bad screen distance "bogus"}}
	{-completion bogus {bad completion option "bogus": should be boolean}}
    {-cursor bogus {bad cursor spec "bogus"}}
    {-dropdown bogus {bad dropdown option "bogus": should be boolean}}
	{-editable bogus {bad editable option "bogus": should be boolean}}
    {-exportselection bogus {expected boolean value but got "bogus"}}
    {-grab bogus {bad grab value "bogus": must be global or local}}
    {-listheight bogus {bad screen distance "bogus"}}
    {-hscrollmode bogus {bad hscrollmode option "bogus": should be static, dynamic, or none}}
    {-margin bogus {bad screen distance "bogus"}}
    {-popupcursor bogus {bad cursor spec "bogus"}}
    {-selectborderwidth bogus {bad screen distance "bogus"}}
    {-state bogus {bad state "bogus": must be disabled or normal}}
    {-unique bogus {bad unique value "bogus": should be boolean}}
    {-vscrollmode bogus {bad vscrollmode option "bogus": should be static, dynamic, or none}}
    {-width bogus {expected integer but got "bogus"}} } {
        if {[lindex $test 0] == "-state"} {
          if {$::tk_version >= 8.4} {
            # A new state was added to the Tk entry widget in 8.4.
            set test {-state bogus {bad state "bogus": must be disabled, normal, or readonly}}
          }
        }
	set option [lindex $test 0]
        test Combobox-2.$o "configuration options, $option" {
	    list [catch {.cb configure $option [lindex $test 1]} msg] $msg
	} [list 1 [lindex $test 2]]
	incr o
}
#
# Method tests which are successful.
#
foreach test {
    {{.cb configure -editable 1} {}}
    {{.cb clear all} {}}
    {{.cb insert list 0 Test1 Test2 Test3 Test4} {}}
    {{.cb insert list end {More Test}} {}}
    {{.cb size} {5}}
    {{.cb delete list 1} {}}
    {{.cb delete list 0 2} {}}
    {{.cb size} {1}}
    {{.cb get 0} {More Test}}
    {{.cb selection set end end} {}}
    {{.cb getcurselection} {More Test}}
    {{.cb get} {More Test}}
    {{.cb clear entry} {}}
    {{.cb get} {}}
    {{.cb insert entry end "this is a test"} {} }
    {{.cb get} {this is a test}}
    {{.cb curselection} {}}
    {{.cb clear} {}}
    {{.cb size} {0}}
    {{.cb getcurselection} {}}
    {{.cb insert list end {Test1} {Test2} {Really Long String Test}} {}}
    {{.cb size} {3}}
    {{.cb get 0} {Test1}}
	{{.cb insert entry end R} {}}
	{{.cb getcurselection} {Really Long String Test}}
	{{.cb get} {Really Long String Test}}
	{{.cb config -completion off} {}}
	{{.cb selection clear 0 end} {}}
	{{.cb insert entry end R} {}}
	{{.cb get} {R}}
	{{.cb getcurselection} {}}
	{{.cb config -completion on} {}}
    {{.cb get [expr [.cb size]-1]} {Really Long String Test}}
    {{.cb insert list 0 {Test3} {Test4} {Really Long String Test}} {}}
    {{.cb size} {6}}
    {{.cb insert list 1 {Test5} {Test6} {Really Long String Test}} {}}
    {{.cb size} {9}}
    {{.cb insert list 5 {Test7} {Test8} {Really Long String Test}} {}}
    {{.cb size} {12}}
	{{.cb config -state disabled} {}}
	{{.cb insert list end {not gonna make it in}} {}}
	{{.cb size} {12}}
	{{.cb insert entry end {eally!}} {}}
	{{.cb get} {R}}
	{{.cb config -state normal} {}}
	{{.cb config -dropdown 0} {}}
	{{.cb size} {12}}
	{{.cb config -dropdown 1} {}}
	{{.cb size} {12}}
    {{.cb see 0} {}}
    {{.cb see 11} {}}
    {{.cb get end} {Really Long String Test}}
    {{.cb selection clear 0 end} {}}
    {{.cb selection set 5 5} {}}
    {{.cb curselection} {5}}
    {{.cb justify left} {}}
    {{.cb justify right} {}}
    {{.cb justify top} {}}
    {{.cb justify bottom} {}}
    {{.cb sort ascending} {}}
    {{.cb sort descending} {}}
    {{.cb sort increasing} {}}
    {{.cb sort decreasing} {}}} {
	set method [lindex [lindex $test 0] 1]
	test Combobox-3.$m "object methods, $method" {
	    list [catch {eval [lindex $test 0]} msg] $msg
	} [list 0 [lindex $test 1]]
	update 
	incr m
}

#
# Method tests which fail and produce errors
#
foreach test {
    {{.cb clear bogus} {bad Combobox component "bogus": must be entry, list, or all.}}
    {{.cb delete} {wrong # args: should be ".cb delete component first ?last?"}}
    {{.cb delete bogus 0} {bad Combobox component "bogus": must be entry or list.}}
    {{.cb delete list} {wrong # args: should be ".cb delete component first ?last?"}}
    {{.cb delete entry} {wrong # args: should be ".cb delete component first ?last?"}}
    {{.cb get bogus1 bogus2} {wrong # args: should be ".cb get ?index?"}}
    {{.cb insert} {wrong # args: should be ".cb insert component index ?arg arg ...?"}}
    {{.cb insert bogus 0 bogus0} {bad Combobox component "bogus": must be entry or list.}}
    {{.cb insert list} {wrong # args: should be ".cb insert component index ?arg arg ...?"}}
    {{.cb insert list 1} {no value given for parameter "string" in function "Combobox::insert"}}
    {{.cb insert entry a b c} {called function "Combobox::insert entry" with too many arguments}}
    {{.cb selection} {wrong # args: should be ".cb selection option first ?last?"}}
    {{.cb selection bogus1 bogus2 bogus3 bogus4} {wrong # args: should be ".cb selection option first ?last?"}}
    {{.cb selection bogus bogus} {bad Scrolledlistbox index "bogus": must be active, anchor, end, @x,y, number, or a pattern}}
    {{.cb sort bogus} {bad sort argument "bogus": must be a valid argument to the Tcl lsort command}}} {
    set method [lindex [lindex $test 0] 1]
    test Combobox-3.$m "object methods, $method" {
	list [catch {eval [lindex $test 0]} msg] $msg
    } [list 1 [lindex $test 1]]
    incr m
}

#
# Conclusion of constrcution/destruction tests
#
test Combobox-4.1 {Combobox destruction} {
    destroy .cb
    update 
} {}

incr c

test Combobox-4.2 {Combobox construction} {
    iwidgets::Combobox .cb3 -selectioncommand {puts "choice: [.cb get]" } \
	-dropdown false -listheight 50 \
	-labeltext "Numeric Simple:" -labelpos w \
	-validate numeric -unique false
	.cb3 insert list end 123 456 789 101112
    pack .cb3 -padx 10 -pady 10 -fill both -expand yes
    update 
} {}

incr c

test Combobox-4.3 {Combobox destruction} {
    destroy .cb3
    update 
} {}

test Combobox-4.4 {Combobox construction} {
    iwidgets::Combobox .cb4 -arrowrelief flat -selectioncommand {puts "choice: [.cb get]" } \
	-editable false \
	-listheight 200 -labeltext "DropDown:" -labelpos w \
	-popupcursor hand1 -unique true
	.cb4 insert list end Hello {Out There} World
    pack .cb4 -padx 10 -pady 10 -fill both -expand yes
    update 
} {}

incr c

test Combobox-4.5 {Combobox destruction} {
    destroy .cb4
    update 
} {}

::tcltest::cleanupTests
exit
