Skip to content

Commit 434b3d6

Browse files
committed
fix: incorrect value returned by Duration()
pipad.Duration(), pikey.Duration(), pimouse.Duration() reports "1" when input was pressed in the last frame and released in the current one. It should return 0 in such case.
1 parent 5e1f037 commit 434b3d6

File tree

5 files changed

+82
-18
lines changed

5 files changed

+82
-18
lines changed

internal/input/input.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ func (s *State[T]) Duration(input T) int {
1313
return s.pressedInput(input).duration()
1414
}
1515

16-
func (s *State[T]) SetStartFrame(input T, frame int) {
17-
s.pressedInput(input).startFrame = frame
16+
func (s *State[T]) SetDownFrame(input T, frame int) {
17+
s.pressedInput(input).downFrame = frame
1818
}
1919

20-
func (s *State[T]) SetStopFrame(input T, frame int) {
21-
s.pressedInput(input).stopFrame = frame
20+
func (s *State[T]) SetUpFrame(input T, frame int) {
21+
s.pressedInput(input).upFrame = frame
2222
}
2323

2424
func (s *State[T]) pressedInput(input T) *pressedInput {
@@ -27,24 +27,24 @@ func (s *State[T]) pressedInput(input T) *pressedInput {
2727
}
2828
p, ok := s.pressedInputs[input]
2929
if !ok {
30-
p = &pressedInput{startFrame: -1, stopFrame: -1}
30+
p = &pressedInput{downFrame: -1, upFrame: -1}
3131
s.pressedInputs[input] = p
3232
}
3333
return p
3434
}
3535

3636
type pressedInput struct {
37-
startFrame, stopFrame int
37+
downFrame, upFrame int
3838
}
3939

4040
func (p pressedInput) duration() int {
41-
if p.startFrame < 0 {
41+
if p.downFrame < 0 {
4242
return 0
4343
}
44-
if p.startFrame > p.stopFrame {
45-
return pi.Frame - p.startFrame + 1
44+
if p.downFrame > p.upFrame {
45+
return pi.Frame - p.downFrame + 1
4646
}
47-
if p.stopFrame == pi.Frame {
47+
if p.downFrame == p.upFrame && p.upFrame == pi.Frame {
4848
return 1
4949
}
5050
return 0

internal/input/input_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// Copyright 2025 Jacek Olszak
2+
// This code is licensed under MIT license (see LICENSE for details)
3+
4+
package input_test
5+
6+
import (
7+
"github.com/elgopher/pi"
8+
"github.com/elgopher/pi/internal/input"
9+
"github.com/stretchr/testify/assert"
10+
"testing"
11+
)
12+
13+
func TestState_Duration(t *testing.T) {
14+
const btn = "btn"
15+
16+
t.Run("should return 0 when input was never pressed", func(t *testing.T) {
17+
var i input.State[string]
18+
assert.Equal(t, 0, i.Duration(btn))
19+
})
20+
21+
t.Run("should return 1 when input was pressed and released this frame", func(t *testing.T) {
22+
var i input.State[string]
23+
pi.Frame = 1
24+
i.SetDownFrame(btn, pi.Frame)
25+
i.SetUpFrame(btn, pi.Frame)
26+
assert.Equal(t, 1, i.Duration(btn))
27+
})
28+
29+
t.Run("should return 0 when input was pressed previous frame and released this frame", func(t *testing.T) {
30+
var i input.State[string]
31+
pi.Frame = 0
32+
i.SetDownFrame(btn, pi.Frame)
33+
pi.Frame++
34+
i.SetUpFrame(btn, pi.Frame)
35+
assert.Equal(t, 0, i.Duration(btn))
36+
})
37+
38+
t.Run("should return 2 when input was pressed previous frame but not released this frame", func(t *testing.T) {
39+
var i input.State[string]
40+
pi.Frame = 0
41+
i.SetDownFrame(btn, pi.Frame)
42+
pi.Frame++
43+
assert.Equal(t, 2, i.Duration(btn))
44+
})
45+
46+
t.Run("should return 1 when input was pressed, released and pressed again this frame", func(t *testing.T) {
47+
var i input.State[string]
48+
pi.Frame = 0
49+
i.SetDownFrame(btn, pi.Frame)
50+
i.SetUpFrame(btn, pi.Frame)
51+
i.SetDownFrame(btn, pi.Frame)
52+
assert.Equal(t, 1, i.Duration(btn))
53+
})
54+
55+
t.Run("should return 1 when input was pressed and released previous frame and pressed this frame", func(t *testing.T) {
56+
var i input.State[string]
57+
pi.Frame = 0
58+
i.SetDownFrame(btn, pi.Frame)
59+
i.SetUpFrame(btn, pi.Frame)
60+
pi.Frame++
61+
i.SetDownFrame(btn, pi.Frame)
62+
assert.Equal(t, 1, i.Duration(btn))
63+
})
64+
}

pikey/pikey.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ func init() {
125125
onKey := func(event Event, _ pievent.Handler) {
126126
switch event.Type {
127127
case EventDown:
128-
keyState.SetStartFrame(event.Key, pi.Frame)
128+
keyState.SetDownFrame(event.Key, pi.Frame)
129129
case EventUp:
130-
keyState.SetStopFrame(event.Key, pi.Frame)
130+
keyState.SetUpFrame(event.Key, pi.Frame)
131131
}
132132
}
133133
Target().SubscribeAll(onKey)

pimouse/pimouse.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ func init() {
3636
onButton := func(event EventButton, _ pievent.Handler) {
3737
switch event.Type {
3838
case EventButtonDown:
39-
buttonState.SetStartFrame(event.Button, pi.Frame)
39+
buttonState.SetDownFrame(event.Button, pi.Frame)
4040
case EventButtonUp:
41-
buttonState.SetStopFrame(event.Button, pi.Frame)
41+
buttonState.SetUpFrame(event.Button, pi.Frame)
4242
}
4343
}
4444
buttonTarget.SubscribeAll(onButton)

pipad/pipad.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,11 @@ func onButton(event EventButton, _ pievent.Handler) {
116116

117117
switch event.Type {
118118
case EventDown:
119-
buttonState[event.Player].SetStartFrame(event.Button, pi.Frame)
120-
buttonAnyState.SetStartFrame(event.Button, pi.Frame)
119+
buttonState[event.Player].SetDownFrame(event.Button, pi.Frame)
120+
buttonAnyState.SetDownFrame(event.Button, pi.Frame)
121121
case EventUp:
122-
buttonState[event.Player].SetStopFrame(event.Button, pi.Frame)
123-
buttonAnyState.SetStopFrame(event.Button, pi.Frame)
122+
buttonState[event.Player].SetUpFrame(event.Button, pi.Frame)
123+
buttonAnyState.SetUpFrame(event.Button, pi.Frame)
124124
}
125125
}
126126

0 commit comments

Comments
 (0)