sl@0: # Package covered: opt1.0/optparse.tcl sl@0: # sl@0: # This file contains a collection of tests for one or more of the Tcl sl@0: # built-in commands. Sourcing this file into Tcl runs the tests and sl@0: # generates output for errors. No output means no errors were found. sl@0: # sl@0: # Copyright (c) 1991-1993 The Regents of the University of California. sl@0: # Copyright (c) 1994-1997 Sun Microsystems, Inc. sl@0: # Copyright (c) 1998-1999 by Scriptics Corporation. sl@0: # sl@0: # See the file "license.terms" for information on usage and redistribution sl@0: # of this file, and for a DISCLAIMER OF ALL WARRANTIES. sl@0: # sl@0: # RCS: @(#) $Id: opt.test,v 1.8 2000/07/18 21:30:41 ericm Exp $ sl@0: sl@0: if {[lsearch [namespace children] ::tcltest] == -1} { sl@0: package require tcltest sl@0: namespace import -force ::tcltest::* sl@0: } sl@0: sl@0: # the package we are going to test sl@0: package require opt 0.4.1 sl@0: sl@0: # we are using implementation specifics to test the package sl@0: sl@0: sl@0: #### functions tests ##### sl@0: sl@0: set n $::tcl::OptDescN sl@0: sl@0: test opt-1.1 {OptKeyRegister / check that auto allocation is skipping existing keys} { sl@0: list [::tcl::OptKeyRegister {} $n] [::tcl::OptKeyRegister {} [expr $n+1]] [::tcl::OptKeyRegister {}] sl@0: } "$n [expr $n+1] [expr $n+2]" sl@0: sl@0: test opt-2.1 {OptKeyDelete} { sl@0: list [::tcl::OptKeyRegister {} testkey] \ sl@0: [info exists ::tcl::OptDesc(testkey)] \ sl@0: [::tcl::OptKeyDelete testkey] \ sl@0: [info exists ::tcl::OptDesc(testkey)] sl@0: } {testkey 1 {} 0} sl@0: sl@0: sl@0: test opt-3.1 {OptParse / temp key is removed} { sl@0: set n $::tcl::OptDescN sl@0: set prev [array names ::tcl::OptDesc] sl@0: ::tcl::OptKeyRegister {} $n sl@0: list [info exists ::tcl::OptDesc($n)]\ sl@0: [::tcl::OptKeyDelete $n]\ sl@0: [::tcl::OptParse {{-foo}} {}]\ sl@0: [info exists ::tcl::OptDesc($n)]\ sl@0: [expr {"[lsort $prev]"=="[lsort [array names ::tcl::OptDesc]]"}] sl@0: } {1 {} {} 0 1} sl@0: sl@0: sl@0: test opt-3.2 {OptParse / temp key is removed even on errors} { sl@0: set n $::tcl::OptDescN sl@0: catch {::tcl::OptKeyDelete $n} sl@0: list [catch {::tcl::OptParse {{-foo}} {-blah}}] \ sl@0: [info exists ::tcl::OptDesc($n)] sl@0: } {1 0} sl@0: sl@0: test opt-4.1 {OptProc} { sl@0: ::tcl::OptProc optTest {} {} sl@0: optTest ; sl@0: ::tcl::OptKeyDelete optTest sl@0: } {} sl@0: sl@0: sl@0: test opt-5.1 {OptProcArgGiven} { sl@0: ::tcl::OptProc optTest {{-foo}} { sl@0: if {[::tcl::OptProcArgGiven "-foo"]} { sl@0: return 1 sl@0: } else { sl@0: return 0 sl@0: } sl@0: } sl@0: list [optTest] [optTest -f] [optTest -F] [optTest -fOO] sl@0: } {0 1 1 1} sl@0: sl@0: test opt-6.1 {OptKeyParse} { sl@0: ::tcl::OptKeyRegister {} test; sl@0: list [catch {::tcl::OptKeyParse test {-help}} msg] $msg sl@0: } {1 {Usage information: sl@0: Var/FlagName Type Value Help sl@0: ------------ ---- ----- ---- sl@0: ( -help gives this help )}} sl@0: sl@0: sl@0: test opt-7.1 {OptCheckType} { sl@0: list \ sl@0: [::tcl::OptCheckType 23 int] \ sl@0: [::tcl::OptCheckType 23 float] \ sl@0: [::tcl::OptCheckType true boolean] \ sl@0: [::tcl::OptCheckType "-blah" any] \ sl@0: [::tcl::OptCheckType {a b c} list] \ sl@0: [::tcl::OptCheckType maYbe choice {yes maYbe no}] \ sl@0: [catch {::tcl::OptCheckType "-blah" string}] \ sl@0: [catch {::tcl::OptCheckType 6 boolean}] \ sl@0: [catch {::tcl::OptCheckType x float}] \ sl@0: [catch {::tcl::OptCheckType "a \{ c" list}] \ sl@0: [catch {::tcl::OptCheckType 2.3 int}] \ sl@0: [catch {::tcl::OptCheckType foo choice {x y Foo z}}] sl@0: } {23 23.0 1 -blah {a b c} maYbe 1 1 1 1 1 1} sl@0: sl@0: sl@0: test opt-8.1 {List utilities} { sl@0: ::tcl::Lempty {} sl@0: } 1 sl@0: test opt-8.2 {List utilities} { sl@0: ::tcl::Lempty {a b c} sl@0: } 0 sl@0: test opt-8.3 {List utilities} { sl@0: ::tcl::Lget {a {b c d} e} {1 2} sl@0: } d sl@0: sl@0: test opt-8.4 {List utilities} { sl@0: set l {a {b c d e} f} sl@0: ::tcl::Lvarset l {1 2} D sl@0: set l sl@0: } {a {b c D e} f} sl@0: sl@0: test opt-8.5 {List utilities} { sl@0: set l {a b c} sl@0: ::tcl::Lvarset1 l 6 X sl@0: set l sl@0: } {a b c {} {} {} X} sl@0: sl@0: test opt-8.6 {List utilities} { sl@0: set l {a {b c 7 e} f} sl@0: ::tcl::Lvarincr l {1 2} sl@0: set l sl@0: } {a {b c 8 e} f} sl@0: sl@0: test opt-8.7 {List utilities} { sl@0: set l {a {b c 7 e} f} sl@0: ::tcl::Lvarincr l {1 2} -9 sl@0: set l sl@0: } {a {b c -2 e} f} sl@0: sl@0: test opt-8.10 {List utilities} { sl@0: set l {a {b c 7 e} f} sl@0: ::tcl::Lvarpop l sl@0: set l sl@0: } {{b c 7 e} f} sl@0: sl@0: test opt-8.11 {List utilities} { sl@0: catch {unset x} sl@0: set l {a {b c 7 e} f} sl@0: list [::tcl::Lassign $l u v w x] \ sl@0: $u $v $w [info exists x] sl@0: } {3 a {b c 7 e} f 0} sl@0: sl@0: test opt-9.1 {Misc utilities} { sl@0: catch {unset v} sl@0: ::tcl::SetMax v 3 sl@0: ::tcl::SetMax v 7 sl@0: ::tcl::SetMax v 6 sl@0: set v sl@0: } 7 sl@0: sl@0: test opt-9.2 {Misc utilities} { sl@0: catch {unset v} sl@0: ::tcl::SetMin v 3 sl@0: ::tcl::SetMin v -7 sl@0: ::tcl::SetMin v 1 sl@0: set v sl@0: } -7 sl@0: sl@0: #### behaviour tests ##### sl@0: sl@0: test opt-10.1 {ambigous flags} { sl@0: ::tcl::OptProc optTest {{-fla} {-other} {-flag2xyz} {-flag3xyz}} {} sl@0: catch {optTest -fL} msg sl@0: set msg sl@0: } {ambigous option "-fL", choose from: sl@0: -fla boolflag (false) sl@0: -flag2xyz boolflag (false) sl@0: -flag3xyz boolflag (false) } sl@0: sl@0: test opt-10.2 {non ambigous flags} { sl@0: ::tcl::OptProc optTest {{-flag1xyz} {-other} {-flag2xyz} {-flag3xyz}} { sl@0: return $flag2xyz sl@0: } sl@0: optTest -fLaG2 sl@0: } 1 sl@0: sl@0: test opt-10.3 {non ambigous flags because of exact match} { sl@0: ::tcl::OptProc optTest {{-flag1x} {-other} {-flag1} {-flag1xy}} { sl@0: return $flag1 sl@0: } sl@0: optTest -flAg1 sl@0: } 1 sl@0: sl@0: test opt-10.4 {ambigous flags, not exact match} { sl@0: ::tcl::OptProc optTest {{-flag1xy} {-other} {-flag1} {-flag1xyz}} { sl@0: return $flag1 sl@0: } sl@0: catch {optTest -fLag1X} msg sl@0: set msg sl@0: } {ambigous option "-fLag1X", choose from: sl@0: -flag1xy boolflag (false) sl@0: -flag1xyz boolflag (false) } sl@0: sl@0: sl@0: sl@0: # medium size overall test example: (defined once) sl@0: ::tcl::OptProc optTest { sl@0: {cmd -choice {print save delete} "sub command to choose"} sl@0: {-allowBoing -boolean true} sl@0: {arg2 -string "this is help"} sl@0: {?arg3? 7 "optional number"} sl@0: {-moreflags} sl@0: } { sl@0: list $cmd $allowBoing $arg2 $arg3 $moreflags sl@0: } sl@0: sl@0: test opt-10.5 {medium size overall test} { sl@0: list [catch {optTest} msg] $msg sl@0: } {1 {no value given for parameter "cmd" (use -help for full usage) : sl@0: cmd choice (print save delete) sub command to choose}} sl@0: sl@0: sl@0: test opt-10.6 {medium size overall test} { sl@0: list [catch {optTest -help} msg] $msg sl@0: } {1 {Usage information: sl@0: Var/FlagName Type Value Help sl@0: ------------ ---- ----- ---- sl@0: ( -help gives this help ) sl@0: cmd choice (print save delete) sub command to choose sl@0: -allowBoing boolean (true) sl@0: arg2 string () this is help sl@0: ?arg3? int (7) optional number sl@0: -moreflags boolflag (false) }} sl@0: sl@0: test opt-10.7 {medium size overall test} { sl@0: optTest save tst sl@0: } {save 1 tst 7 0} sl@0: sl@0: test opt-10.8 {medium size overall test} { sl@0: optTest save -allowBoing false -- 8 sl@0: } {save 0 8 7 0} sl@0: sl@0: test opt-10.9 {medium size overall test} { sl@0: optTest save tst -m -- sl@0: } {save 1 tst 7 1} sl@0: sl@0: test opt-10.10 {medium size overall test} { sl@0: list [catch {optTest save tst foo} msg] [lindex [split $msg "\n"] 0] sl@0: } {1 {too many arguments (unexpected argument(s): foo), usage:}} sl@0: sl@0: test opt-11.1 {too many args test 2} { sl@0: set key [::tcl::OptKeyRegister {-foo}] sl@0: list [catch {::tcl::OptKeyParse $key {-foo blah}} msg] $msg\ sl@0: [::tcl::OptKeyDelete $key] sl@0: } {1 {too many arguments (unexpected argument(s): blah), usage: sl@0: Var/FlagName Type Value Help sl@0: ------------ ---- ----- ---- sl@0: ( -help gives this help ) sl@0: -foo boolflag (false) } {}} sl@0: test opt-11.2 {default value for args} { sl@0: set args {} sl@0: set key [::tcl::OptKeyRegister {{args -list {a b c} "args..."}}] sl@0: ::tcl::OptKeyParse $key {} sl@0: ::tcl::OptKeyDelete $key sl@0: set args sl@0: } {a b c} sl@0: sl@0: # cleanup sl@0: ::tcltest::cleanupTests sl@0: return sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: