event.test
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:17k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # This file is a Tcl script to test the code in tkEvent.c.  It is
  2. # organized in the standard fashion for Tcl tests.
  3. #
  4. # Copyright (c) 1994 The Regents of the University of California.
  5. # Copyright (c) 1994-1995 Sun Microsystems, Inc.
  6. # Copyright (c) 1998-1999 by Scriptics Corporation.
  7. # All rights reserved.
  8. #
  9. # RCS: @(#) $Id: event.test,v 1.13 2003/02/18 06:22:44 mdejong Exp $
  10. package require tcltest 2.1
  11. namespace import -force tcltest::configure
  12. namespace import -force tcltest::testsDirectory
  13. configure -testdir [file join [pwd] [file dirname [info script]]]
  14. configure -loadfile [file join [testsDirectory] constraints.tcl]
  15. tcltest::loadTestedCommands
  16. # XXX This test file is woefully incomplete.  Right now it only tests
  17. # a few of the procedures in tkEvent.c.  Please add more tests whenever
  18. # possible.
  19. # Setup table used to query key events.
  20. proc _init_keypress_lookup { } {
  21.     global keypress_lookup
  22.     scan A %c start
  23.     scan Z %c finish
  24.     for {set i $start} {$i <= $finish} {incr i} {
  25.         set l [format %c $i]
  26.         set keypress_lookup($l) $l
  27.     }
  28.     scan a %c start
  29.     scan z %c finish
  30.     for {set i $start} {$i <= $finish} {incr i} {
  31.         set l [format %c $i]
  32.         set keypress_lookup($l) $l
  33.     }
  34.     scan 0 %c start
  35.     scan 9 %c finish
  36.     for {set i $start} {$i <= $finish} {incr i} {
  37.         set l [format %c $i]
  38.         set keypress_lookup($l) $l
  39.     }
  40.     array set keypress_lookup [list 
  41.         " " space 
  42.         ! exclam 
  43.         " quotedbl 
  44.         # numbersign 
  45.         $ dollar 
  46.         % percent 
  47.         & ampersand 
  48.         ( parenleft 
  49.         ) parenright 
  50.         * asterisk 
  51.         + plus 
  52.         , comma 
  53.         - minus 
  54.         . period 
  55.         / slash 
  56.         : colon 
  57.         ; semicolon 
  58.         < less 
  59.         = equal 
  60.         > greater 
  61.         ? question 
  62.         @ at 
  63.         [ bracketleft 
  64.         \ backslash 
  65.         ] bracketright 
  66.         ^ asciicircum 
  67.         _ underscore 
  68.         { braceleft 
  69.         | bar 
  70.         } braceright 
  71.         ~ asciitilde 
  72.         ' apostrophe 
  73.         "n" Return]
  74. }
  75. # Lookup an event in the keypress table.
  76. # For example:
  77. # Q -> Q
  78. # . -> period
  79. # / -> slash
  80. # Delete -> Delete
  81. # Escape -> Escape
  82. proc _keypress_lookup { char } {
  83.     global keypress_lookup
  84.     if {! [info exists keypress_lookup]} {
  85.         _init_keypress_lookup
  86.     }
  87.     if {$char == ""} {
  88.         error "empty char"
  89.     }
  90.     if {[info exists keypress_lookup($char)]} {
  91.         return $keypress_lookup($char)
  92.     } else {
  93.         return $char
  94.     }
  95. }
  96. # Lookup and generate a pair of KeyPress and KeyRelease events
  97. proc _keypress { win key } {
  98.     set keysym [_keypress_lookup $key]
  99.     # Force focus to the window before delivering
  100.     # each event so that a window manager using
  101.     # a focus follows mouse will not steal away
  102.     # the focus if the mouse is moved around.
  103.     if {[focus] != $win} {
  104.         focus -force $win
  105.     }
  106.     event generate $win <KeyPress-$keysym>
  107.     _pause 50
  108.     if {[focus] != $win} {
  109.         focus -force $win
  110.     }
  111.     event generate $win <KeyRelease-$keysym>
  112.     _pause 50
  113. }
  114. # Call _keypress for each character in the given string
  115. proc _keypress_string { win string } {
  116.     foreach letter [split $string ""] {
  117.         _keypress $win $letter
  118.     }
  119. }
  120. # Delay script execution for a given amount of time
  121. proc _pause { {msecs 1000} } {
  122.     global _pause
  123.     if {! [info exists _pause(number)]} {
  124.         set _pause(number) 0
  125.     }
  126.     set num [incr _pause(number)]
  127.     set _pause($num) 0
  128.     after $msecs "set _pause($num) 1"
  129.     vwait _pause($num)
  130.     unset _pause($num)
  131. }
  132. # Helper proc to convert index to x y position
  133. proc _text_ind_to_x_y { text ind } {
  134.     set bbox [$text bbox $ind]
  135.     if {[llength $bbox] != 4} {
  136.         error "got bbox {$bbox} from $text, index $ind"
  137.     }
  138.     foreach {x1 y1 width height} $bbox break
  139.     set middle_y [expr {$y1 + ($height / 2)}]
  140.     return [list $x1 $middle_y]
  141. }
  142. # Return selection only if owned by the given widget
  143. proc _get_selection { widget } {
  144.     if {[string compare $widget [selection own]] != 0} {
  145.         return ""
  146.     }
  147.     if {[catch {selection get} sel]} {
  148.         return ""
  149.     }
  150.     return $sel
  151. }
  152. # Begining of the actual tests
  153. test event-1.1 {Tk_HandleEvent procedure, filter events for dead windows} {
  154.     button .b -text Test
  155.     pack .b
  156.     bindtags .b .b
  157.     update
  158.     bind .b <Destroy> {
  159. lappend x destroy
  160. event generate .b <1>
  161. event generate .b <ButtonRelease-1>
  162.     }
  163.     bind .b <1> {
  164. lappend x button
  165.     }
  166.     set x {}
  167.     destroy .b
  168.     set x
  169. } {destroy}
  170. test event-1.2 {event generate <Alt-z>} {
  171. catch {destroy .e}
  172. catch {unset ::event12result}
  173. set ::event12result 0
  174. pack [entry .e]
  175. update
  176. bind .e <Alt-z> {set ::event12result "1"}
  177. focus -force .e ; event generate .e <Alt-z>
  178. destroy .e
  179. set ::event12result
  180. } 1
  181. test event-keypress-1.1 { type into entry widget and hit Return } {
  182.     destroy .t
  183.     set t [toplevel .t]
  184.     set e [entry $t.e]
  185.     pack $e
  186.     set return_binding 0
  187.     bind $e <Return> {set return_binding 1}
  188.     tkwait visibility $e
  189.     _keypress_string $e HELLOn
  190.     list [$e get] $return_binding
  191. } {HELLO 1}
  192. test event-keypress-1.2 { type into entry widget and then delete some text } {
  193.     destroy .t
  194.     set t [toplevel .t]
  195.     set e [entry $t.e]
  196.     pack $e
  197.     tkwait visibility $e
  198.     _keypress_string $e MELLO
  199.     _keypress $e BackSpace
  200.     _keypress $e BackSpace
  201.     $e get
  202. } MEL
  203. test event-keypress-1.3 { type into entry widget, triple click,
  204.                           hit Delete key, and then type some more } {
  205.     destroy .t
  206.     set t [toplevel .t]
  207.     set e [entry $t.e]
  208.     pack $e
  209.     tkwait visibility $e
  210.     _keypress_string $e JUMP
  211.     set result [$e get]
  212.     event generate $e <Enter>
  213.     for {set i 0} {$i < 3} {incr i} {
  214.         _pause 100
  215.         event generate $e <ButtonPress-1>
  216.         _pause 100
  217.         event generate $e <ButtonRelease-1>
  218.     }
  219.     _keypress $e Delete
  220.     _keypress_string $e UP
  221.     lappend result [$e get]
  222. } {JUMP UP}
  223. test event-keypress-1.4 { type into text widget and hit Return } {
  224.     destroy .t
  225.     set t [toplevel .t]
  226.     set e [text $t.e]
  227.     pack $e
  228.     set return_binding 0
  229.     bind $e <Return> {set return_binding 1}
  230.     tkwait visibility $e
  231.     _keypress_string $e HELLOn
  232.     list [$e get 1.0 end] $return_binding
  233. } [list "HELLOnn" 1]
  234. test event-keypress-1.5 { type into text widget and then delete some text } {
  235.     destroy .t
  236.     set t [toplevel .t]
  237.     set e [text $t.e]
  238.     pack $e
  239.     tkwait visibility $e
  240.     _keypress_string $e MELLO
  241.     _keypress $e BackSpace
  242.     _keypress $e BackSpace
  243.     $e get 1.0 1.end
  244. } MEL
  245. test event-keypress-1.6 { type into text widget, triple click,
  246.                           hit Delete key, and then type some more } {
  247.     destroy .t
  248.     set t [toplevel .t]
  249.     set e [text $t.e]
  250.     pack $e
  251.     tkwait visibility $e
  252.     _keypress_string $e JUMP
  253.     set result [$e get 1.0 1.end]
  254.     event generate $e <Enter>
  255.     for {set i 0} {$i < 3} {incr i} {
  256.         _pause 100
  257.         event generate $e <ButtonPress-1>
  258.         _pause 100
  259.         event generate $e <ButtonRelease-1>
  260.     }
  261.     _keypress $e Delete
  262.     _keypress_string $e UP
  263.     lappend result [$e get 1.0 1.end]
  264. } {JUMP UP}
  265. test event-click-drag-1.1 { click and drag in a text widget, this
  266.                             tests tkTextSelectTo in text.tcl } {
  267.     destroy .t
  268.     set t [toplevel .t]
  269.     set e [text $t.e]
  270.     pack $e
  271.     tkwait visibility $e
  272.     _keypress_string $e "A Tcl/Tk selection test!"
  273.     set anchor 1.6
  274.     set selend 1.18
  275.     set result [list]
  276.     lappend result [$e get 1.0 1.end]
  277.     # Get the x,y coords of the second T in "Tcl/Tk"
  278.     foreach {anchor_x anchor_y} [_text_ind_to_x_y $e $anchor] break
  279.     # Click down to set the insert cursor position
  280.     event generate $e <Enter>
  281.     event generate $e <ButtonPress-1> -x $anchor_x -y $anchor_y
  282.     # Save the position of the insert cursor
  283.     lappend result [$e index insert]
  284.     
  285.     # Now drag until selend is highlighted, then click up
  286.     set current $anchor
  287.     while {[$e compare $current <= $selend]} {
  288.         foreach {current_x current_y} [_text_ind_to_x_y $e $current] break
  289.         event generate $e <B1-Motion> -x $current_x -y $current_y
  290.         set current [$e index [list $current + 1 char]]
  291.         _pause 50
  292.     }
  293.     event generate $e <ButtonRelease-1> -x $current_x -y $current_y
  294.     _pause 200
  295.     # Save the position of the insert cursor
  296.     lappend result [$e index insert]
  297.     # Save the highlighted text
  298.     lappend result [_get_selection $e]
  299.     # Now click and click and drag to the left, over "Tcl/Tk selection"
  300.     event generate $e <ButtonPress-1> -x $current_x -y $current_y
  301.     while {[$e compare $current >= [list $anchor - 4 char]]} {
  302.         foreach {current_x current_y} [_text_ind_to_x_y $e $current] break
  303.         event generate $e <B1-Motion> -x $current_x -y $current_y
  304.         set current [$e index [list $current - 1 char]]
  305.         _pause 50
  306.     }
  307.     event generate $e <ButtonRelease-1> -x $current_x -y $current_y
  308.     _pause 200
  309.     # Save the position of the insert cursor
  310.     lappend result [$e index insert]
  311.     # Save the highlighted text
  312.     lappend result [_get_selection $e]
  313. } {{A Tcl/Tk selection test!} 1.6 1.18 {Tk selection} 1.2 {Tcl/Tk selection}}
  314. test event-click-drag-1.2 { click and drag in an entry widget, this
  315.                             tests tkEntryMouseSelect in entry.tcl } {
  316.     destroy .t
  317.     set t [toplevel .t]
  318.     set e [entry $t.e]
  319.     pack $e
  320.     tkwait visibility $e
  321.     _keypress_string $e "A Tcl/Tk selection!"
  322.     set anchor 6
  323.     set selend 18
  324.     set result [list]
  325.     lappend result [$e get]
  326.     # Get the x,y coords of the second T in "Tcl/Tk"
  327.     foreach {anchor_x anchor_y} [_text_ind_to_x_y $e $anchor] break
  328.     # Click down to set the insert cursor position
  329.     event generate $e <Enter>
  330.     event generate $e <ButtonPress-1> -x $anchor_x -y $anchor_y
  331.     # Save the position of the insert cursor
  332.     lappend result [$e index insert]
  333.     
  334.     # Now drag until selend is highlighted, then click up
  335.     set current $anchor
  336.     while {$current <= $selend} {
  337.         foreach {current_x current_y} [_text_ind_to_x_y $e $current] break
  338.         event generate $e <B1-Motion> -x $current_x -y $current_y
  339.         incr current
  340.         _pause 50
  341.     }
  342.     event generate $e <ButtonRelease-1> -x $current_x -y $current_y
  343.     _pause 200
  344.     # Save the position of the insert cursor
  345.     lappend result [$e index insert]
  346.     # Save the highlighted text
  347.     lappend result [_get_selection $e]
  348.     # Now click and click and drag to the left, over "Tcl/Tk selection"
  349.     event generate $e <ButtonPress-1> -x $current_x -y $current_y
  350.     while {$current >= ($anchor - 4)} {
  351.         foreach {current_x current_y} [_text_ind_to_x_y $e $current] break
  352.         event generate $e <B1-Motion> -x $current_x -y $current_y
  353.         incr current -1
  354.         _pause 50
  355.     }
  356.     event generate $e <ButtonRelease-1> -x $current_x -y $current_y
  357.     _pause 200
  358.     # Save the position of the insert cursor
  359.     lappend result [$e index insert]
  360.     # Save the highlighted text
  361.     lappend result [_get_selection $e]
  362. } {{A Tcl/Tk selection!} 6 18 {Tk selection} 2 {Tcl/Tk selection}}
  363. test event-double-click-drag-1.1 { click down, click up, click down again,
  364.                             then drag in a text widget } {
  365.     destroy .t
  366.     set t [toplevel .t]
  367.     set e [text $t.e]
  368.     pack $e
  369.     tkwait visibility $e
  370.     _keypress_string $e "Word select test"
  371.     set anchor 1.8
  372.     # Get the x,y coords of the second e in "select"
  373.     foreach {anchor_x anchor_y} [_text_ind_to_x_y $e $anchor] break
  374.     # Click down, release, then click down again
  375.     event generate $e <Enter>
  376.     event generate $e <ButtonPress-1> -x $anchor_x -y $anchor_y
  377.     _pause 50
  378.     event generate $e <ButtonRelease-1> -x $anchor_x -y $anchor_y
  379.     _pause 50
  380.     event generate $e <ButtonPress-1> -x $anchor_x -y $anchor_y
  381.     _pause 50
  382.     # Save the highlighted text
  383.     set result [list]
  384.     lappend result [_get_selection $e]
  385.     # Insert cursor should be at end of "select"
  386.     lappend result [$e index insert]
  387.     # Move mouse one character to the left
  388.     set current [$e index [list $anchor - 1 char]]
  389.     foreach {current_x current_y} [_text_ind_to_x_y $e $current] break
  390.     event generate $e <B1-Motion> -x $current_x -y $current_y
  391.     _pause 50
  392.     # Insert cursor should be before the l in "select"
  393.     lappend result [$e index insert]
  394.     # Selection should still be the word "select"
  395.     lappend result [_get_selection $e]
  396.     # Move mouse to the space before the word "select"
  397.     set current [$e index [list $current - 3 char]]
  398.     foreach {current_x current_y} [_text_ind_to_x_y $e $current] break
  399.     event generate $e <B1-Motion> -x $current_x -y $current_y
  400.     _pause 200
  401.     lappend result [$e index insert]
  402.     lappend result [_get_selection $e]
  403.     # Move mouse to the r in "Word"
  404.     set current 1.2
  405.     foreach {current_x current_y} [_text_ind_to_x_y $e $current] break
  406.     event generate $e <B1-Motion> -x $current_x -y $current_y
  407.     _pause 50
  408.     # Selection should now be "Word select"
  409.     lappend result [_get_selection $e]
  410.     # Insert cursor should be before the r in "Word"
  411.     lappend result [$e index insert]
  412.     set result
  413. } {select 1.11 1.7 select 1.4 { select} {Word select} 1.2}
  414. test event-double-click-drag-1.2 { click down, click up, click down again,
  415.                             then drag in an entry widget } {
  416.     destroy .t
  417.     set t [toplevel .t]
  418.     set e [entry $t.e]
  419.     pack $e
  420.     tkwait visibility $e
  421.     _keypress_string $e "Word select test"
  422.     set anchor 8
  423.     # Get the x,y coords of the second e in "select"
  424.     foreach {anchor_x anchor_y} [_text_ind_to_x_y $e $anchor] break
  425.     # Click down, release, then click down again
  426.     event generate $e <Enter>
  427.     event generate $e <ButtonPress-1> -x $anchor_x -y $anchor_y
  428.     _pause 50
  429.     event generate $e <ButtonRelease-1> -x $anchor_x -y $anchor_y
  430.     _pause 50
  431.     event generate $e <ButtonPress-1> -x $anchor_x -y $anchor_y
  432.     _pause 50
  433.     set result [list]
  434.     lappend result [_get_selection $e]
  435.     # Insert cursor should be at the end of "select"
  436.     lappend result [$e index insert]
  437.     # Move mouse one character to the left
  438.     set current [expr {$anchor - 1}]
  439.     foreach {current_x current_y} [_text_ind_to_x_y $e $current] break
  440.     event generate $e <B1-Motion> -x $current_x -y $current_y
  441.     _pause 50
  442.     # Insert cursor should be before the l in "select"
  443.     lappend result [$e index insert]
  444.     # Selection should still be the word "select"
  445.     lappend result [_get_selection $e]
  446.     # Move mouse to the space before the word "select"
  447.     set current [expr {$current - 3}]
  448.     foreach {current_x current_y} [_text_ind_to_x_y $e $current] break
  449.     event generate $e <B1-Motion> -x $current_x -y $current_y
  450.     _pause 50
  451.     lappend result [$e index insert]
  452.     lappend result [_get_selection $e]
  453.     # Move mouse to the r in "Word"
  454.     set current [expr {$current - 2}]
  455.     foreach {current_x current_y} [_text_ind_to_x_y $e $current] break
  456.     event generate $e <B1-Motion> -x $current_x -y $current_y
  457.     _pause 50
  458.     # Selection should now be "Word select"
  459.     lappend result [_get_selection $e]
  460.     # Insert cursor should be before the r in "Word"
  461.     lappend result [$e index insert]
  462.     set result
  463. } {select 11 7 select 4 { select} {Word select} 2}
  464. test event-triple-click-drag-1.1 { Triple click and drag across lines in
  465.         a text widget, this should extend the selection to the new line } {
  466.     destroy .t
  467.     set t [toplevel .t]
  468.     set e [text $t.e]
  469.     pack $e
  470.     tkwait visibility $e
  471.     _keypress_string $e "LINE ONEnLINE TWOnLINE THREE"
  472.     set anchor 3.2
  473.     # Triple click one third line leaving mouse down
  474.     foreach {anchor_x anchor_y} [_text_ind_to_x_y $e $anchor] break
  475.     event generate $e <Enter>
  476.     event generate $e <ButtonPress-1> -x $anchor_x -y $anchor_y
  477.     _pause 50
  478.     event generate $e <ButtonRelease-1> -x $anchor_x -y $anchor_y
  479.     _pause 50
  480.     event generate $e <ButtonPress-1> -x $anchor_x -y $anchor_y
  481.     _pause 50
  482.     event generate $e <ButtonRelease-1> -x $anchor_x -y $anchor_y
  483.     _pause 50
  484.     event generate $e <ButtonPress-1> -x $anchor_x -y $anchor_y
  485.     _pause 50
  486.     set result [list]
  487.     lappend result [_get_selection $e]
  488.     # Drag up to second line
  489.     set current [$e index [list $anchor - 1 line]]
  490.     foreach {current_x current_y} [_text_ind_to_x_y $e $current] break
  491.     event generate $e <B1-Motion> -x $current_x -y $current_y
  492.     _pause 50
  493.     lappend result [_get_selection $e]
  494.     # Drag up to first line
  495.     set current [$e index [list $current - 1 line]]
  496.     foreach {current_x current_y} [_text_ind_to_x_y $e $current] break
  497.     event generate $e <B1-Motion> -x $current_x -y $current_y
  498.     _pause 50
  499.     lappend result [_get_selection $e]
  500.     set result
  501. } [list "LINE THREEn" "LINE TWOnLINE THREEn" 
  502.         "LINE ONEnLINE TWOnLINE THREEn"]
  503. test event-button-state-1.1 { button press in a window that is then
  504.         destroyed, when the mouse is moved into another window it
  505.         should not generate a <B1-motion> event since the mouse
  506.         was not pressed down in that window. } {
  507.     destroy .t
  508.     set t [toplevel .t]
  509.     event generate $t <ButtonPress-1>
  510.     destroy $t
  511.     set t [toplevel .t]
  512.     set motion nomotion
  513.     bind $t <B1-Motion> {set motion inmotion}
  514.     event generate $t <Motion>
  515.     set motion
  516. } nomotion
  517. # cleanup
  518. destroy .t
  519. unset -nocomplain keypress_lookup
  520. rename _init_keypress_lookup {}
  521. rename _keypress_lookup {}
  522. rename _keypress {}
  523. rename _pause {}
  524. rename _text_ind_to_x_y {}
  525. rename _get_selection {}
  526. ::tcltest::cleanupTests
  527. return