426 lines
16 KiB
Plaintext
426 lines
16 KiB
Plaintext
#
|
|
# Tests for information accessed by the "info" command
|
|
# ----------------------------------------------------------------------
|
|
# AUTHOR: Michael J. McLennan
|
|
# Bell Labs Innovations for Lucent Technologies
|
|
# mmclennan@lucent.com
|
|
# http://www.tcltk.com/itcl
|
|
# ----------------------------------------------------------------------
|
|
# 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 tcltest 2.2
|
|
namespace import ::tcltest::test
|
|
::tcltest::loadTestedCommands
|
|
package require itcl
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Class definition with one of everything
|
|
# ----------------------------------------------------------------------
|
|
test info-1.1 {define a simple class} {
|
|
itcl::class test_info_base {
|
|
method base {} {return "default"}
|
|
variable base {}
|
|
|
|
method do {args} {eval $args}
|
|
}
|
|
itcl::class test_info {
|
|
inherit test_info_base
|
|
|
|
constructor {args} {
|
|
foreach v [info variable] {
|
|
catch {set $v "new-[set $v]"}
|
|
}
|
|
}
|
|
destructor {}
|
|
|
|
method defm {} {return "default method"}
|
|
public method pubm {x} {return "public method"}
|
|
protected method prom {x y} {return "protected method"}
|
|
private method prim {x y z} {return "private method"}
|
|
|
|
proc defp {} {return "default proc"}
|
|
public proc pubp {x} {return "public proc"}
|
|
protected proc prop {x y} {return "protected proc"}
|
|
private proc prip {x y z} {return "private proc"}
|
|
|
|
variable defv "default"
|
|
public variable pubv "public" {set pubv "public: $pubv"}
|
|
protected variable prov "protected"
|
|
private variable priv "private"
|
|
|
|
common defc "default"
|
|
public common pubc "public"
|
|
protected common proc "protected"
|
|
private common pric "private"
|
|
|
|
method uninitm
|
|
proc uninitp {x y}
|
|
variable uninitv
|
|
common uninitc
|
|
set uninitc(0) zero
|
|
set uninitc(1) one
|
|
}
|
|
} ""
|
|
|
|
test info-1.2 {info: errors trigger usage info} {
|
|
list [catch {namespace eval test_info {info}} msg] $msg
|
|
} {1 {wrong # args: should be one of...
|
|
info args procname
|
|
info body procname
|
|
info class
|
|
info function ?name? ?-protection? ?-type? ?-name? ?-args? ?-body?
|
|
info heritage
|
|
info inherit
|
|
info variable ?name? ?-protection? ?-type? ?-name? ?-init? ?-value? ?-config? ?-scope?
|
|
...and others described on the man page}}
|
|
|
|
test info-1.3 {info: errors trigger usage info} {
|
|
test_info ti
|
|
list [catch {ti info} msg] $msg
|
|
} {1 {wrong # args: should be one of...
|
|
info args procname
|
|
info body procname
|
|
info class
|
|
info function ?name? ?-protection? ?-type? ?-name? ?-args? ?-body?
|
|
info heritage
|
|
info inherit
|
|
info variable ?name? ?-protection? ?-type? ?-name? ?-init? ?-value? ?-config? ?-scope?
|
|
...and others described on the man page}}
|
|
|
|
test info-1.4 {info: info class works on class itself} {
|
|
namespace eval test_info { info class }
|
|
} {::test_info}
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Data members
|
|
# ----------------------------------------------------------------------
|
|
test info-2.1 {info: all variables} {
|
|
lsort [ti info variable]
|
|
} {::test_info::defc ::test_info::defv ::test_info::pric ::test_info::priv ::test_info::proc ::test_info::prov ::test_info::pubc ::test_info::pubv ::test_info::this ::test_info::uninitc ::test_info::uninitv ::test_info_base::base}
|
|
|
|
test info-2.2a {info: public variables} {
|
|
ti info variable pubv
|
|
} {public variable ::test_info::pubv public {set pubv "public: $pubv"} new-public}
|
|
|
|
test info-2.2b {info: public variables} -body {
|
|
list [ti info variable pubv -protection] \
|
|
[ti info variable pubv -type] \
|
|
[ti info variable pubv -name] \
|
|
[ti info variable pubv -init] \
|
|
[ti info variable pubv -config] \
|
|
[ti info variable pubv -value] \
|
|
[ti info variable pubv -scope] \
|
|
} -match glob -result {public variable ::test_info::pubv public {set pubv "public: $pubv"} new-public ::itcl::internal::variables::oo::Obj*::test_info::pubv}
|
|
|
|
test info-2.3a {info: protected variables} {
|
|
ti info variable prov
|
|
} {protected variable ::test_info::prov protected new-protected}
|
|
|
|
test info-2.3b {info: protected variables} -body {
|
|
list [ti info variable prov -protection] \
|
|
[ti info variable prov -type] \
|
|
[ti info variable prov -name] \
|
|
[ti info variable prov -init] \
|
|
[ti info variable prov -value] \
|
|
[ti info variable prov -scope] \
|
|
} -match glob -result {protected variable ::test_info::prov protected new-protected ::itcl::internal::variables::oo::Obj*::test_info::prov}
|
|
|
|
test info-2.4a {info: private variables} {
|
|
ti info variable priv
|
|
} {private variable ::test_info::priv private new-private}
|
|
|
|
test info-2.4b {info: private variables} -body {
|
|
list [ti info variable priv -protection] \
|
|
[ti info variable priv -type] \
|
|
[ti info variable priv -name] \
|
|
[ti info variable priv -init] \
|
|
[ti info variable priv -value] \
|
|
[ti info variable priv -scope] \
|
|
} -match glob -result {private variable ::test_info::priv private new-private ::itcl::internal::variables::oo::Obj*::test_info::priv}
|
|
|
|
test info-2.5 {"this" variable is built in} {
|
|
ti info variable this
|
|
} {protected variable ::test_info::this ::ti ::ti}
|
|
|
|
test info-2.6 {info: protected/private variables have no "config" code} {
|
|
list [ti info variable prov -config] [ti info variable priv -config]
|
|
} {{} {}}
|
|
|
|
test info-2.7 {by default, variables are "protected"} {
|
|
ti info variable defv
|
|
} {protected variable ::test_info::defv default new-default}
|
|
|
|
test info-2.8 {data members may be uninitialized} {
|
|
ti info variable uninitv
|
|
} {protected variable ::test_info::uninitv <undefined> <undefined>}
|
|
|
|
test info-2.9a {info: public common variables} {
|
|
ti info variable pubc
|
|
} {public common ::test_info::pubc public new-public}
|
|
|
|
test info-2.9b {info: public common variables} {
|
|
list [ti info variable pubc -protection] \
|
|
[ti info variable pubc -type] \
|
|
[ti info variable pubc -name] \
|
|
[ti info variable pubc -init] \
|
|
[ti info variable pubc -value] \
|
|
[ti info variable pubc -scope] \
|
|
} {public common ::test_info::pubc public new-public ::test_info::pubc}
|
|
|
|
test info-2.10a {info: protected common variables} {
|
|
ti info variable proc
|
|
} {protected common ::test_info::proc protected new-protected}
|
|
|
|
test info-2.10b {info: protected common variables} {
|
|
list [ti info variable proc -protection] \
|
|
[ti info variable proc -type] \
|
|
[ti info variable proc -name] \
|
|
[ti info variable proc -init] \
|
|
[ti info variable proc -value] \
|
|
[ti info variable proc -scope] \
|
|
} {protected common ::test_info::proc protected new-protected ::itcl::internal::variables::test_info::proc}
|
|
|
|
test info-2.11a {info: private common variables} {
|
|
ti info variable pric
|
|
} {private common ::test_info::pric private new-private}
|
|
|
|
test info-2.11b {info: private common variables} {
|
|
list [ti info variable pric -protection] \
|
|
[ti info variable pric -type] \
|
|
[ti info variable pric -name] \
|
|
[ti info variable pric -init] \
|
|
[ti info variable pric -value] \
|
|
[ti info variable pric -scope] \
|
|
} {private common ::test_info::pric private new-private ::itcl::internal::variables::test_info::pric}
|
|
|
|
test info-2.12 {info: public/protected/private vars have no "config" code} {
|
|
list [ti info variable pubc -config] \
|
|
[ti info variable proc -config] \
|
|
[ti info variable pric -config]
|
|
} {{} {} {}}
|
|
|
|
test info-2.13 {by default, variables are "protected"} {
|
|
ti info variable defc
|
|
} {protected common ::test_info::defc default new-default}
|
|
|
|
test info-2.14 {data members may be uninitialized} {
|
|
ti info variable uninitc
|
|
} {protected common ::test_info::uninitc <undefined> <undefined>}
|
|
|
|
test info-2.15 {common vars can be initialized within class definition} {
|
|
list [namespace eval test_info {lsort [array names uninitc]}] \
|
|
[namespace eval test_info {set uninitc(0)}] \
|
|
[namespace eval test_info {set uninitc(1)}]
|
|
} {{0 1} zero one}
|
|
|
|
test info-2.16 {flag syntax errors} {
|
|
list [catch {ti info variable defv -xyzzy} msg] $msg
|
|
} {1 {bad option "-xyzzy": must be -config, -init, -name, -protection, -type, -value, or -scope}}
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Member functions
|
|
# ----------------------------------------------------------------------
|
|
test info-3.1 {info: all functions} {
|
|
lsort [ti info function]
|
|
} {::test_info::constructor ::test_info::defm ::test_info::defp ::test_info::destructor ::test_info::prim ::test_info::prip ::test_info::prom ::test_info::prop ::test_info::pubm ::test_info::pubp ::test_info::uninitm ::test_info::uninitp ::test_info_base::base ::test_info_base::cget ::test_info_base::configure ::test_info_base::do ::test_info_base::isa}
|
|
|
|
test info-3.2a {info: public methods} {
|
|
ti info function pubm
|
|
} {public method ::test_info::pubm x {return "public method"}}
|
|
|
|
test info-3.2b {info: public methods} {
|
|
list [ti info function pubm -protection] \
|
|
[ti info function pubm -type] \
|
|
[ti info function pubm -name] \
|
|
[ti info function pubm -args] \
|
|
[ti info function pubm -body]
|
|
} {public method ::test_info::pubm x {return "public method"}}
|
|
|
|
test info-3.3a {info: protected methods} {
|
|
ti info function prom
|
|
} {protected method ::test_info::prom {x y} {return "protected method"}}
|
|
|
|
test info-3.3b {info: protected methods} {
|
|
list [ti info function prom -protection] \
|
|
[ti info function prom -type] \
|
|
[ti info function prom -name] \
|
|
[ti info function prom -args] \
|
|
[ti info function prom -body]
|
|
} {protected method ::test_info::prom {x y} {return "protected method"}}
|
|
|
|
test info-3.4a {info: private methods} {
|
|
ti info function prim
|
|
} {private method ::test_info::prim {x y z} {return "private method"}}
|
|
|
|
test info-3.4b {info: private methods} {
|
|
list [ti info function prim -protection] \
|
|
[ti info function prim -type] \
|
|
[ti info function prim -name] \
|
|
[ti info function prim -args] \
|
|
[ti info function prim -body]
|
|
} {private method ::test_info::prim {x y z} {return "private method"}}
|
|
|
|
test info-3.5 {"configure" function is built in} {
|
|
ti info function configure
|
|
} {public method ::test_info_base::configure {?-option? ?value -option value...?} @itcl-builtin-configure}
|
|
|
|
test info-3.6 {by default, methods are "public"} {
|
|
ti info function defm
|
|
} {public method ::test_info::defm {} {return "default method"}}
|
|
|
|
test info-3.7 {methods may not have arg lists or bodies defined} {
|
|
ti info function uninitm
|
|
} {public method ::test_info::uninitm <undefined> <undefined>}
|
|
|
|
test info-3.8a {info: public procs} {
|
|
ti info function pubp
|
|
} {public proc ::test_info::pubp x {return "public proc"}}
|
|
|
|
test info-3.8b {info: public procs} {
|
|
list [ti info function pubp -protection] \
|
|
[ti info function pubp -type] \
|
|
[ti info function pubp -name] \
|
|
[ti info function pubp -args] \
|
|
[ti info function pubp -body]
|
|
} {public proc ::test_info::pubp x {return "public proc"}}
|
|
|
|
test info-3.9a {info: protected procs} {
|
|
ti info function prop
|
|
} {protected proc ::test_info::prop {x y} {return "protected proc"}}
|
|
|
|
test info-3.9b {info: protected procs} {
|
|
list [ti info function prop -protection] \
|
|
[ti info function prop -type] \
|
|
[ti info function prop -name] \
|
|
[ti info function prop -args] \
|
|
[ti info function prop -body]
|
|
} {protected proc ::test_info::prop {x y} {return "protected proc"}}
|
|
|
|
test info-3.10a {info: private procs} {
|
|
ti info function prip
|
|
} {private proc ::test_info::prip {x y z} {return "private proc"}}
|
|
|
|
test info-3.10b {info: private procs} {
|
|
list [ti info function prip -protection] \
|
|
[ti info function prip -type] \
|
|
[ti info function prip -name] \
|
|
[ti info function prip -args] \
|
|
[ti info function prip -body]
|
|
} {private proc ::test_info::prip {x y z} {return "private proc"}}
|
|
|
|
test info-3.11 {by default, procs are "public"} {
|
|
ti info function defp
|
|
} {public proc ::test_info::defp {} {return "default proc"}}
|
|
|
|
test info-3.12 {procs may not have arg lists or bodies defined} {
|
|
ti info function uninitp
|
|
} {public proc ::test_info::uninitp {x y} <undefined>}
|
|
|
|
test info-3.13 {flag syntax errors} {
|
|
list [catch {ti info function defm -xyzzy} msg] $msg
|
|
} {1 {bad option "-xyzzy": must be -args, -body, -name, -protection, or -type}}
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Other object-related queries
|
|
# ----------------------------------------------------------------------
|
|
|
|
test info-4.1a {query class (wrong # args)} {
|
|
list [catch {ti info class x} result] $result
|
|
} {1 {wrong # args: should be "info class"}}
|
|
|
|
test info-4.1b {query most-specific class} {
|
|
list [ti info class] [ti do info class]
|
|
} {::test_info ::test_info}
|
|
|
|
test info-4.2a {query inheritance info (wrong # args)} {
|
|
list [catch {ti info inherit x} result] $result
|
|
} {1 {wrong # args: should be "info inherit"}}
|
|
|
|
test info-4.2b {query inheritance info} {
|
|
list [ti info inherit] [ti do info inherit]
|
|
} {::test_info_base {}}
|
|
|
|
test info-4.2c {query inheritance info} {
|
|
ti do ti info inherit
|
|
} {::test_info_base}
|
|
|
|
test info-4.3a {query heritage info (wrong # args)} {
|
|
list [catch {ti info heritage x} result] $result
|
|
} {1 {wrong # args: should be "info heritage"}}
|
|
|
|
test info-4.3b {query heritage info} {
|
|
list [ti info heritage] [ti do info heritage]
|
|
} {{::test_info ::test_info_base} ::test_info_base}
|
|
|
|
test info-4.3c {query heritage info} {
|
|
ti do ti info heritage
|
|
} {::test_info ::test_info_base}
|
|
|
|
test info-4.4a {query argument list (wrong # args)} {
|
|
list [catch {ti info args} result] $result \
|
|
[catch {ti info args x y} result] $result
|
|
} {1 {wrong # args: should be "info args function"} 1 {wrong # args: should be "info args function"}}
|
|
|
|
test info-4.4b {query argument list} {
|
|
ti info args prim
|
|
} {x y z}
|
|
|
|
test info-4.4c {query argument list (undefined)} {
|
|
ti info args uninitm
|
|
} {<undefined>}
|
|
|
|
test info-4.4d {query argument list of real proc} {
|
|
ti info args ::unknown
|
|
} {args}
|
|
|
|
test info-4.4e {query argument list of real proc} {
|
|
itcl::builtin::Info args ::unknown
|
|
} {args}
|
|
|
|
test info-4.5a {query body (wrong # args)} {
|
|
list [catch {ti info body} result] $result \
|
|
[catch {ti info body x y} result] $result
|
|
} {1 {wrong # args: should be "info body function"} 1 {wrong # args: should be "info body function"}}
|
|
|
|
test info-4.5b {query body} {
|
|
ti info body prim
|
|
} {return "private method"}
|
|
|
|
test info-4.5c {query body (undefined)} {
|
|
ti info body uninitm
|
|
} {<undefined>}
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Other parts of the usual "info" command
|
|
# ----------------------------------------------------------------------
|
|
|
|
test info-5.1 {info vars} {
|
|
ti do info vars
|
|
} {args}
|
|
|
|
test info-5.2 {info exists} {
|
|
list [ti do info exists args] [ti do info exists xyzzy]
|
|
} {1 0}
|
|
|
|
test info-6.0 {Bug a03f579f7d} -setup {
|
|
# Must not segfault
|
|
itcl::class C {
|
|
proc p {} {info vars}
|
|
}
|
|
} -body {
|
|
C::p
|
|
} -cleanup {
|
|
itcl::delete class C
|
|
} -result {}
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Clean up
|
|
# ----------------------------------------------------------------------
|
|
itcl::delete class test_info test_info_base
|
|
|
|
::tcltest::cleanupTests
|
|
return
|