diff options
author | fvogel <fvogelnew1@free.fr> | 2019-08-28 19:27:16 (GMT) |
---|---|---|
committer | fvogel <fvogelnew1@free.fr> | 2019-08-28 19:27:16 (GMT) |
commit | 7d686add2939fd812eb8a6bc45c19294a3e137ca (patch) | |
tree | f95a0034344f8bba0c5744d43d47ca40168a41fc /tests | |
parent | 352415b3eeb5738425e2d810b643462214def91a (diff) | |
parent | b039e4d55caaa7cc97f7c3ee969b8abd7c97c81e (diff) | |
download | tk-7d686add2939fd812eb8a6bc45c19294a3e137ca.zip tk-7d686add2939fd812eb8a6bc45c19294a3e137ca.tar.gz tk-7d686add2939fd812eb8a6bc45c19294a3e137ca.tar.bz2 |
Merge TIP #532 implementation now that [c1c842ef7792] (new tkBind.c: wrong assumption about ButtonRelease to match Button presses) is fixed.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/bind.test | 524 |
1 files changed, 491 insertions, 33 deletions
diff --git a/tests/bind.test b/tests/bind.test index 9cbc15b..5f45ffc 100644 --- a/tests/bind.test +++ b/tests/bind.test @@ -34,19 +34,6 @@ proc unsetBindings {} { bind .t <Enter> {} } -# This function fills the pattern matcher's ring buffer with events of -# the specified type. This can be used when testing with generated -# events to make sure that there are no stray events in the ring -# buffer which might cause the pattern matcher to find unintended -# matches. The size of the ring buffer is EVENT_BUFFER_SIZE, which is -# currently set to 30 (or 45 on macOS). If this changes, the code -# below will need to change. -proc clearRingBuffer {{event}} { - for {set i 0} {$i < 45} {incr i} { - event generate . $event - } -} - # move the mouse pointer away of the testing area # otherwise some spurious events may pollute the tests toplevel .top @@ -1395,7 +1382,6 @@ test bind-15.22 {MatchPatterns procedure, time wrap-around} -setup { pack .t.f focus -force .t.f update - clearRingBuffer <Key> } -body { bind .t.f <Double-1> {set x 1} set x 0 @@ -1411,7 +1397,6 @@ test bind-15.23 {MatchPatterns procedure, time wrap-around} -setup { pack .t.f focus -force .t.f update - clearRingBuffer <Key> } -body { bind .t.f <Double-1> {set x 1} set x 0 @@ -1428,7 +1413,6 @@ test bind-15.24 {MatchPatterns procedure, virtual event} -setup { focus -force .t.f update set x {} - clearRingBuffer <Key> } -body { event add <<Paste>> <Button-1> bind .t.f <<Paste>> {lappend x paste} @@ -1445,7 +1429,6 @@ test bind-15.25 {MatchPatterns procedure, reject a virtual event} -setup { focus -force .t.f update set x {} - clearRingBuffer <Key> } -body { event add <<Paste>> <Shift-Button-1> bind .t.f <<Paste>> {lappend x paste} @@ -1462,7 +1445,6 @@ test bind-15.26 {MatchPatterns procedure, reject a virtual event} -setup { focus -force .t.f update set x {} - clearRingBuffer <Key> } -body { event add <<V1>> <Button> event add <<V2>> <Button-1> @@ -1489,7 +1471,6 @@ test bind-15.27 {MatchPatterns procedure, conflict resolution} -setup { pack .t.f focus -force .t.f update - clearRingBuffer <Button> } -body { bind .t.f <KeyPress> {set x 0} bind .t.f 1 {set x 1} @@ -1504,7 +1485,6 @@ test bind-15.28 {MatchPatterns procedure, conflict resolution} -setup { pack .t.f focus -force .t.f update - clearRingBuffer <Button> } -body { bind .t.f <KeyPress> {set x 0} bind .t.f 1 {set x 1} @@ -1519,7 +1499,6 @@ test bind-15.29 {MatchPatterns procedure, conflict resolution} -setup { pack .t.f focus -force .t.f update - clearRingBuffer <Button> } -body { bind .t.f <KeyPress> {lappend x 0} bind .t.f 1 {lappend x 1} @@ -1537,7 +1516,6 @@ test bind-15.30 {MatchPatterns procedure, conflict resolution} -setup { pack .t.f focus -force .t.f update - clearRingBuffer <Key> } -body { bind .t.f <ButtonPress> {set x 0} bind .t.f <1> {set x 1} @@ -1554,7 +1532,6 @@ test bind-15.31 {MatchPatterns procedure, conflict resolution} -setup { focus -force .t.f update set x {} - clearRingBuffer <Button> } -body { bind .t.f <M1-Key> {set x 0} bind .t.f <M2-Key> {set x 1} @@ -1568,7 +1545,6 @@ test bind-15.32 {MatchPatterns procedure, conflict resolution} -setup { pack .t.f focus -force .t.f update - clearRingBuffer <Button> } -body { bind .t.f <M2-Key> {set x 0} bind .t.f <M1-Key> {set x 1} @@ -1584,7 +1560,6 @@ test bind-15.33 {MatchPatterns procedure, conflict resolution} -setup { focus -force .t.f update set x {} - clearRingBuffer <Key> } -body { bind .t.f <1> {lappend x single} bind Test <1> {lappend x single(Test)} @@ -2232,7 +2207,6 @@ test bind-16.46 {ExpandPercents procedure} -setup { focus -force .t.e foreach p [event info] {event delete $p} update - clearRingBuffer <Button> } -body { bind all <Key> {set z "%M"} bind Entry <Key> {set y "%M"} @@ -2293,6 +2267,7 @@ test bind-17.9 {event command: delete many} -body { event delete <<Paste>> <1> <2> lsort [event info <<Paste>>] } -cleanup { + event delete <<Paste>> event delete <<Paste>> <3> t } -result {<Button-3> t} test bind-17.10 {event command: delete all} -body { @@ -2590,6 +2565,7 @@ test bind-19.15 {DeleteVirtualEvent procedure: owned by many, first} -setup { pack [frame .t.f -class Test -width 150 -height 100] pack [frame .t.g -class Test -width 150 -height 100] pack [frame .t.h -class Test -width 150 -height 100] + after 250 ;# we need a bit time to ensure that .t.h is mapped (<TODO>: fix this race condition) focus -force .t.f update set x {} @@ -2626,6 +2602,7 @@ test bind-19.16 {DeleteVirtualEvent procedure: owned by many, middle} -setup { pack [frame .t.f -class Test -width 150 -height 100] pack [frame .t.g -class Test -width 150 -height 100] pack [frame .t.h -class Test -width 150 -height 100] + after 250 ;# we need a bit time to ensure that .t.h is mapped (<TODO>: fix this race condition) focus -force .t.f update set x {} @@ -2662,6 +2639,7 @@ test bind-19.17 {DeleteVirtualEvent procedure: owned by many, last} -setup { pack [frame .t.f -class Test -width 150 -height 100] pack [frame .t.g -class Test -width 150 -height 100] pack [frame .t.h -class Test -width 150 -height 100] + after 250 ;# we need a bit time to ensure that .t.h is mapped (<TODO>: fix this race condition) focus -force .t.f update set x {} @@ -2774,7 +2752,7 @@ test bind-22.5 {HandleEventGenerate} -body { } -returnCodes error -result {bad event type or keysym "xyz"} test bind-22.6 {HandleEventGenerate} -body { event generate . <Double-Button-1> -} -returnCodes error -result {Double or Triple modifier not allowed} +} -returnCodes error -result {Double, Triple, or Quadruple modifier not allowed} test bind-22.7 {HandleEventGenerate} -body { event generate . xyz } -returnCodes error -result {only one event specification allowed} @@ -3928,7 +3906,7 @@ test bind-22.92 {HandleEventGenerate: options <Key> -sendevent 43} -setup { return $x } -cleanup { destroy .t.f -} -result {43} +} -result {1} test bind-22.93 {HandleEventGenerate: options <Key> -serial xyz} -setup { frame .t.f -class Test -width 150 -height 100 @@ -5121,9 +5099,13 @@ test bind-25.3 {ParseEventDescription procedure} -setup { } -cleanup { destroy .t.f } -result a -test bind-25.4 {ParseEventDescription} -body { - bind .t <<Shift-Paste>> {puts hi} - bind .t +test bind-25.4 {ParseEventDescription} -setup { + frame .t.f -class Test -width 150 -height 100 +} -body { + bind .t.f <<Shift-Paste>> {puts hi} + bind .t.f +} -cleanup { + destroy .t.f } -result {<<Shift-Paste>>} # Assorted error cases in event sequence parsing @@ -5791,7 +5773,7 @@ test bind-27.1 {button names} -body { } -returnCodes error -result {specified button "1" for non-button event} test bind-27.2 {button names} -body { bind .t <Button-6> foo -} -returnCodes error -result {specified keysym "6" for non-key event} +} -returnCodes error -result {bad button number "6"} test bind-27.3 {button names} -setup { frame .t.f -class Test -width 150 -height 100 pack .t.f @@ -6126,7 +6108,7 @@ test bind-31.7 {virtual event user_data field - unshared, asynch} -setup { destroy .t.f } -result {{} {} {TestUserData >b<}} -test bind-32 {-warp, window was destroyed before the idle callback DoWarp} -setup { +test bind-32.1 {-warp, window was destroyed before the idle callback DoWarp} -setup { frame .t.f pack .t.f focus -force .t.f @@ -6138,6 +6120,482 @@ test bind-32 {-warp, window was destroyed before the idle callback DoWarp} -setu update ; # shall simply not crash } -cleanup { } -result {} +test bind-32.2 {detection of double click should not fail} -setup { + pack [frame .t.f] + focus -force .t.f + bind .t.f <Double-Button-1> { set x "Double" } + update + set x {} +} -body { + event generate .t.f <ButtonPress-1> + event generate .t.f <ButtonRelease-1> + # Simulate a lot of intervening exposure events. The old implementation + # that used an event ring overflowed, and the double click was not detected. + # But new implementation should work properly. + for {set i 0} {$i < 1000} {incr i} { + event generate .t.f <Expose> + } + event generate .t.f <ButtonPress-1> + event generate .t.f <ButtonRelease-1> + set x +} -cleanup { + destroy .t.f +} -result {Double} +test bind-32.3 {should trigger best match of modifier states} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <Alt-Control-Key-A> { lappend x "Alt-Control" } + bind .t.f <Shift-Control-Key-A> { lappend x "Shift-Control" } + bind .t.f <Shift-Key-A> { lappend x "Shift" } + event generate .t.f <Alt-Control-Key-A> + set x +} -cleanup { + destroy .t.f +} -result {Shift-Control} +test bind-32.4 {should not trigger Double-1} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <Double-1> { set x "Double" } + event generate .t.f <1> -time current + after 1000 + event generate .t.f <1> -time current + set x +} -cleanup { + destroy .t.f +} -result {} +test bind-32.5 {should trigger Quadruple-1} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <Quadruple-1> { set x "Quadruple" } + bind .t.f <Triple-1> { set x "Triple" } + bind .t.f <Double-1> { set x "Double" } + bind .t.f <1> { set x "Single" } + # Old implementation triggered "Double", but new implementation + # triggers "Quadruple", the latter behavior conforms to other toolkits. + event generate .t.f <Button-1> -time 0 + event generate .t.f <Button-1> -time 400 + event generate .t.f <Button-1> -time 800 + event generate .t.f <Button-1> -time 1200 + set x +} -cleanup { + destroy .t.f +} -result {Quadruple} +test bind-32.6 {problem with sendevent} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + # Old implementation was losing sendevent value + bind .t.f <FocusIn> { set x "sendevent=%E" } + event generate .t.f <FocusIn> -sendevent 1 + set x +} -cleanup { + destroy .t.f +} -result {sendevent=1} +test bind-32.7 {test sequences} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <Double-1> { lappend x "Double" } + bind .t.f <1><1><a> { lappend x "11" } + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <a> + set x +} -cleanup { + destroy .t.f +} -result {Double 11} +test bind-32.8 {test sequences} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <a><1><Double-1><1><a> { lappend x "Double" } + event generate .t.f <a> + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <a> + set x +} -cleanup { + destroy .t.f +} -result {Double} +test bind-32.9 {trigger events for modifier keys} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <Any-Key> { set x "Key" } + event generate .t.f <KeyPress> -keysym Caps_Lock + set x +} -cleanup { + destroy .t.f +} -result {Key} +test bind-32.10 {reset key state when destroying window} -setup { + set x {} +} -body { + pack [frame .t.f]; update; focus -force .t.f + bind .t.f <Key-A> { set x "A" } + event generate .t.f <KeyPress-A> + event generate .t.f <KeyPress-A> + destroy .t.f; update + pack [frame .t.f]; update; focus -force .t.f + bind .t.f <Key-A> { set x "A" } + bind .t.f <Double-Key-A> { set x "AA" } + event generate .t.f <KeyPress-A> + destroy .t.f + set x +} -result {A} +test bind-32.11 {match detailed virtual} -setup { + pack [frame .t.f -class Test] + focus -force .t.f + update + set x {} +} -body { + event add <<TestControlButton1>> <Control-Button-1> + bind Test <<TestControlButton1>> { set x "Control-Button-1" } + bind Test <Button-1> { set x "Button-1" } + bind .t.f <Button-1> { set x "Button-1" } + event generate .t.f <Control-ButtonPress-1> + set x +} -cleanup { + destroy .t.f + event delete <<TestControlButton1>> + bind Test <Button-1> {#} +} -result {Control-Button-1} +test bind-32.12 {don't detect repetition when window has changed} -setup { + pack [frame .t.f] + pack [frame .t.g] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <Button-1> { set x "1" } + bind .t.f <Double-Button-1> { set x "11" } + event generate .t.f <ButtonPress-1> + event generate .t.g <ButtonPress-1> + event generate .t.f <ButtonPress-1> + set x +} -cleanup { + destroy .t.f + destroy .t.g +} -result {1} +test bind-32.13 {don't detect repetition when window has changed} -setup { + pack [frame .t.f] + pack [frame .t.g] + update + set x {} +} -body { + bind .t.f <Key-A> { set x "A" } + bind .t.f <Double-Key-A> { set x "AA" } + focus -force .t.f; event generate .t.f <KeyPress-A> + focus -force .t.g; event generate .t.g <KeyPress-A> + focus -force .t.f; event generate .t.f <KeyPress-A> + set x +} -cleanup { + destroy .t.f + destroy .t.g +} -result {A} +test bind-32.14 {don't detect repetition when window has changed} -setup { + pack [frame .t.f] + pack [frame .t.g] + update + set x {} +} -body { + bind .t.f <ButtonPress-1> { set x "1" } + bind .t.f <Double-ButtonPress-1> { set x "11" } + focus -force .t.f; event generate .t.f <ButtonPress-1> + focus -force .t.g; event generate .t.g <ButtonPress-1> + focus -force .t.f; event generate .t.f <ButtonPress-1> + set x +} -cleanup { + destroy .t.f + destroy .t.g +} -result {1} +test bind-32.15 {reset button state when destroying window} -setup { + set x {} +} -body { + pack [frame .t.f]; update; focus -force .t.f + bind .t.f <ButtonPress-1> { set x "1" } + event generate .t.f <ButtonPress-1> + event generate .t.f <ButtonPress-1> + destroy .t.f; update + pack [frame .t.f]; update; focus -force .t.f + bind .t.f <ButtonPress-1> { set x "1" } + bind .t.f <Double-ButtonPress-1> { set x "11" } + event generate .t.f <ButtonPress-1> + destroy .t.f + set x +} -result {1} + +test bind-33.1 {prefer longest match} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <a><1><1> { lappend x "a11" } + bind .t.f <Double-1> { lappend x "Double" } + event generate .t.f <a> + event generate .t.f <1> + event generate .t.f <1> + set x +} -cleanup { + destroy .t.f +} -result {a11} +test bind-33.2 {should prefer most specific event} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <Double-1> { lappend x "Double" } + bind .t.f <1><1> { lappend x "11" } + event generate .t.f <1> + event generate .t.f <1> + set x +} -cleanup { + destroy .t.f + # This test case shows that old implementation has an issue, because + # it is expected that <Double-1> is matching, this binding + # is more specific. But new implementation will be conform to old, + # and so "11" is the expected result. +} -result {11} +test bind-33.3 {should prefer most specific event} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <a><Double-1><a> { lappend x "Double" } + bind .t.f <a><1><1><a> { lappend x "11" } + event generate .t.f <a> + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <a> + set x +} -cleanup { + destroy .t.f + # Also this test case shows that old implementation has an issue, it is + # expected that <a><Double-1><a> is matching, because <Double-1> is more + # specific than <1><1>. But new implementation will be conform to old, + # and so "11" is the expected result. +} -result {11} +test bind-33.4 {prefer most specific event} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <1><1> { lappend x "11" } + bind .t.f <Double-1> { lappend x "Double" } + event generate .t.f <1> -time 0 + event generate .t.f <1> -time 1000 + set x +} -cleanup { + destroy .t.f +} -result {11} +test bind-33.5 {prefer most specific event} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <1><1> { lappend x "11" } + bind .t.f <Double-ButtonPress> { lappend x "Double" } + event generate .t.f <1> + event generate .t.f <1> + set x +} -cleanup { + destroy .t.f +} -result {11} +test bind-33.6 {prefer most specific event} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <a><1><1><1><1><a> { lappend x "1111" } + bind .t.f <a><ButtonPress><Double-ButtonPress><ButtonPress><a> { lappend x "Any-Double-Any" } + event generate .t.f <a> + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <a> + set x +} -cleanup { + destroy .t.f +} -result {1111} +test bind-33.7 {prefer most specific event} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <ButtonPress-1><a> { lappend x "1" } + bind .t.f <ButtonPress><a> { lappend x "Any" } + event generate .t.f <1> + event generate .t.f <a> + set x +} -cleanup { + destroy .t.f +} -result {1} +test bind-33.8 {prefer most specific event} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <Double-ButtonPress-1><a> { lappend x "1" } + bind .t.f <ButtonPress><ButtonPress><a> { lappend x "Any" } + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <a> + set x +} -cleanup { + destroy .t.f +} -result {1} +test bind-33.9 {prefer last in case of homogeneous equal patterns} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <1><2><2><Double-1> { lappend x "first" } + bind .t.f <1><Double-2><1><1> { lappend x "last" } + event generate .t.f <1> + event generate .t.f <2> + event generate .t.f <2> + event generate .t.f <1> + event generate .t.f <1> + set x +} -cleanup { + destroy .t.f +} -result {last} +test bind-33.10 {prefer last in case of homogeneous equal patterns} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <1><Double-2><1><1> { lappend x "first" } + bind .t.f <1><2><2><Double-1> { lappend x "last" } + event generate .t.f <1> + event generate .t.f <2> + event generate .t.f <2> + event generate .t.f <1> + event generate .t.f <1> + set x +} -cleanup { + destroy .t.f +} -result {last} +test bind-33.11 {should prefer most specific} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <2><Double-1><Double-2><Double-1><2><2> { lappend x "first" } + bind .t.f <2><1><1><2><2><Double-1><Double-2> { lappend x "last" } + event generate .t.f <2> + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <2> + event generate .t.f <2> + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <2> + event generate .t.f <2> + set x +} -cleanup { + destroy .t.f + # This test case shows that old implementation has an issue, because + # it is expected that first one is matching, this binding + # is more specific. But new implementation will be conform to old, + # and so "last" is the expected result. +} -result {last} +test bind-33.12 {prefer last in case of homogeneous equal patterns} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <Control-1><1> { lappend x "first" } + bind .t.f <1><Control-1> { lappend x "last" } + event generate .t.f <Control-1> + event generate .t.f <Control-1> + set x +} -cleanup { + destroy .t.f +} -result {last} +test bind-33.13 {prefer last in case of homogeneous equal patterns} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <1><Control-1> { lappend x "first" } + bind .t.f <Control-1><1> { lappend x "last" } + event generate .t.f <Control-1> + event generate .t.f <Control-1> + set x +} -cleanup { + destroy .t.f + # Old implementation failed, and returned "first", but this was wrong, + # because both bindings are homogeneous equal, so the most recently defined + # must be preferred. +} -result {last} +test bind-33.14 {prefer last in case of homogeneous equal patterns} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <1><ButtonPress><1><ButtonPress> { lappend x "first" } + bind .t.f <ButtonPress><1><ButtonPress><1> { lappend x "last" } + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <1> + set x +} -cleanup { + destroy .t.f +} -result {last} +test bind-33.15 {prefer last in case of homogeneous equal patterns} -setup { + pack [frame .t.f] + focus -force .t.f + update + set x {} +} -body { + bind .t.f <ButtonPress><1><ButtonPress><1> { lappend x "first" } + bind .t.f <1><ButtonPress><1><ButtonPress> { lappend x "last" } + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <1> + event generate .t.f <1> + set x +} -cleanup { + destroy .t.f + # Old implementation failed, and returned "first", but this was wrong, + # because both bindings are homogeneous equal, so the most recently defined + # must be preferred. +} -result {last} # cleanup |