1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544
|
# This file is a Tcl script to test out the procedures in tkCanvas.c,
# which implements generic code for canvases. It is organized in the
# standard fashion for Tcl tests.
#
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-2000 Ajuba Solutions.
# All rights reserved.
package require tcltest 2.1
eval tcltest::configure $argv
tcltest::loadTestedCommands
# XXX - This test file is woefully incomplete. At present, only a
# few of the features are tested.
canvas .c
pack .c
update
set i 1
foreach {testname testinfo} {
canvas-1.1 {-background #ff0000 #ff0000
non-existent {unknown color name "non-existent"}}
canvas-1.2 {-bg #ff0000 #ff0000
non-existent {unknown color name "non-existent"}}
canvas-1.3 {-bd 4 4 badValue {bad screen distance "badValue"}}
canvas-1.4 {-borderwidth 1.3 1 badValue {bad screen distance "badValue"}}
canvas-1.5 {-closeenough 24 24.0
bogus {expected floating-point number but got "bogus"}}
canvas-1.6 {-confine true 1 silly {expected boolean value but got "silly"}}
canvas-1.7 {-cursor arrow arrow badValue {bad cursor spec "badValue"}}
canvas-1.8 {-height 2.1 2 x42 {bad screen distance "x42"}}
canvas-1.9 {-highlightbackground #112233 #112233
ugly {unknown color name "ugly"}}
canvas-1.10 {-highlightcolor #110022 #110022
bogus {unknown color name "bogus"}}
canvas-1.11 {-highlightthickness 18 18
badValue {bad screen distance "badValue"}}
canvas-1.12 {-insertbackground #110022 #110022
bogus {unknown color name "bogus"}}
canvas-1.13 {-insertborderwidth 1.3 1 2.6x {bad screen distance "2.6x"}}
canvas-1.14 {-insertofftime 100 100 3.2 {expected integer but got "3.2"}}
canvas-1.15 {-insertontime 100 100 3.2 {expected integer but got "3.2"}}
canvas-1.16 {-insertwidth 1.3 1 6x {bad screen distance "6x"}}
canvas-1.17 {-relief groove groove
1.5 {bad relief type "1.5": must be flat, groove, raised, ridge, solid, or sunken}}
canvas-1.18 {-selectbackground #110022 #110022
bogus {unknown color name "bogus"}}
canvas-1.19 {-selectborderwidth 1.3 1
badValue {bad screen distance "badValue"}}
canvas-1.20 {-selectforeground #654321 #654321
bogus {unknown color name "bogus"}}
canvas-1.21 {-takefocus "any string" "any string" {} {}}
canvas-1.22 {-width 402 402 xyz {bad screen distance "xyz"}}
canvas-1.23 {-xscrollcommand {Some command} {Some command} {} {}}
canvas-1.24 {-yscrollcommand {Another command} {Another command} {} {}}
} {
lassign $testinfo name goodValue goodResult badValue badResult
test $testname-good "configuration options: good value for $name" {
.c configure $name $goodValue
lindex [.c configure $name] 4
} $goodResult
incr i
if {$badValue ne ""} {
test $testname-bad "configuration options: bad value for $name" -body {
.c configure $name $badValue
} -returnCodes error -result $badResult
}
.c configure $name [lindex [.c configure $name] 3]
incr i
}
test canvas-1.25 {configure throws error on bad option} {
set res [list [catch {.c configure -gorp foo}]]
.c create rect 10 10 100 100
lappend res [catch {.c configure -gorp foo}]
set res
} [list 1 1]
catch {destroy .c}
canvas .c -width 60 -height 40 -scrollregion {0 0 200 150} -bd 0 \
-highlightthickness 0
pack .c
update
test canvas-2.1 {CanvasWidgetCmd, bind option} {
set i [.c create rect 10 10 100 100]
list [catch {.c bind $i <a>} msg] $msg
} {0 {}}
test canvas-2.2 {CanvasWidgetCmd, bind option} {
set i [.c create rect 10 10 100 100]
list [catch {.c bind $i <} msg] $msg
} {1 {no event type or button # or keysym}}
test canvas-2.3 {CanvasWidgetCmd, xview option} {
.c configure -xscrollincrement 40 -yscrollincrement 5
.c xview moveto 0
update
set x [list [.c xview]]
.c xview scroll 2 units
update
lappend x [.c xview]
} {{0.0 0.3} {0.4 0.7}}
test canvas-2.4 {CanvasWidgetCmd, xview option} {nonPortable} {
# This test gives slightly different results on platforms such
# as NetBSD. I don't know why...
.c configure -xscrollincrement 0 -yscrollincrement 5
.c xview moveto 0.6
update
set x [list [.c xview]]
.c xview scroll 2 units
update
lappend x [.c xview]
} {{0.6 0.9} {0.66 0.96}}
catch {destroy .c}
canvas .c -width 60 -height 40 -scrollregion {0 0 200 80} \
-borderwidth 0 -highlightthickness 0
pack .c
update
test canvas-3.1 {CanvasWidgetCmd, yview option} {
.c configure -xscrollincrement 40 -yscrollincrement 5
.c yview moveto 0
update
set x [list [.c yview]]
.c yview scroll 3 units
update
lappend x [.c yview]
} {{0.0 0.5} {0.1875 0.6875}}
test canvas-3.2 {CanvasWidgetCmd, yview option} {
.c configure -xscrollincrement 40 -yscrollincrement 0
.c yview moveto 0
update
set x [list [.c yview]]
.c yview scroll 2 units
update
lappend x [.c yview]
} {{0.0 0.5} {0.1 0.6}}
test canvas-4.1 {ButtonEventProc procedure} {
deleteWindows
canvas .c1 -bg #543210
rename .c1 .c2
set x {}
lappend x [winfo children .]
lappend x [.c2 cget -bg]
destroy .c1
lappend x [info command .c*] [winfo children .]
} {.c1 #543210 {} {}}
test canvas-5.1 {ButtonCmdDeletedProc procedure} {
deleteWindows
canvas .c1
rename .c1 {}
list [info command .c*] [winfo children .]
} {{} {}}
catch {destroy .c}
canvas .c -width 100 -height 50 -scrollregion {-200 -100 305 102} \
-borderwidth 2 -highlightthickness 3
pack .c
update
test canvas-6.1 {CanvasSetOrigin procedure} {
.c configure -xscrollincrement 0 -yscrollincrement 0
.c xview moveto 0
.c yview moveto 0
update
list [.c canvasx 0] [.c canvasy 0]
} {-205.0 -105.0}
test canvas-6.2 {CanvasSetOrigin procedure} {
.c configure -xscrollincrement 20 -yscrollincrement 10
set x ""
foreach i {.08 .10 .48 .50} {
.c xview moveto $i
update
lappend x [.c canvasx 0]
}
set x
} {-165.0 -145.0 35.0 55.0}
test canvas-6.3 {CanvasSetOrigin procedure} {
.c configure -xscrollincrement 20 -yscrollincrement 10
set x ""
foreach i {.06 .08 .70 .72} {
.c yview moveto $i
update
lappend x [.c canvasy 0]
}
set x
} {-95.0 -85.0 35.0 45.0}
test canvas-6.4 {CanvasSetOrigin procedure} {
.c configure -xscrollincrement 20 -yscrollincrement 10
.c xview moveto 1.0
.c canvasx 0
} {215.0}
test canvas-6.5 {CanvasSetOrigin procedure} {
.c configure -xscrollincrement 20 -yscrollincrement 10
.c yview moveto 1.0
.c canvasy 0
} {55.0}
deleteWindows
set l [lsort [interp hidden]]
test canvas-7.1 {canvas widget vs hidden commands} -setup {
catch {destroy .c}
} -body {
canvas .c
interp hide {} .c
destroy .c
list [winfo children .] [lsort [interp hidden]]
} -result [list {} $l]
test canvas-8.1 {canvas arc bbox} -setup {
catch {destroy .c}
canvas .c
} -body {
.c create arc -100 10 100 210 -start 10 -extent 50 -style arc -tags arc1
set arcBox [.c bbox arc1]
.c create arc 100 10 300 210 -start 10 -extent 50 -style chord -tags arc2
set coordBox [.c bbox arc2]
.c create arc 300 10 500 210 -start 10 -extent 50 -style pieslice -tags arc3
set pieBox [.c bbox arc3]
list $arcBox $coordBox $pieBox
} -result {{48 21 100 94} {248 21 300 94} {398 21 500 112}}
test canvas-9.1 {canvas id creation and deletion} -setup {
catch {destroy .c}
canvas .c
} -body {
# With Tk 8.0.4 the ids are now stored in a hash table. You
# can use this test as a performance test with older versions
# by changing the value of size.
set size 15
for {set i 0} {$i < $size} {incr i} {
set x [expr {-10 + 3*$i}]
for {set j 0; set y -10} {$j < 10} {incr j; incr y 3} {
.c create rect ${x}c ${y}c [expr $x+2]c [expr $y+2]c \
-outline black -fill blue -tags rect
.c create text [expr $x+1]c [expr $y+1]c -text "$i,$j" \
-anchor center -tags text
}
}
# The actual bench mark - this code also exercises all the hash
# table changes.
set time [lindex [time {
foreach id [.c find withtag all] {
.c lower $id
.c raise $id
.c find withtag $id
.c bind <Return> $id {}
.c delete $id
}
}] 0]
set x ""
} -result {}
test canvas-10.1 {find items using tag expressions} -setup {
catch {destroy .c}
canvas .c
} -body {
.c create oval 20 20 40 40 -fill red -tag [list a b c d]
.c create oval 20 60 40 80 -fill yellow -tag [list b a]
.c create oval 20 100 40 120 -fill green -tag [list c b]
.c create oval 20 140 40 160 -fill blue -tag [list b]
.c create oval 20 180 40 200 -fill bisque -tag [list a d e]
.c create oval 20 220 40 240 -fill bisque -tag b
.c create oval 20 260 40 280 -fill bisque -tag [list d "tag with spaces"]
set res {}
lappend res [.c find withtag {!a}]
lappend res [.c find withtag {b&&c}]
lappend res [.c find withtag {b||c}]
lappend res [.c find withtag {a&&!b}]
lappend res [.c find withtag {!b&&!c}]
lappend res [.c find withtag {d&&a&&c&&b}]
lappend res [.c find withtag {b^a}]
lappend res [.c find withtag {(a&&!b)||(!a&&b)}]
lappend res [.c find withtag { ( a && ! b ) || ( ! a && b ) }]
lappend res [.c find withtag {a&&!(c||d)}]
lappend res [.c find withtag {d&&"tag with spaces"}]
lappend res [.c find withtag "tag with spaces"]
} -result {{3 4 6 7} {1 3} {1 2 3 4 6} 5 {5 7} 1 {3 4 5 6} {3 4 5 6} {3 4 5 6} 2 7 7}
test canvas-10.2 {check errors from tag expressions} -setup {
catch {destroy .c}
canvas .c
.c create oval 20 20 40 40 -fill red -tag [list a b c d]
.c create oval 20 260 40 280 -fill bisque -tag [list d "tag with spaces"]
} -body {
.c find withtag {&&c}
} -returnCodes error -result {Unexpected operator in tag search expression}
test canvas-10.3 {check errors from tag expressions} -setup {
catch {destroy .c}
canvas .c
.c create oval 20 20 40 40 -fill red -tag [list a b c d]
.c create oval 20 260 40 280 -fill bisque -tag [list d "tag with spaces"]
} -body {
.c find withtag {!!c}
} -returnCodes error -result {Too many '!' in tag search expression}
test canvas-10.4 {check errors from tag expressions} -setup {
catch {destroy .c}
canvas .c
.c create oval 20 20 40 40 -fill red -tag [list a b c d]
.c create oval 20 260 40 280 -fill bisque -tag [list d "tag with spaces"]
} -body {
.c find withtag {b||}
} -returnCodes error -result {Missing tag in tag search expression}
test canvas-10.5 {check errors from tag expressions} -setup {
catch {destroy .c}
canvas .c
.c create oval 20 20 40 40 -fill red -tag [list a b c d]
.c create oval 20 260 40 280 -fill bisque -tag [list d "tag with spaces"]
} -body {
.c find withtag {b&&(c||)}
} -returnCodes error -result {Unexpected operator in tag search expression}
test canvas-10.6 {check errors from tag expressions} -setup {
catch {destroy .c}
canvas .c
.c create oval 20 20 40 40 -fill red -tag [list a b c d]
.c create oval 20 260 40 280 -fill bisque -tag [list d "tag with spaces"]
} -body {
.c find withtag {d&&""}
} -returnCodes error -result {Null quoted tag string in tag search expression}
test canvas-10.7 {check errors from tag expressions} -setup {
catch {destroy .c}
canvas .c
.c create oval 20 20 40 40 -fill red -tag [list a b c d]
.c create oval 20 260 40 280 -fill bisque -tag [list d "tag with spaces"]
} -body {
.c find withtag "d&&\"tag with spaces"
} -returnCodes error -result {Missing endquote in tag search expression}
test canvas-10.8 {check errors from tag expressions} -setup {
catch {destroy .c}
canvas .c
.c create oval 20 20 40 40 -fill red -tag [list a b c d]
.c create oval 20 260 40 280 -fill bisque -tag [list d "tag with spaces"]
} -body {
.c find withtag {a&&"tag with spaces"z}
} -returnCodes error -result {Invalid boolean operator in tag search expression}
test canvas-10.9 {check errors from tag expressions} -setup {
catch {destroy .c}
canvas .c
.c create oval 20 20 40 40 -fill red -tag [list a b c d]
.c create oval 20 260 40 280 -fill bisque -tag [list d "tag with spaces"]
} -body {
.c find withtag {a&&b&c}
} -returnCodes error -result {Singleton '&' in tag search expression}
test canvas-10.10 {check errors from tag expressions} -setup {
catch {destroy .c}
canvas .c
.c create oval 20 20 40 40 -fill red -tag [list a b c d]
.c create oval 20 260 40 280 -fill bisque -tag [list d "tag with spaces"]
} -body {
.c find withtag {a||b|c}
} -returnCodes error -result {Singleton '|' in tag search expression}
test canvas-10.11 {backward compatility - strange tags that are not expressions} -setup {
catch {destroy .c}
canvas .c
.c create oval 20 20 40 40 -fill red -tag [list { strange tag(xxx&yyy|zzz) " && \" || ! ^ " }]
} -body {
.c find withtag { strange tag(xxx&yyy|zzz) " && \" || ! ^ " }
} -result 1
test canvas-10.12 {multple events bound to same tag expr} -setup {
catch {destroy .c}
canvas .c
} -body {
.c bind {a && b} <Enter> {puts Enter}
.c bind {a && b} <Leave> {puts Leave}
} -result {}
test canvas-10.13 {more long tag searches; Bug 2931374} -setup {
catch {destroy .c}
canvas .c
} -body {
.c find withtag {(A&&B&&C&&D)&&area&&!text}
# memory errors on failure
} -cleanup {
destroy .c
} -result {}
test canvas-11.1 {canvas poly fill check, bug 5783} -setup {
destroy .c
pack [canvas .c]
} -body {
# This would crash in 8.3.0 and 8.3.1
.c create polygon 0 0 100 100 200 50 \
-fill {} -stipple gray50 -outline black
} -result 1
test canvas-11.2 {canvas poly overlap fill check, bug 226357} -setup {
destroy .c
pack [canvas .c]
} -body {
set result {}
.c create poly 30 30 90 90 30 90 90 30
lappend result [.c find over 40 40 45 45]; # rect region inc. edge
lappend result [.c find over 60 40 60 40]; # top-center point
lappend result [.c find over 0 0 0 0]; # not on poly
lappend result [.c find over 60 60 60 60]; # center-point
lappend result [.c find over 45 50 45 50]; # outside poly
.c itemconfig 1 -fill "" -outline black
lappend result [.c find over 40 40 45 45]; # rect region inc. edge
lappend result [.c find over 60 40 60 40]; # top-center point
lappend result [.c find over 0 0 0 0]; # not on poly
lappend result [.c find over 60 60 60 60]; # center-point
lappend result [.c find over 45 50 45 50]; # outside poly
.c itemconfig 1 -width 8
lappend result [.c find over 45 50 45 50]; # outside poly
} -result {1 1 {} 1 {} 1 1 {} 1 {} 1}
test canvas-11.3 {canvas poly dchars, bug 3291543} {
# This would crash
destroy .c
pack [canvas .c]
.c create polygon 0 0 0 10 10 0
.c dchars 1 2 end
.c coords 1
} {}
test canvas-12.1 {canvas mm obj, patch SF-403327, 102471} -setup {
destroy .c
pack [canvas .c]
} -body {
set qx [expr {1.+1.}]
# qx has type double and no string representation
.c scale all $qx 0 1. 1.
# qx has now type MMRep and no string representation
list $qx [string length $qx]
} -result {2.0 3}
test canvas-12.2 {canvas mm obj, patch SF-403327, 102471} -setup {
destroy .c
pack [canvas .c]
} -body {
set val 10
incr val
# qx has type double and no string representation
.c scale all $val 0 1 1
# qx has now type MMRep and no string representation
incr val
} -result 12
proc kill_canvas {w} {
destroy $w
pack [canvas $w -height 200 -width 200] -fill both -expand yes
update idle
$w create rectangle 80 80 120 120 -fill blue -tags blue
# bind a button press to re-build the canvas
$w bind blue <ButtonRelease-1> [subst {
[lindex [info level 0] 0] $w
append ::x ok
}
]
}
test canvas-13.1 {canvas delete during event, SF bug-228024} {
kill_canvas .c
set ::x {}
# do this many times to improve chances of triggering the crash
for {set i 0} {$i < 30} {incr i} {
event generate .c <1> -x 100 -y 100
event generate .c <ButtonRelease-1> -x 100 -y 100
}
set ::x
} okokokokokokokokokokokokokokokokokokokokokokokokokokokokokok
test canvas-14.1 {canvas scan SF bug 581560} -setup {
destroy .c
canvas .c
} -body {
.c scan
} -returnCodes error -result {wrong # args: should be ".c scan mark|dragto x y ?dragGain?"}
test canvas-14.2 {canvas scan} -setup {
destroy .c
canvas .c
} -body {
.c scan bogus
} -returnCodes error -result {wrong # args: should be ".c scan mark|dragto x y ?dragGain?"}
test canvas-14.3 {canvas scan} -setup {
destroy .c
canvas .c
} -body {
.c scan mark
} -returnCodes error -result {wrong # args: should be ".c scan mark|dragto x y ?dragGain?"}
test canvas-14.4 {canvas scan} -setup {
destroy .c
canvas .c
} -body {
.c scan mark 10 10
} -result {}
test canvas-14.5 {canvas scan} -setup {
destroy .c
canvas .c
} -body {
.c scan mark 10 10 5
} -returnCodes error -result {wrong # args: should be ".c scan mark x y"}
test canvas-14.6 {canvas scan} -setup {
destroy .c
canvas .c
} -body {
.c scan dragto 10 10 5
} -result {}
set i 0
proc create {w type args} {
eval [list $w create $type] $args
}
foreach type {arc bitmap image line oval polygon rect text window} {
incr i
test canvas-15.$i "basic types check: $type requires coords" -setup {
destroy .c
canvas .c
} -body {
.c create $type
} -returnCodes error -result [format {wrong # args: should be ".c create %s coords ?arg arg ...?"} $type]
incr i
test canvas-15.$i "basic coords check: $type coords are paired" -setup {
destroy .c
canvas .c
} -match glob -body {
.c create $type 0
} -returnCodes error -result "wrong # coordinates: expected*"
}
test canvas-16.1 {arc coords check} -setup {
destroy .c
canvas .c
} -body {
set id [.c create arc {0 10 20 30} -start 33]
.c itemcget $id -start
} -result {33.0}
test canvas-17.1 {default smooth method handling} -setup {
destroy .c
canvas .c
} -body {
set id [.c create line {0 0 1 1 2 2 3 3 4 4 5 5 6 6}]
set result [.c itemcget $id -smooth]
foreach smoother {yes 1 bezier raw r b} {
.c itemconfigure $id -smooth $smoother
lappend result [.c itemcget $id -smooth]
}
set result
} -result {0 true true true raw raw true}
destroy .c
# cleanup
cleanupTests
return
|