sl@0: # Commands covered: none sl@0: # sl@0: # This file contains a collection of tests for Tcl_LinkVar and related sl@0: # library procedures. Sourcing this file into Tcl runs the tests and sl@0: # generates output for errors. No output means no errors were found. sl@0: # sl@0: # Copyright (c) 1993 The Regents of the University of California. sl@0: # Copyright (c) 1994 Sun Microsystems, Inc. sl@0: # Copyright (c) 1998-1999 by Scriptics Corporation. sl@0: # sl@0: # See the file "license.terms" for information on usage and redistribution sl@0: # of this file, and for a DISCLAIMER OF ALL WARRANTIES. sl@0: # sl@0: # RCS: @(#) $Id: link.test,v 1.7 2002/06/22 04:19:47 dgp Exp $ sl@0: sl@0: if {[lsearch [namespace children] ::tcltest] == -1} { sl@0: package require tcltest 2 sl@0: namespace import -force ::tcltest::* sl@0: } sl@0: sl@0: ::tcltest::testConstraint testlink \ sl@0: [expr {[info commands testlink] != {}}] sl@0: sl@0: foreach i {int real bool string} { sl@0: catch {unset $i} sl@0: } sl@0: test link-1.1 {reading C variables from Tcl} {testlink} { sl@0: testlink delete sl@0: testlink set 43 1.23 4 - 12341234 sl@0: testlink create 1 1 1 1 1 sl@0: list $int $real $bool $string $wide sl@0: } {43 1.23 1 NULL 12341234} sl@0: test link-1.2 {reading C variables from Tcl} {testlink} { sl@0: testlink delete sl@0: testlink create 1 1 1 1 1 sl@0: testlink set -3 2 0 "A long string with spaces" 43214321 sl@0: list $int $real $bool $string $wide $int $real $bool $string $wide sl@0: } {-3 2.0 0 {A long string with spaces} 43214321 -3 2.0 0 {A long string with spaces} 43214321} sl@0: sl@0: test link-2.1 {writing C variables from Tcl} {testlink} { sl@0: testlink delete sl@0: testlink set 43 1.21 4 - 56785678 sl@0: testlink create 1 1 1 1 1 sl@0: set int "00721" sl@0: set real -10.5 sl@0: set bool true sl@0: set string abcdef sl@0: set wide 135135 sl@0: concat [testlink get] $int $real $bool $string $wide sl@0: } {465 -10.5 1 abcdef 135135 00721 -10.5 true abcdef 135135} sl@0: test link-2.2 {writing bad values into variables} {testlink} { sl@0: testlink delete sl@0: testlink set 43 1.23 4 - 56785678 sl@0: testlink create 1 1 1 1 1 sl@0: list [catch {set int 09a} msg] $msg $int sl@0: } {1 {can't set "int": variable must have integer value} 43} sl@0: test link-2.3 {writing bad values into variables} {testlink} { sl@0: testlink delete sl@0: testlink set 43 1.23 4 - 56785678 sl@0: testlink create 1 1 1 1 1 sl@0: list [catch {set real 1.x3} msg] $msg $real sl@0: } {1 {can't set "real": variable must have real value} 1.23} sl@0: test link-2.4 {writing bad values into variables} {testlink} { sl@0: testlink delete sl@0: testlink set 43 1.23 4 - 56785678 sl@0: testlink create 1 1 1 1 1 sl@0: list [catch {set bool gorp} msg] $msg $bool sl@0: } {1 {can't set "bool": variable must have boolean value} 1} sl@0: test link-2.5 {writing bad values into variables} {testlink} { sl@0: testlink delete sl@0: testlink set 43 1.23 4 - 56785678 sl@0: testlink create 1 1 1 1 1 sl@0: list [catch {set wide gorp} msg] $msg $bool sl@0: } {1 {can't set "wide": variable must have integer value} 1} sl@0: sl@0: test link-3.1 {read-only variables} {testlink} { sl@0: testlink delete sl@0: testlink set 43 1.23 4 - 56785678 sl@0: testlink create 0 1 1 0 0 sl@0: list [catch {set int 4} msg] $msg $int \ sl@0: [catch {set real 10.6} msg] $msg $real \ sl@0: [catch {set bool no} msg] $msg $bool \ sl@0: [catch {set string "new value"} msg] $msg $string \ sl@0: [catch {set wide 12341234} msg] $msg $wide sl@0: } {1 {can't set "int": linked variable is read-only} 43 0 10.6 10.6 0 no no 1 {can't set "string": linked variable is read-only} NULL 1 {can't set "wide": linked variable is read-only} 56785678} sl@0: test link-3.2 {read-only variables} {testlink} { sl@0: testlink delete sl@0: testlink set 43 1.23 4 - 56785678 sl@0: testlink create 1 0 0 1 1 sl@0: list [catch {set int 4} msg] $msg $int \ sl@0: [catch {set real 10.6} msg] $msg $real \ sl@0: [catch {set bool no} msg] $msg $bool \ sl@0: [catch {set string "new value"} msg] $msg $string\ sl@0: [catch {set wide 12341234} msg] $msg $wide sl@0: } {0 4 4 1 {can't set "real": linked variable is read-only} 1.23 1 {can't set "bool": linked variable is read-only} 1 0 {new value} {new value} 0 12341234 12341234} sl@0: sl@0: test link-4.1 {unsetting linked variables} {testlink} { sl@0: testlink delete sl@0: testlink set -6 -2.5 0 stringValue 13579 sl@0: testlink create 1 1 1 1 1 sl@0: unset int real bool string wide sl@0: list [catch {set int} msg] $msg [catch {set real} msg] $msg \ sl@0: [catch {set bool} msg] $msg [catch {set string} msg] $msg \ sl@0: [catch {set wide} msg] $msg sl@0: } {0 -6 0 -2.5 0 0 0 stringValue 0 13579} sl@0: test link-4.2 {unsetting linked variables} {testlink} { sl@0: testlink delete sl@0: testlink set -6 -2.1 0 stringValue 97531 sl@0: testlink create 1 1 1 1 1 sl@0: unset int real bool string wide sl@0: set int 102 sl@0: set real 16 sl@0: set bool true sl@0: set string newValue sl@0: set wide 333555 sl@0: testlink get sl@0: } {102 16.0 1 newValue 333555} sl@0: sl@0: test link-5.1 {unlinking variables} {testlink} { sl@0: testlink delete sl@0: testlink set -6 -2.25 0 stringValue 13579 sl@0: testlink delete sl@0: set int xx1 sl@0: set real qrst sl@0: set bool bogus sl@0: set string 12345 sl@0: set wide 875421 sl@0: testlink get sl@0: } {-6 -2.25 0 stringValue 13579} sl@0: test link-5.2 {unlinking variables} {testlink} { sl@0: testlink delete sl@0: testlink set -6 -2.25 0 stringValue 97531 sl@0: testlink create 1 1 1 1 1 sl@0: testlink delete sl@0: testlink set 25 14.7 7 - 999999 sl@0: list $int $real $bool $string $wide sl@0: } {-6 -2.25 0 stringValue 97531} sl@0: sl@0: test link-6.1 {errors in setting up link} {testlink} { sl@0: testlink delete sl@0: catch {unset int} sl@0: set int(44) 1 sl@0: list [catch {testlink create 1 1 1 1 1} msg] $msg sl@0: } {1 {can't set "int": variable is array}} sl@0: catch {unset int} sl@0: sl@0: test link-7.1 {access to linked variables via upvar} {testlink} { sl@0: proc x {} { sl@0: upvar int y sl@0: unset y sl@0: } sl@0: testlink delete sl@0: testlink create 1 0 0 0 0 sl@0: testlink set 14 {} {} {} {} sl@0: x sl@0: list [catch {set int} msg] $msg sl@0: } {0 14} sl@0: test link-7.2 {access to linked variables via upvar} {testlink} { sl@0: proc x {} { sl@0: upvar int y sl@0: return [set y] sl@0: } sl@0: testlink delete sl@0: testlink create 1 0 0 0 0 sl@0: testlink set 0 {} {} {} {} sl@0: set int sl@0: testlink set 23 {} {} {} {} sl@0: x sl@0: list [x] $int sl@0: } {23 23} sl@0: test link-7.3 {access to linked variables via upvar} {testlink} { sl@0: proc x {} { sl@0: upvar int y sl@0: set y 44 sl@0: } sl@0: testlink delete sl@0: testlink create 0 0 0 0 0 sl@0: testlink set 11 {} {} {} {} sl@0: list [catch x msg] $msg $int sl@0: } {1 {can't set "y": linked variable is read-only} 11} sl@0: test link-7.4 {access to linked variables via upvar} {testlink} { sl@0: proc x {} { sl@0: upvar int y sl@0: set y abc sl@0: } sl@0: testlink delete sl@0: testlink create 1 1 1 1 1 sl@0: testlink set -4 {} {} {} {} sl@0: list [catch x msg] $msg $int sl@0: } {1 {can't set "y": variable must have integer value} -4} sl@0: test link-7.5 {access to linked variables via upvar} {testlink} { sl@0: proc x {} { sl@0: upvar real y sl@0: set y abc sl@0: } sl@0: testlink delete sl@0: testlink create 1 1 1 1 1 sl@0: testlink set -4 16.75 {} {} {} sl@0: list [catch x msg] $msg $real sl@0: } {1 {can't set "y": variable must have real value} 16.75} sl@0: test link-7.6 {access to linked variables via upvar} {testlink} { sl@0: proc x {} { sl@0: upvar bool y sl@0: set y abc sl@0: } sl@0: testlink delete sl@0: testlink create 1 1 1 1 1 sl@0: testlink set -4 16.3 1 {} {} sl@0: list [catch x msg] $msg $bool sl@0: } {1 {can't set "y": variable must have boolean value} 1} sl@0: test link-7.7 {access to linked variables via upvar} {testlink} { sl@0: proc x {} { sl@0: upvar wide y sl@0: set y abc sl@0: } sl@0: testlink delete sl@0: testlink create 1 1 1 1 1 sl@0: testlink set -4 16.3 1 {} 778899 sl@0: list [catch x msg] $msg $wide sl@0: } {1 {can't set "y": variable must have integer value} 778899} sl@0: sl@0: test link-8.1 {Tcl_UpdateLinkedVar procedure} {testlink} { sl@0: proc x args { sl@0: global x int real bool string wide sl@0: lappend x $args $int $real $bool $string $wide sl@0: } sl@0: set x {} sl@0: testlink create 1 1 1 1 1 sl@0: testlink set 14 -2.0 0 xyzzy 995511 sl@0: trace var int w x sl@0: testlink update 32 4.0 3 abcd 113355 sl@0: trace vdelete int w x sl@0: set x sl@0: } {{int {} w} 32 -2.0 0 xyzzy 995511} sl@0: test link-8.2 {Tcl_UpdateLinkedVar procedure} {testlink} { sl@0: proc x args { sl@0: global x int real bool string wide sl@0: lappend x $args $int $real $bool $string $wide sl@0: } sl@0: set x {} sl@0: testlink create 1 1 1 1 1 sl@0: testlink set 14 -2.0 0 xyzzy 995511 sl@0: testlink delete sl@0: trace var int w x sl@0: testlink update 32 4.0 6 abcd 113355 sl@0: trace vdelete int w x sl@0: set x sl@0: } {} sl@0: test link-8.3 {Tcl_UpdateLinkedVar procedure, read-only variable} {testlink} { sl@0: testlink create 0 0 0 0 0 sl@0: list [catch {testlink update 47 {} {} {} {}} msg] $msg $int sl@0: } {0 {} 47} sl@0: sl@0: catch {testlink set 0 0 0 - 0} sl@0: catch {testlink delete} sl@0: foreach i {int real bool string wide} { sl@0: catch {unset $i} sl@0: } sl@0: sl@0: # cleanup sl@0: ::tcltest::cleanupTests sl@0: return