gioui.org@v0.6.1-0.20240506124620-7a9ce51988ce/widget/button_test.go (about) 1 // SPDX-License-Identifier: Unlicense OR MIT 2 3 package widget_test 4 5 import ( 6 "image" 7 "testing" 8 9 "gioui.org/io/input" 10 "gioui.org/io/key" 11 "gioui.org/layout" 12 "gioui.org/op" 13 "gioui.org/widget" 14 ) 15 16 func TestClickable(t *testing.T) { 17 var ( 18 r input.Router 19 b1 widget.Clickable 20 b2 widget.Clickable 21 ) 22 gtx := layout.Context{ 23 Ops: new(op.Ops), 24 Source: r.Source(), 25 } 26 layout := func() { 27 b1.Layout(gtx, func(gtx layout.Context) layout.Dimensions { 28 return layout.Dimensions{Size: image.Pt(100, 100)} 29 }) 30 // buttons are on top of each other but we only use focus and keyevents, so this is fine 31 b2.Layout(gtx, func(gtx layout.Context) layout.Dimensions { 32 return layout.Dimensions{Size: image.Pt(100, 100)} 33 }) 34 } 35 frame := func() { 36 gtx.Reset() 37 layout() 38 r.Frame(gtx.Ops) 39 } 40 gtx.Execute(key.FocusCmd{Tag: &b1}) 41 frame() 42 if !gtx.Focused(&b1) { 43 t.Error("button 1 did not gain focus") 44 } 45 if gtx.Focused(&b2) { 46 t.Error("button 2 should not have focus") 47 } 48 r.Queue( 49 key.Event{ 50 Name: key.NameReturn, 51 State: key.Press, 52 }, 53 key.Event{ 54 Name: key.NameReturn, 55 State: key.Release, 56 }, 57 ) 58 if !b1.Clicked(gtx) { 59 t.Error("button 1 did not get clicked when it got return press & release") 60 } 61 if b2.Clicked(gtx) { 62 t.Error("button 2 got clicked when it did not have focus") 63 } 64 r.Queue( 65 key.Event{ 66 Name: key.NameReturn, 67 State: key.Press, 68 }, 69 ) 70 if b1.Clicked(gtx) { 71 t.Error("button 1 got clicked, even if it only got return press") 72 } 73 frame() 74 gtx.Execute(key.FocusCmd{Tag: &b2}) 75 frame() 76 if gtx.Focused(&b1) { 77 t.Error("button 1 should not have focus") 78 } 79 if !gtx.Focused(&b2) { 80 t.Error("button 2 did not gain focus") 81 } 82 r.Queue( 83 key.Event{ 84 Name: key.NameReturn, 85 State: key.Release, 86 }, 87 ) 88 if b1.Clicked(gtx) { 89 t.Error("button 1 got clicked, even if it had lost focus") 90 } 91 if b2.Clicked(gtx) { 92 t.Error("button 2 should not have been clicked, as it only got return release") 93 } 94 }