⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basic.test

📁 linux 下的源代码分析阅读器 red hat公司新版
💻 TEST
字号:
## Basic tests for class definition and method/proc access# ----------------------------------------------------------------------#   AUTHOR:  Michael J. McLennan#            Bell Labs Innovations for Lucent Technologies#            mmclennan@lucent.com#            http://www.tcltk.com/itcl##      RCS:  $Id: basic.test 144 2003-02-05 10:56:26Z mdejong $# ----------------------------------------------------------------------#            Copyright (c) 1993-1998  Lucent Technologies, Inc.# ======================================================================# See the file "license.terms" for information on usage and# redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.package require tcltestnamespace import -force ::tcltest::*if {[string compare test [info procs test]] == 1} then {source defs}package require Itcl# ----------------------------------------------------------------------#  Simple class definition# ----------------------------------------------------------------------test basic-1.1 {define a simple class} {    itcl::class Counter {        constructor {args} {            incr num            eval configure $args        }        destructor {            incr num -1        }        method ++ {} {            return [incr val $by]        }        proc num {} {            return $num        }        public variable by 1        protected variable val 0        private common num 0    }} ""test basic-1.2 {class is now defined} {    itcl::find classes Counter} {Counter}test basic-1.3 {access command exists with class name} {    namespace which -command Counter} {::Counter}test basic-1.4 {create a simple object} {    Counter x} {x}test basic-1.5a {object names cannot be duplicated} {    list [catch "Counter x" msg] $msg} {1 {command "x" already exists in namespace "::"}}test basic-1.5b {built-in commands cannot be clobbered} {    list [catch "Counter info" msg] $msg} {1 {command "info" already exists in namespace "::"}}test basic-1.6 {objects have an access command} {    namespace which -command x} {::x}test basic-1.7a {objects are added to the master list} {    itcl::find objects x} {x}test basic-1.7b {objects are added to the master list} {    itcl::find objects -class Counter x} {x}test basic-1.8 {objects can be deleted} {    list [itcl::delete object x] [namespace which -command x]} {{} {}}test basic-1.9 {objects can be recreated with the same name} {    Counter x} {x}test basic-1.10 {objects can be destroyed by deleting their access command} {    rename ::x ""    itcl::find objects x} {}test basic-1.11 {find command supports object names starting with -} {    Counter -foo    itcl::find objects -class Counter -foo} {-foo}# ----------------------------------------------------------------------#  #auto names# ----------------------------------------------------------------------test basic-2.1 {create an object with an automatic name} {    Counter #auto} {counter0}test basic-2.2 {bury "#auto" within object name} {    Counter x#autoy} {xcounter1y}test basic-2.3 {bury "#auto" within object name} {    Counter a#aut#autob} {a#autcounter2b}test basic-2.4 {"#auto" is smart enough to skip names that are taken} {    Counter counter3    Counter #auto} {counter4}# ----------------------------------------------------------------------#  Simple object use# ----------------------------------------------------------------------test basic-3.1 {object access command works} {    Counter c    list [c ++] [c ++] [c ++]} {1 2 3}test basic-3.2 {errors produce usage info} {    list [catch "c xyzzy" msg] $msg} {1 {bad option "xyzzy": should be one of...  c ++  c cget -option  c configure ?-option? ?value -option value...?  c isa className}}test basic-3.3 {built-in configure can query public variables} {    c configure} {{-by 1 1}}test basic-3.4 {built-in configure can query one public variable} {    c configure -by} {-by 1 1}test basic-3.5 {built-in configure can set public variable} {    list [c configure -by 2] [c cget -by]} {{} 2}test basic-3.6 {configure actually changes public variable} {    list [c ++] [c ++]} {5 7}test basic-3.7 {class procs can be accessed} {    Counter::num} {7}test basic-3.8 {obsolete syntax is no longer allowed} {    list [catch "Counter :: num" msg] $msg} {1 {syntax "class :: proc" is an anachronism[incr Tcl] no longer supports this syntax.Instead, remove the spaces from your procedure invocations:  Counter::num ?args?}}# ----------------------------------------------------------------------#  Classes can be destroyed and redefined# ----------------------------------------------------------------------test basic-4.1 {classes can be destroyed} {    list [itcl::delete class Counter] \         [itcl::find classes Counter] \         [namespace children :: Counter] \         [namespace which -command Counter]} {{} {} {} {}}test basic-4.2 {classes can be redefined} {    itcl::class Counter {        method ++ {} {            return [incr val $by]        }        public variable by 1        protected variable val 0    }} {}test basic-4.3 {the redefined class is actually different} {    list [catch "Counter::num" msg] $msg} {1 {invalid command name "Counter::num"}}test basic-4.4 {objects can be created from the new class} {    list [Counter #auto] [Counter #auto]} {counter0 counter1}test basic-4.5 {when a class is destroyed, its objects are deleted} {    list [lsort [itcl::find objects counter*]] \         [itcl::delete class Counter] \         [lsort [itcl::find objects counter*]]} {{counter0 counter1} {} {}}# ----------------------------------------------------------------------#  Namespace variables# ----------------------------------------------------------------------test basic-5.1 {define a simple class with variables in the namespace} {    itcl::class test_globals {        common g1 "global1"        proc getval {name} {            variable $name            return [set [namespace tail $name]]        }        proc setval {name val} {            variable $name            return [set [namespace tail $name] $val]        }        method do {args} {            return [eval $args]        }    }    namespace eval test_globals {        variable g2 "global2"    }} ""test basic-5.2 {create an object for the tests} {    test_globals #auto} {test_globals0}test basic-5.3 {common variables live in the namespace} {    lsort [info vars ::test_globals::*]} {::test_globals::g1 ::test_globals::g2}test basic-5.4 {common variables can be referenced transparently} {    list [catch {test_globals0 do set g1} msg] $msg} {0 global1}test basic-5.5 {namespace variables require a declaration} {    list [catch {test_globals0 do set g2} msg] $msg} {1 {can't read "g2": no such variable}}test basic-5.6a {variable accesses variables within namespace} {    list [catch {test_globals::getval g1} msg] $msg} {0 global1}test basic-5.6a {variable accesses variables within namespace} {    list [catch {test_globals::getval g2} msg] $msg} {0 global2}test basic-5.7 {variable command will not find vars in other namespaces} {    set ::test_global_0 "g0"    list [catch {test_globals::getval test_global_0} msg] $msg \         [catch {test_globals::getval ::test_global_0} msg] $msg \} {1 {can't read "test_global_0": no such variable} 0 g0}test basic-5.8 {to create globals in a namespace, use the full path} {    test_globals::setval ::test_global_1 g1    namespace eval :: {lsort [info globals test_global_*]}} {test_global_0 test_global_1}test basic-5.9 {variable names can have ":" in them} {    test_globals::setval ::test:global:2 g2    namespace eval :: {info globals test:global:2}} {test:global:2}# ----------------------------------------------------------------------#  Array variables# ----------------------------------------------------------------------test basic-6.1 {set up a class definition with array variables} {    proc test_arrays_get {name} {        upvar $name x        set rlist {}        foreach index [lsort [array names x]] {            lappend rlist [list $index $x($index)]        }        return $rlist    }    itcl::class test_arrays {        variable nums        common undefined        common colors        set colors(red)   #ff0000        set colors(green) #00ff00        set colors(blue)  #0000ff        constructor {} {            set nums(one) 1            set nums(two) 2            set nums(three) 3            set undefined(a) A            set undefined(b) B        }        method do {args} {            return [eval $args]        }    }    test_arrays #auto} {test_arrays0}test basic-6.2 {test array access for instance variables} {    lsort [test_arrays0 do array get nums]} {1 2 3 one three two}test basic-6.3 {test array access for commons} {    lsort [test_arrays0 do array get colors]} {#0000ff #00ff00 #ff0000 blue green red}test basic-6.4 {test array access for instance variables via "upvar"} {    test_arrays0 do test_arrays_get nums} {{one 1} {three 3} {two 2}}test basic-6.5 {test array access for commons via "upvar"} {    test_arrays0 do test_arrays_get colors} {{blue #0000ff} {green #00ff00} {red #ff0000}}test basic-6.6a {test array access for commons defined in constructor} {    lsort [test_arrays0 do array get undefined]} {A B a b}test basic-6.6b {test array access for commons defined in constructor} {    test_arrays0 do test_arrays_get undefined} {{a A} {b B}}test basic-6.6c {test array access for commons defined in constructor} {    list [test_arrays0 do set undefined(a)] [test_arrays0 do set undefined(b)]} {A B}test basic-6.7 {common variables can be unset} {    test_arrays0 do unset undefined    test_arrays0 do array names undefined} {}test basic-6.8 {common variables can be redefined} {    test_arrays0 do set undefined "scalar"} {scalar}::tcltest::cleanupTestsreturn

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -