-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsilence_test.go
More file actions
163 lines (146 loc) · 3.57 KB
/
silence_test.go
File metadata and controls
163 lines (146 loc) · 3.57 KB
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
package main
import (
"sync/atomic"
"testing"
)
func pttMonitor() *silenceMonitor {
return newSilenceMonitor(&atomic.Bool{})
}
func toggleMonitor() *silenceMonitor {
sc := &atomic.Bool{}
sc.Store(true)
return newSilenceMonitor(sc)
}
func feedN(m *silenceMonitor, speech bool, n int) SilenceEvent {
var last SilenceEvent
for i := 0; i < n; i++ {
last = m.Tick(speech)
}
return last
}
func TestSilenceWarnAfter8s(t *testing.T) {
m := pttMonitor()
// 79 ticks of silence — no warning yet
for i := 0; i < 79; i++ {
if ev := m.Tick(false); ev != SilenceNone {
t.Fatalf("unexpected event at tick %d: %d", i, ev)
}
}
// 80th tick triggers warning (8s)
if ev := m.Tick(false); ev != SilenceWarn {
t.Fatalf("expected SilenceWarn at tick 80, got %d", ev)
}
}
func TestSilenceWarnClearsOnSpeech(t *testing.T) {
m := pttMonitor()
feedN(m, false, 80) // triggers warn
// Sustained speech clears warning (need 25% of 80-tick window)
for i := 0; i < 80; i++ {
ev := m.Tick(true)
if ev == SilenceWarnClear {
return
}
}
t.Fatal("expected SilenceWarnClear after speech")
}
func TestNoWarnDuringSpeech(t *testing.T) {
m := pttMonitor()
for i := 0; i < 200; i++ {
if ev := m.Tick(true); ev == SilenceWarn {
t.Fatalf("unexpected warn during speech at tick %d", i)
}
}
}
func TestToggleRepeatBeep(t *testing.T) {
m := toggleMonitor()
feedN(m, false, 80) // warn at tick 80
// Next repeat at tick 80 + 80 = 160
var gotRepeat bool
for i := 0; i < 100; i++ {
if ev := m.Tick(false); ev == SilenceRepeat {
gotRepeat = true
break
}
}
if !gotRepeat {
t.Fatal("expected SilenceRepeat in toggle mode")
}
}
func TestAutoClosePriorityOverRepeat(t *testing.T) {
m := toggleMonitor()
for i := 0; i < 400; i++ {
ev := m.Tick(false)
if ev == SilenceAutoClose {
return
}
if i >= 300 && ev == SilenceRepeat {
t.Fatalf("SilenceRepeat fired at tick %d instead of SilenceAutoClose", i)
}
}
t.Fatal("expected SilenceAutoClose within 400 ticks")
}
func TestToggleAutoClose(t *testing.T) {
m := toggleMonitor()
var gotClose bool
for i := 0; i < 400; i++ {
if ev := m.Tick(false); ev == SilenceAutoClose {
gotClose = true
break
}
}
if !gotClose {
t.Fatal("expected SilenceAutoClose after 300 ticks")
}
}
func TestNoAutoCloseInPTT(t *testing.T) {
m := pttMonitor()
for i := 0; i < 400; i++ {
if ev := m.Tick(false); ev == SilenceAutoClose {
t.Fatalf("unexpected auto-close in PTT mode at tick %d", i)
}
}
}
func TestAutoClosePreventedBySpeech(t *testing.T) {
m := toggleMonitor()
for i := 0; i < 500; i++ {
speech := i%10 < 7
if ev := m.Tick(speech); ev == SilenceAutoClose {
t.Fatalf("unexpected auto-close with speech at tick %d", i)
}
}
}
func TestNoRepeatInPTT(t *testing.T) {
m := pttMonitor()
for i := 0; i < 300; i++ {
if ev := m.Tick(false); ev == SilenceRepeat {
t.Fatalf("unexpected SilenceRepeat in PTT mode at tick %d", i)
}
}
}
func TestWarnOnlyOnce(t *testing.T) {
m := pttMonitor()
warns := 0
for i := 0; i < 300; i++ {
if ev := m.Tick(false); ev == SilenceWarn {
warns++
}
}
if warns != 1 {
t.Fatalf("expected exactly 1 SilenceWarn in PTT mode, got %d", warns)
}
}
func TestWarnStaysDuringNoise(t *testing.T) {
m := pttMonitor()
feedN(m, false, 80) // triggers warn
// Occasional VAD false positives (< 25% speech) should NOT clear
clears := 0
for i := 0; i < 80; i++ {
speech := i%10 == 0 // 10% speech — below clear threshold
if ev := m.Tick(speech); ev == SilenceWarnClear {
clears++
}
}
if clears > 0 {
t.Fatalf("expected warning to stay with 10%% speech, got %d clears", clears)
}
}