167 lines
5.3 KiB
Plaintext
167 lines
5.3 KiB
Plaintext
#
|
|
# Tests for chaining methods and procs
|
|
# ----------------------------------------------------------------------
|
|
# 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.1
|
|
namespace import ::tcltest::test
|
|
::tcltest::loadTestedCommands
|
|
package require itcl
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Chaining methods and procs
|
|
# ----------------------------------------------------------------------
|
|
test chain-1.1 {define simple classes with inheritance} {
|
|
itcl::class test_chain_a {
|
|
constructor {args} {
|
|
#
|
|
eval chain $args
|
|
} {
|
|
global ::test_chain_status
|
|
lappend test_chain_status "a::constructor $args"
|
|
}
|
|
method show {mesg} {
|
|
chain $mesg
|
|
global ::test_chain_status
|
|
lappend test_chain_status "a::show $mesg"
|
|
}
|
|
proc tell {mesg} {
|
|
global ::test_chain_status
|
|
lappend test_chain_status "a::tell $mesg"
|
|
chain $mesg
|
|
}
|
|
}
|
|
itcl::class test_chain_b {
|
|
constructor {args} {
|
|
#
|
|
eval chain $args
|
|
} {
|
|
global ::test_chain_status
|
|
lappend test_chain_status "b::constructor $args"
|
|
}
|
|
method show {mesg} {
|
|
chain $mesg
|
|
global ::test_chain_status
|
|
lappend test_chain_status "b::show $mesg"
|
|
}
|
|
proc tell {mesg} {
|
|
global ::test_chain_status
|
|
lappend test_chain_status "b::tell $mesg"
|
|
chain $mesg
|
|
}
|
|
}
|
|
itcl::class test_chain_c {
|
|
inherit test_chain_a test_chain_b
|
|
constructor {args} {
|
|
eval chain $args
|
|
} {
|
|
global ::test_chain_status
|
|
lappend test_chain_status "c::constructor $args"
|
|
}
|
|
proc tell {mesg} {
|
|
global ::test_chain_status
|
|
lappend test_chain_status "c::tell $mesg"
|
|
chain $mesg
|
|
}
|
|
}
|
|
itcl::class test_chain_d {
|
|
inherit test_chain_c
|
|
constructor {args} {
|
|
eval chain $args
|
|
} {
|
|
global ::test_chain_status
|
|
lappend test_chain_status "d::constructor $args"
|
|
}
|
|
method show {mesg} {
|
|
chain $mesg
|
|
global ::test_chain_status
|
|
lappend test_chain_status "d::show $mesg"
|
|
}
|
|
proc tell {mesg} {
|
|
global ::test_chain_status
|
|
lappend test_chain_status "d::tell $mesg"
|
|
chain $mesg
|
|
}
|
|
}
|
|
} ""
|
|
|
|
test chain-1.2 {create a test object} {
|
|
set test_chain_status ""
|
|
set testobj [test_chain_d #auto 1 2 3]
|
|
set test_chain_status
|
|
} {{b::constructor 1 2 3} {a::constructor 1 2 3} {c::constructor 1 2 3} {d::constructor 1 2 3}}
|
|
|
|
test chain-1.3 {invoke a chained method} {
|
|
set test_chain_status ""
|
|
$testobj show "hello there"
|
|
set test_chain_status
|
|
} {{b::show hello there} {a::show hello there} {d::show hello there}}
|
|
|
|
test chain-1.4 {invoke a chained method with a specific name} {
|
|
set test_chain_status ""
|
|
$testobj test_chain_d::show "hello there"
|
|
set test_chain_status
|
|
} {{b::show hello there} {a::show hello there} {d::show hello there}}
|
|
|
|
test chain-1.5 {chained methods can cross multiple-inheritance branches} {
|
|
set test_chain_status ""
|
|
$testobj test_chain_a::show "hello there"
|
|
set test_chain_status
|
|
} {{b::show hello there} {a::show hello there}}
|
|
|
|
test chain-1.6 {invoke a chained proc} {
|
|
set test_chain_status ""
|
|
test_chain_d::tell "testing 1 2 3"
|
|
set test_chain_status
|
|
} {{d::tell testing 1 2 3} {c::tell testing 1 2 3} {a::tell testing 1 2 3}}
|
|
|
|
test chain-1.7 {invoke a chained proc} {
|
|
set test_chain_status ""
|
|
test_chain_c::tell "testing 1 2 3"
|
|
set test_chain_status
|
|
} {{c::tell testing 1 2 3} {a::tell testing 1 2 3}}
|
|
|
|
test chain-2.1 {create a test object in a base class} {
|
|
set test_chain_status ""
|
|
set testobj [test_chain_c #auto 4 5 6]
|
|
set test_chain_status
|
|
} {{b::constructor 4 5 6} {a::constructor 4 5 6} {c::constructor 4 5 6}}
|
|
|
|
test chain-2.2 {invoke a chained method} {
|
|
set test_chain_status ""
|
|
$testobj show "hello there"
|
|
set test_chain_status
|
|
} {{b::show hello there} {a::show hello there}}
|
|
|
|
test chain-3.0 {invoke "chain" outside of a class} {
|
|
list [catch {itcl::builtin::chain 1 2 3} err] $err
|
|
} {1 {cannot chain functions outside of a class context}}
|
|
|
|
test chain-4.0 {[35a5baca67]} -setup {
|
|
unset -nocomplain ::answer
|
|
itcl::class B {method act args {lappend ::answer B}}
|
|
itcl::class D {inherit B; method act args {lappend ::answer D; chain}}
|
|
} -body {
|
|
[D d] act Now!
|
|
set ::answer
|
|
} -cleanup {
|
|
itcl::delete class B
|
|
unset -nocomplain ::answer
|
|
} -result {D B}
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Clean up
|
|
# ----------------------------------------------------------------------
|
|
itcl::delete class test_chain_d test_chain_c test_chain_b test_chain_a
|
|
|
|
::tcltest::cleanupTests
|
|
return
|