Skip to content

Commit b50e922

Browse files
committed
fix(battery): render a detected battery at 0% instead of disabling the segment
Enabled() treated err == nil && Percentage == 0 as a "no battery" sentinel, but every platform backend already signals "no battery" through a dedicated error (NoBatteryError/ErrNotFound) before that point is reached. A present battery genuinely reporting 0% charge was therefore hidden instead of rendered. Also guard against a nil Info dereference on the display_error path, where BatteryState() returns (nil, err) for any non-NoBatteryError. Fixes #7782
1 parent e702471 commit b50e922

2 files changed

Lines changed: 85 additions & 5 deletions

File tree

src/segments/battery.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,8 @@ func (b *Battery) Enabled() bool {
3535
return false
3636
}
3737

38-
b.Info = *info
39-
40-
// case on computer without batteries(no error, empty array)
41-
if err == nil && b.Percentage == 0 {
42-
return false
38+
if info != nil {
39+
b.Info = *info
4340
}
4441

4542
switch b.State {

src/segments/battery_test.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package segments
2+
3+
import (
4+
"errors"
5+
"testing"
6+
7+
"github.com/jandedobbeleer/oh-my-posh/src/runtime/battery"
8+
"github.com/jandedobbeleer/oh-my-posh/src/runtime/mock"
9+
"github.com/jandedobbeleer/oh-my-posh/src/segments/options"
10+
11+
"github.com/stretchr/testify/assert"
12+
)
13+
14+
func TestBatteryEnabled(t *testing.T) {
15+
cases := []struct {
16+
Case string
17+
Info *battery.Info
18+
Error error
19+
DisplayError bool
20+
ExpectedEnabled bool
21+
Expected string
22+
}{
23+
{
24+
Case: "detected battery at 0%",
25+
Info: &battery.Info{Percentage: 0, State: battery.NotCharging},
26+
ExpectedEnabled: true,
27+
Expected: "0",
28+
},
29+
{
30+
Case: "discharging",
31+
Info: &battery.Info{Percentage: 42, State: battery.Discharging},
32+
ExpectedEnabled: true,
33+
Expected: "42",
34+
},
35+
{
36+
Case: "full",
37+
Info: &battery.Info{Percentage: 100, State: battery.Full},
38+
ExpectedEnabled: true,
39+
Expected: "100",
40+
},
41+
{
42+
Case: "no battery present",
43+
Info: nil,
44+
Error: &battery.NoBatteryError{},
45+
ExpectedEnabled: false,
46+
},
47+
{
48+
Case: "retrieval error, display_error disabled",
49+
Info: nil,
50+
Error: errors.New("boom"),
51+
ExpectedEnabled: false,
52+
},
53+
{
54+
Case: "retrieval error, display_error enabled",
55+
Info: nil,
56+
Error: errors.New("boom"),
57+
DisplayError: true,
58+
ExpectedEnabled: true,
59+
Expected: "boom",
60+
},
61+
}
62+
63+
for _, tc := range cases {
64+
env := new(mock.Environment)
65+
env.On("IsWsl").Return(false)
66+
env.On("BatteryState").Return(tc.Info, tc.Error)
67+
68+
props := options.Map{}
69+
if tc.DisplayError {
70+
props[options.DisplayError] = true
71+
}
72+
73+
b := &Battery{}
74+
b.Init(props, env)
75+
76+
got := b.Enabled()
77+
78+
assert.Equal(t, tc.ExpectedEnabled, got, tc.Case)
79+
if tc.ExpectedEnabled {
80+
assert.Equal(t, tc.Expected, renderTemplate(env, b.Template(), b), tc.Case)
81+
}
82+
}
83+
}

0 commit comments

Comments
 (0)