summaryrefslogtreecommitdiffstats
path: root/tests/ooUtil.test
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ooUtil.test')
-rw-r--r--tests/ooUtil.test586
1 files changed, 0 insertions, 586 deletions
diff --git a/tests/ooUtil.test b/tests/ooUtil.test
deleted file mode 100644
index 9e1de8f..0000000
--- a/tests/ooUtil.test
+++ /dev/null
@@ -1,586 +0,0 @@
-# This file contains a collection of tests for functionality originally
-# sourced from the ooutil package in Tcllib. Sourcing this file into Tcl runs
-# the tests and generates output for errors. No output means no errors were
-# found.
-#
-# Copyright © 2014-2016 Andreas Kupries
-# Copyright © 2018 Donal K. Fellows
-#
-# See the file "license.terms" for information on usage and redistribution of
-# this file, and for a DISCLAIMER OF ALL WARRANTIES.
-
-package require tcl::oo 1.3.0
-if {"::tcltest" ni [namespace children]} {
- package require tcltest 2.5
- namespace import -force ::tcltest::*
-}
-
-test ooUtil-1.1 {TIP 478: classmethod} -setup {
- oo::class create parent
-} -body {
- oo::class create ActiveRecord {
- superclass parent
- classmethod find args {
- return "[self] called with arguments: $args"
- }
- }
- oo::class create Table {
- superclass ActiveRecord
- }
- Table find foo bar
-} -cleanup {
- parent destroy
-} -result {::Table called with arguments: foo bar}
-test ooUtil-1.2 {TIP 478: classmethod in namespace} -setup {
- namespace eval ::testns {}
-} -body {
- namespace eval ::testns {
- oo::class create ActiveRecord {
- classmethod find args {
- return "[self] called with arguments: $args"
- }
- }
- oo::class create Table {
- superclass ActiveRecord
- }
- }
- testns::Table find foo bar
-} -cleanup {
- namespace delete ::testns
-} -result {::testns::Table called with arguments: foo bar}
-test ooUtil-1.3 {TIP 478: classmethod must not interfere with constructor signatures} -setup {
- oo::class create parent
-} -body {
- oo::class create TestClass {
- superclass oo::class parent
- self method create {name ignore body} {
- next $name $body
- }
- }
- TestClass create okay {} {}
-} -cleanup {
- parent destroy
-} -result {::okay}
-test ooUtil-1.4 {TIP 478: classmethod with several inheritance levels} -setup {
- oo::class create parent
-} -body {
- oo::class create ActiveRecord {
- superclass parent
- classmethod find args {
- return "[self] called with arguments: $args"
- }
- }
- oo::class create Table {
- superclass ActiveRecord
- }
- oo::class create SubTable {
- superclass Table
- }
- SubTable find foo bar
-} -cleanup {
- parent destroy
-} -result {::SubTable called with arguments: foo bar}
-test ooUtil-1.5 {TIP 478: classmethod and instances} -setup {
- oo::class create parent
-} -body {
- oo::class create ActiveRecord {
- superclass parent
- classmethod find args {
- return "[self] called with arguments: $args"
- }
- }
- oo::class create Table {
- superclass ActiveRecord
- }
- set t [Table new]
- $t find 1 2 3
-} -cleanup {
- parent destroy
-} -result {::Table called with arguments: 1 2 3}
-test ooUtil-1.6 {TIP 478: classmethod and instances} -setup {
- oo::class create parent
-} -body {
- oo::class create ActiveRecord {
- superclass parent
- classmethod find args {
- return "[self] called with arguments: $args"
- }
- }
- oo::class create Table {
- superclass ActiveRecord
- unexport find
- }
- set t [Table new]
- $t find 1 2 3
-} -returnCodes error -cleanup {
- parent destroy
-} -match glob -result {unknown method "find": must be *}
-test ooUtil-1.7 {} -setup {
- oo::class create parent
-} -body {
- oo::class create Foo {
- superclass parent
- classmethod bar {} {
- puts "This is in the class; self is [self]"
- my meee
- }
- classmethod meee {} {
- puts "This is meee"
- }
- }
- oo::class create Grill {
- superclass Foo
- classmethod meee {} {
- puts "This is meee 2"
- }
- }
- list [Foo bar] [Grill bar] [[Foo new] bar] [[Grill new] bar]
-} -cleanup {
- parent destroy
-} -result {{} {} {} {}} -output "This is in the class; self is ::Foo\nThis is meee\nThis is in the class; self is ::Grill\nThis is meee 2\nThis is in the class; self is ::Foo\nThis is meee\nThis is in the class; self is ::Grill\nThis is meee 2\n"
-# Two tests to confirm that we correctly initialise the scripted part of TclOO
-# in child interpreters. This is slightly tricky at the implementation level
-# because we cannot count on either [source] or [open] being available.
-test ooUtil-1.8 {TIP 478: classmethod in child interp} -setup {
- set childinterp [interp create]
-} -body {
- $childinterp eval {
- oo::class create ActiveRecord {
- classmethod find args {
- return "[self] called with arguments: $args"
- }
- }
- oo::class create Table {
- superclass ActiveRecord
- }
- # This is confirming that this is not the parent interpreter
- list [Table find foo bar] [info globals childinterp]
- }
-} -cleanup {
- interp delete $childinterp
-} -result {{::Table called with arguments: foo bar} {}}
-test ooUtil-1.9 {TIP 478: classmethod in safe child interp} -setup {
- set safeinterp [interp create -safe]
-} -body {
- $safeinterp eval {
- oo::class create ActiveRecord {
- classmethod find args {
- return "[self] called with arguments: $args"
- }
- }
- oo::class create Table {
- superclass ActiveRecord
- }
- # This is confirming that this is a (basic) safe interpreter
- list [Table find foo bar] [info commands source]
- }
-} -cleanup {
- interp delete $safeinterp
-} -result {{::Table called with arguments: foo bar} {}}
-
-test ooUtil-2.1 {TIP 478: callback generation} -setup {
- oo::class create parent
-} -body {
- oo::class create c {
- superclass parent
- method CallMe {} { return ok,[self] }
- method makeCall {} {
- return [callback CallMe]
- }
- }
- c create ::context
- set cb [context makeCall]
- {*}$cb
-} -cleanup {
- parent destroy
-} -result {ok,::context}
-test ooUtil-2.2 {TIP 478: callback generation} -setup {
- oo::class create parent
-} -body {
- oo::class create c {
- superclass parent
- method CallMe {a b c} { return ok,[self],$a,$b,$c }
- method makeCall {b} {
- return [callback CallMe 123 $b]
- }
- }
- c create ::context
- set cb [context makeCall "a b c"]
- {*}$cb PQR
-} -cleanup {
- parent destroy
-} -result {ok,::context,123,a b c,PQR}
-test ooUtil-2.3 {TIP 478: callback generation, alternate name} -setup {
- oo::class create parent
-} -body {
- oo::class create c {
- superclass parent
- method CallMe {} { return ok,[self] }
- method makeCall {} {
- return [mymethod CallMe]
- }
- }
- c create ::context
- set cb [context makeCall]
- {*}$cb
-} -cleanup {
- parent destroy
-} -result {ok,::context}
-test ooUtil-2.4 {TIP 478: callback generation, alternate name} -setup {
- oo::class create parent
-} -body {
- oo::class create c {
- superclass parent
- method CallMe {a b c} { return ok,[self],$a,$b,$c }
- method makeCall {b} {
- return [mymethod CallMe 123 $b]
- }
- }
- c create ::context
- set cb [context makeCall "a b c"]
- {*}$cb PQR
-} -cleanup {
- parent destroy
-} -result {ok,::context,123,a b c,PQR}
-test ooUtil-2.5 {TIP 478: callbacks and method lifetime} -setup {
- oo::class create parent
-} -body {
- oo::class create c {
- superclass parent
- method makeCall {b} {
- return [callback CallMe 123 $b]
- }
- }
- c create ::context
- set cb [context makeCall "a b c"]
- set result [list [catch {{*}$cb PQR} msg] $msg]
- oo::objdefine context {
- method CallMe {a b c} { return ok,[self],$a,$b,$c }
- }
- lappend result [{*}$cb PQR]
-} -cleanup {
- parent destroy
-} -result {1 {unknown method "CallMe": must be <cloned>, destroy, eval, makeCall, unknown, variable or varname} {ok,::context,123,a b c,PQR}}
-test ooUtil-2.6 {TIP 478: callback use case} -setup {
- oo::class create parent
- unset -nocomplain x
-} -body {
- oo::class create c {
- superclass parent
- variable count
- constructor {var} {
- set count 0
- upvar 1 $var v
- trace add variable v write [callback TraceCallback]
- }
- method count {} {return $count}
- method TraceCallback {name1 name2 op} {
- incr count
- }
- }
- set o [c new x]
- for {set x 0} {$x < 5} {incr x} {}
- $o count
-} -cleanup {
- unset -nocomplain x
- parent destroy
-} -result 6
-
-test ooUtil-3.1 {TIP 478: class initialisation} -setup {
- oo::class create parent
- catch {rename ::foobar-3.1 {}}
-} -body {
- oo::class create ::cls {
- superclass parent
- initialise {
- proc foobar-3.1 {} {return ok}
- }
- method calls {} {
- list [catch foobar-3.1 msg] $msg \
- [namespace eval [info object namespace [self class]] foobar-3.1]
- }
- }
- [cls new] calls
-} -cleanup {
- parent destroy
-} -result {1 {invalid command name "foobar-3.1"} ok}
-test ooUtil-3.2 {TIP 478: class variables} -setup {
- oo::class create parent
- catch {rename ::foobar-3.1 {}}
-} -body {
- oo::class create ::cls {
- superclass parent
- initialise {
- variable x 123
- }
- method call {} {
- classvariable x
- incr x
- }
- }
- cls create a
- cls create b
- cls create c
- list [a call] [b call] [c call] [a call] [b call] [c call]
-} -cleanup {
- parent destroy
-} -result {124 125 126 127 128 129}
-test ooUtil-3.3 {TIP 478: class initialisation} -setup {
- oo::class create parent
- catch {rename ::foobar-3.3 {}}
-} -body {
- oo::class create ::cls {
- superclass parent
- initialize {
- proc foobar-3.3 {} {return ok}
- }
- method calls {} {
- list [catch foobar-3.3 msg] $msg \
- [namespace eval [info object namespace [self class]] foobar-3.3]
- }
- }
- [cls new] calls
-} -cleanup {
- parent destroy
-} -result {1 {invalid command name "foobar-3.3"} ok}
-test ooUtil-3.4 {TIP 478: class initialisation} -setup {
- oo::class create parent
- catch {rename ::appendToResultVar {}}
- proc ::appendToResultVar args {
- lappend ::result {*}$args
- }
- set result {}
-} -body {
- trace add execution oo::define::initialise enter appendToResultVar
- oo::class create ::cls {
- superclass parent
- initialize {proc xyzzy {} {}}
- }
- return $result
-} -cleanup {
- catch {
- trace remove execution oo::define::initialise enter appendToResultVar
- }
- rename ::appendToResultVar {}
- parent destroy
-} -result {{initialize {proc xyzzy {} {}}} enter}
-test ooUtil-3.5 {TIP 478: class initialisation} -body {
- oo::define oo::object {
- ::list [::namespace which initialise] [::namespace which initialize] \
- [::namespace origin initialise] [::namespace origin initialize]
- }
-} -result {::oo::define::initialise ::oo::define::initialize ::oo::define::initialise ::oo::define::initialise}
-
-test ooUtil-4.1 {TIP 478: singleton} -setup {
- oo::class create parent
-} -body {
- oo::singleton create xyz {
- superclass parent
- }
- set x [xyz new]
- set y [xyz new]
- set z [xyz new]
- set code [catch {$x destroy} msg]
- set p [xyz new]
- lappend code [catch {rename $x ""}]
- set q [xyz new]
- string map [list $x ONE $q TWO] [list {*}$code $x $y $z $p $q [xyz new]]
-} -cleanup {
- parent destroy
-} -result {1 0 ONE ONE ONE ONE TWO TWO}
-test ooUtil-4.2 {TIP 478: singleton errors} -setup {
- oo::class create parent
-} -body {
- oo::singleton create xyz {
- superclass parent
- }
- [xyz new] destroy
-} -returnCodes error -cleanup {
- parent destroy
-} -result {may not destroy a singleton object}
-test ooUtil-4.3 {TIP 478: singleton errors} -setup {
- oo::class create parent
-} -body {
- oo::singleton create xyz {
- superclass parent
- }
- oo::copy [xyz new]
-} -returnCodes error -cleanup {
- parent destroy
-} -result {may not clone a singleton object}
-
-
-test ooUtil-5.1 {TIP 478: abstract} -setup {
- oo::class create parent
-} -body {
- oo::abstract create xyz {
- superclass parent
- method foo {} {return 123}
- }
- oo::class create pqr {
- superclass xyz
- method bar {} {return 456}
- }
- set codes [list [catch {xyz new}] [catch {xyz create x}] [catch {xyz createWithNamespace x y}]]
- set x [pqr new]
- set y [pqr create ::y]
- lappend codes [$x foo] [$x bar] $y
-} -cleanup {
- parent destroy
-} -result {1 1 1 123 456 ::y}
-
-test ooUtil-6.1 {TIP 478: classvariable} -setup {
- oo::class create parent
-} -body {
- oo::class create xyz {
- superclass parent
- initialise {
- variable x 1 y 2
- }
- method a {} {
- classvariable x
- incr x
- }
- method b {} {
- classvariable y
- incr y
- }
- method c {} {
- classvariable x y
- list $x $y
- }
- }
- set p [xyz new]
- set q [xyz new]
- set result [list [$p c] [$q c]]
- $p a
- $q b
- lappend result [[xyz new] c]
-} -cleanup {
- parent destroy
-} -result {{1 2} {1 2} {2 3}}
-test ooUtil-6.2 {TIP 478: classvariable error case} -setup {
- oo::class create parent
-} -body {
- oo::class create xyz {
- superclass parent
- method a {} {
- classvariable x(1)
- incr x(1)
- }
- }
- set p [xyz new]
- set q [xyz new]
- list [$p a] [$q a]
-} -returnCodes error -cleanup {
- parent destroy
-} -result {bad variable name "x(1)": can't create a scalar variable that looks like an array element}
-test ooUtil-6.3 {TIP 478: classvariable error case} -setup {
- oo::class create parent
-} -body {
- oo::class create xyz {
- superclass parent
- method a {} {
- classvariable ::x
- incr x
- }
- }
- set p [xyz new]
- set q [xyz new]
- list [$p a] [$q a]
-} -returnCodes error -cleanup {
- parent destroy
-} -result {bad variable name "::x": can't create a local variable with a namespace separator in it}
-
-test ooUtil-7.1 {TIP 478: link calling pattern} -setup {
- oo::class create parent
-} -body {
- oo::class create cls {
- superclass parent
- method foo {} {return "in foo of [self]"}
- method Bar {} {return "in bar of [self]"}
- method Grill {} {return "in grill of [self]"}
- export eval
- constructor {} {
- link foo
- link {bar Bar} {grill Grill}
- }
- }
- cls create o
- o eval {list [foo] [bar] [grill]}
-} -cleanup {
- parent destroy
-} -result {{in foo of ::o} {in bar of ::o} {in grill of ::o}}
-test ooUtil-7.2 {TIP 478: link removed when [my] disappears} -setup {
- oo::class create parent
-} -body {
- oo::class create cls {
- superclass parent
- method foo {} {return "in foo of [self]"}
- constructor {cmd} {
- link [list ::$cmd foo]
- }
- }
- cls create o pqr
- list [o foo] [pqr] [rename [info object namespace o]::my {}] [catch pqr msg] $msg
-} -cleanup {
- parent destroy
-} -result {{in foo of ::o} {in foo of ::o} {} 1 {invalid command name "pqr"}}
-
-# Tests a very weird combination of things (with a key problem locus in
-# MixinClassDelegates) that TIP 567 fixes
-test ooUtil-8.1 {TIP 567: call oo::define twice from metaclass constructor} -setup {
- oo::class create parent
-} -body {
- ::oo::class create A {
- superclass parent
- }
- ::oo::class create B {
- superclass ::oo::class parent
- constructor {{definitionScript ""}} {
- next $definitionScript
- next {superclass ::A}
- }
- }
- B create C {
- superclass A
- }
- C create instance
-} -cleanup {
- parent destroy
-} -result ::instance
-
-# Tests that verify issues detected with the tcllib version of the code
-test ooUtil-tcllib-ticket-b3577ed586 {test scoping of delegation in oo::class.Delegate } -setup {
- oo::class create animal {}
- namespace eval ::ooutiltest {
- oo::class create pet { superclass animal }
- }
-} -body {
- namespace eval ::ooutiltest {
- oo::class create dog { superclass pet }
- }
-} -cleanup {
- namespace delete ooutiltest
- rename animal {}
-} -result {::ooutiltest::dog}
-test ooUtil-tcllib-ticket-fe7a0e0a3a {classmethod must not interfere with constructor signatures} -setup {
- oo::class create TestClass {
- superclass oo::class
- self method create {name ignore body} {
- next $name $body
- }
- }
-} -body {
- TestClass create okay {} {}
-} -cleanup {
- rename TestClass {}
-} -result {::okay}
-
-cleanupTests
-return
-
-# Local Variables:
-# fill-column: 78
-# mode: tcl
-# End: