@@ -8,9 +8,10 @@ import (
88 "github.com/evcc-io/evcc/util"
99 "github.com/evcc-io/evcc/util/config"
1010 "github.com/stretchr/testify/assert"
11+ "go.uber.org/mock/gomock"
1112)
1213
13- func TestExternalBatteryMode (t * testing.T ) {
14+ func TestRequiredExternalBatteryMode (t * testing.T ) {
1415 for _ , tc := range []struct {
1516 internal , ext , new api.BatteryMode
1617 }{
@@ -19,12 +20,12 @@ func TestExternalBatteryMode(t *testing.T) {
1920 {api .BatteryUnknown , api .BatteryCharge , api .BatteryCharge },
2021
2122 {api .BatteryNormal , api .BatteryUnknown , api .BatteryUnknown },
22- {api .BatteryNormal , api .BatteryNormal , api .BatteryNormal },
23+ {api .BatteryNormal , api .BatteryNormal , api .BatteryUnknown }, // no change required
2324 {api .BatteryNormal , api .BatteryCharge , api .BatteryCharge },
2425
2526 {api .BatteryCharge , api .BatteryUnknown , api .BatteryNormal },
2627 {api .BatteryCharge , api .BatteryNormal , api .BatteryNormal },
27- {api .BatteryCharge , api .BatteryCharge , api .BatteryCharge },
28+ {api .BatteryCharge , api .BatteryCharge , api .BatteryUnknown }, // no change required
2829 } {
2930 t .Logf ("%+v" , tc )
3031
@@ -42,8 +43,20 @@ func TestExternalBatteryMode(t *testing.T) {
4243}
4344
4445func TestExternalBatteryModeChange (t * testing.T ) {
46+ ctrl := gomock .NewController (t )
47+
48+ var bat api.Meter
49+ batCon := api .NewMockBatteryController (ctrl )
50+
51+ bat = & struct {
52+ api.Meter
53+ api.BatteryController
54+ }{
55+ BatteryController : batCon ,
56+ }
57+
4558 for _ , tc := range []struct {
46- internal , ext , expired api.BatteryMode
59+ internal , ext , expected api.BatteryMode
4760 }{
4861 {api .BatteryUnknown , api .BatteryUnknown , api .BatteryNormal },
4962 {api .BatteryUnknown , api .BatteryNormal , api .BatteryNormal },
@@ -61,32 +74,44 @@ func TestExternalBatteryModeChange(t *testing.T) {
6174
6275 site := & Site {
6376 log : util .NewLogger ("foo" ),
64- batteryMeters : []config.Device [api.Meter ]{nil },
77+ batteryMeters : []config.Device [api.Meter ]{config . NewStaticDevice (config. Named {}, bat ) },
6578 }
6679
80+ // set initial state, internal mode may already be changed
6781 site .batteryMode = tc .internal
68-
82+ site . batteryModeExternal = api . BatteryUnknown
6983 assert .True (t , site .batteryModeExternalTimer .IsZero ())
84+
85+ // 1. set required external mode
7086 site .SetBatteryModeExternal (tc .ext )
87+ assert .Equal (t , site .batteryModeExternal , tc .ext , "external mode expected %s got %s" , tc .ext , site .batteryModeExternal )
88+ assert .Equal (t , site .batteryMode , tc .internal , "internal mode expected unchanged %s got %s" , tc .ext , site .batteryMode )
7189
72- // timer started
90+ // 2. verify external mode applied to battery
7391 if tc .ext != api .BatteryUnknown {
74- assert . False ( t , site . batteryModeExternalTimer . IsZero () )
92+ batCon . EXPECT (). SetBatteryMode ( tc . ext ). Times ( 1 )
7593 }
94+ site .updateBatteryMode (false , api.Rate {})
95+ ctrl .Finish ()
7696
77- // expire timer
97+ // 3. verify required external mode only applied once
98+ site .updateBatteryMode (false , api.Rate {})
99+ ctrl .Finish ()
100+
101+ // 4. verify timer expiry
78102 site .batteryModeExternalTimer = site .batteryModeExternalTimer .Add (- time .Hour )
79103 site .batteryModeWatchdogExpired ()
80104
81105 // mode reverted to unknown, timer still active
82106 assert .Equal (t , site .batteryModeExternal , api .BatteryUnknown )
83107 assert .False (t , site .batteryModeExternalTimer .IsZero ())
84108
85- mode := site .requiredBatteryMode (false , api.Rate {})
86- assert .Equal (t , tc .expired .String (), mode .String (), "external mode expected %s got %s" , tc .expired , mode )
109+ // battery switched back to normal mode
110+ batCon .EXPECT ().SetBatteryMode (api .BatteryNormal ).Times (1 )
111+ site .updateBatteryMode (false , api.Rate {})
112+ ctrl .Finish ()
87113
88114 // timer disabled
89- site .SetBatteryMode (mode )
90115 assert .True (t , site .batteryModeExternalTimer .IsZero ())
91116 }
92117}
0 commit comments