--- /dev/null
+#
+# 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$
+# ----------------------------------------------------------------------
+# 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.
+
+# ----------------------------------------------------------------------
+# CLEAN THE SLATE
+# ----------------------------------------------------------------------
+foreach obj [itcl_info objects -class Foo] {
+ $obj delete
+}
+
+# ----------------------------------------------------------------------
+# CREATING OBJECTS
+# ----------------------------------------------------------------------
+test {Create a simple object} {
+ Foo x
+} {
+ $result == "x"
+}
+
+test {Make sure that object names cannot be duplicated} {
+ catch "Foo x" errmsg
+} {
+ $result == 1
+}
+
+test {Create another object} {
+ Foo xx
+} {
+ $result == "xx"
+}
+
+test {Create an object with an automatic name} {
+ Foo #auto
+} {
+ [string match foo* $result]
+}
+
+test {Get list of objects in a class} {
+ itcl_info objects -class Foo
+} {
+ [llength $result] == 3
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC VARIABLES
+# ----------------------------------------------------------------------
+test {Info: all public variables} {
+ x info public
+} {
+ [test_cmp_lists $result {Foo::blit Foo::blat Foo::blot}]
+}
+
+test {Info: public variable initial value} {
+ x info public blit -init
+} {
+ $result == ""
+}
+
+test {Info: public variable initial value (undefined)} {
+ x info public blit -value
+} {
+ $result == "<undefined>"
+}
+
+test {Info: public variable initial value} {
+ x info public blat -init
+} {
+ $result == 0
+}
+
+test {Info: public variable current value} {
+ x info public blot -value
+} {
+ $result == 1
+}
+
+test {Info: public variable config statement} {
+ x info public blit -config
+} {
+ $result == ""
+}
+
+test {Info: public variable config statement} {
+ x info public blot -config
+} {
+ $result == {global WATCH; set WATCH "blot=$blot"}
+}
+
+# ----------------------------------------------------------------------
+# CONFIG-ING PUBLIC VARIABLES
+# ----------------------------------------------------------------------
+test {Setting public variables via "config"} {
+ x config -blit 27 -blat xyz
+} {
+ $result == "Foo::blit Foo::blat"
+}
+
+test {Info: public variable init/current value} {
+ x info public blit -init -value
+} {
+ $result == {{} 27}
+}
+
+test {Info: public variable init/current value} {
+ x info public blat -init -value
+} {
+ $result == {0 xyz}
+}
+
+test {"config" is ordinary arg if it is not last arg} {
+ x configx -blit pdq
+} {
+ $result == {-blit|pdq}
+}
+
+test {Public variables with "config" code} {
+ set WATCH ""
+ concat [x config -blot abc] / $WATCH
+} {
+ $result == "Foo::blot / blot=abc"
+}
+
+test {Make sure object data is local to objects} {
+ x config -blit abc
+ xx config -blit xyz
+ concat [x info public blit -value] / [xx info public blit -value]
+} {
+ $result == "abc / xyz"
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED VARIABLES
+# ----------------------------------------------------------------------
+test {Info: all protected variables} {
+ x info protected
+} {
+ [test_cmp_lists $result {Foo::_blit Foo::_blat Foo::this}]
+}
+
+test {Info: protected "this" variable} {
+ x info protected this -value
+} {
+ $result == "::x"
+}
+
+test {Info: protected "this" variable} {
+ xx info protected this -value
+} {
+ $result == "::xx"
+}
+
+test {Info: protected variable initial value} {
+ x info protected _blit -init
+} {
+ $result == ""
+}
+
+test {Info: protected variable access/value} {
+ x do {set _blit rst}
+} {
+ $result == "Foo says 'rst'" &&
+ [x info protected _blit -value] == "rst"
+}
+
+# ----------------------------------------------------------------------
+# COMMON VARIABLES
+# ----------------------------------------------------------------------
+test {Info: all protected variables} {
+ x info common
+} {
+ [test_cmp_lists $result {Foo::foos Foo::nfoo}]
+}
+
+test {Info: common variable initial value} {
+ x info common foos -init
+} {
+ $result == ""
+}
+
+test {Info: common variable initial value} {
+ x info common nfoo -init
+} {
+ $result == 0
+}
+
+test {Info: common variable access/value} {
+ x do {set nfoo 999}
+ x info common nfoo -value
+} {
+ $result == 999
+}
+
+test {Make sure common data is really common} {
+ x do {set nfoo 0}
+ x info common nfoo -value
+} {
+ $result == [xx info common nfoo -value]
+}
+
+test {Access common data in proc} {
+ x do {set nfoo 10}
+ Foo :: nfoos
+} {
+ $result == 10
+}
+
+test {Common variables can be initialized within class definition} {
+ x do {if {[info exists foos(_ignore_)]} {set foos(_ignore_)}}
+} {
+ $result == "Foo says 'foos-is-now-an-array'"
+}
+
+test {Arrays as common data} {
+ Foo :: foos
+} {
+ [test_cmp_lists $result [itcl_info objects -class Foo]]
+}
+
+# ----------------------------------------------------------------------
+# METHODS
+# ----------------------------------------------------------------------
+test {Info: all methods} {
+ x info method
+} {
+ [test_cmp_lists $result {
+ Foo::constructor Foo::destructor
+ Foo::nothing Foo::do Foo::xecho
+ Foo::config Foo::xconfig Foo::configx
+ Foo::testMethodArgs
+ Foo::configure Foo::delete Foo::cget Foo::isa
+ }]
+}
+
+test {Info: method args} {
+ x info method nothing -args
+} {
+ $result == ""
+}
+
+test {Info: method args} {
+ x info method xconfig -args
+} {
+ $result == "x config"
+}
+
+test {Info: method body} {
+ x info method nothing -body
+} {
+ $result == ""
+}
+
+test {Info: method body} {
+ x info method xconfig -body
+} {
+ $result == {
+ return "$x|$config"
+ }
+}
+
+# ----------------------------------------------------------------------
+# PROCS
+# ----------------------------------------------------------------------
+test {Info: all procs} {
+ x info proc
+} {
+ [test_cmp_lists $result {
+ Foo::echo Foo::foos Foo::nfoos Foo::testProcArgs
+ }]
+}
+
+test {Info: proc args} {
+ x info proc nfoos -args
+} {
+ $result == ""
+}
+
+test {Info: proc args} {
+ x info proc foos -args
+} {
+ $result == "{pattern *}"
+}
+
+test {Info: proc body} {
+ x info proc nfoos -body
+} {
+ $result == {
+ return $nfoo
+ }
+}
+
+test {Info: proc body} {
+ x info body nfoos
+} {
+ $result == {
+ return $nfoo
+ }
+}
+
+# ----------------------------------------------------------------------
+# ARGUMENT LISTS
+# ----------------------------------------------------------------------
+test {Default arguments can get assigned a proper value} {
+ Foo :: foos x*
+} {
+ [test_cmp_lists $result {x xx}]
+}
+
+test {Default value for "config" argument} {
+ x config
+} {
+ $result == "Foo::blit Foo::blat" &&
+ [x info public blit -value] == "auto" &&
+ [x info public blat -value] == "matic"
+}
+
+test {"args" formal argument absorbs extra arguments} {
+ Foo :: echo abc 1 2 3
+} {
+ $result == "abc | 3: 1 2 3"
+}
+
+test {"args" formal argument absorbs extra arguments} {
+ Foo :: echo def
+} {
+ $result == "def | 0: "
+}
+
+test {"args" formal argument absorbs extra arguments} {
+ x xecho abc 1 2 3
+} {
+ $result == "abc | 3: 1 2 3"
+}
+
+test {"args" formal argument absorbs extra arguments} {
+ x xecho def
+} {
+ $result == "def | 0: "
+}
+
+test {Extra args cause an error} {
+ catch "x configx arg arg error"
+} {
+ $result != 0
+}
+
+test {Extra args cause an error} {
+ catch "x nothing error"
+} {
+ $result != 0
+}
+
+test {Formal arguments don't clobber public/protected variables} {
+ x do {
+ set blit okay
+ set _blit no-problem
+ }
+ x testMethodArgs yuck puke etc.
+} {
+ $result == "yuck, puke, and 1 other args" &&
+ [x info public blit -value] == "okay" &&
+ [x info protected _blit -value] == "no-problem"
+}
+
+test {Formal arguments don't clobber common variables} {
+ Foo :: testProcArgs yuck etc.
+} {
+ $result == "yuck, and 1 other args" &&
+ [x info common nfoo -value] != "yuck"
+}
+
+# ----------------------------------------------------------------------
+# DELETING OBJECTS
+# ----------------------------------------------------------------------
+test {Delete an object} {
+ x delete
+} {
+ $result == ""
+}
+
+test {Delete an object} {
+ xx delete
+} {
+ $result == ""
+}
+
+test {Destructor is properly invoked} {
+ Foo :: foos
+} {
+ [test_cmp_lists $result [itcl_info objects -class Foo]]
+}
+
+test {Object names are removed as commands} {
+ expr {[info commands x] == "" && [info commands xx] == ""}
+} {
+ $result == 1
+}