evcc-io/meter/usage_battery_test.go

116 lines
2.3 KiB
Go

package meter
import (
"context"
"testing"
"github.com/evcc-io/evcc/util"
"github.com/stretchr/testify/require"
)
func TestBatteryCapacity(t *testing.T) {
ctx := context.TODO()
// static value
{
var cc batteryCapacityCtx
require.NoError(t, util.DecodeOther(map[string]any{"capacity": 10}, &cc))
g, err := cc.Decorator(ctx)
require.NoError(t, err)
require.NotNil(t, g)
require.Equal(t, 10.0, g())
}
// zero value is treated as not configured
{
var cc batteryCapacityCtx
require.NoError(t, util.DecodeOther(map[string]any{"capacity": 0}, &cc))
g, err := cc.Decorator(ctx)
require.NoError(t, err)
require.Nil(t, g)
}
// unset is not configured
{
var cc batteryCapacityCtx
g, err := cc.Decorator(ctx)
require.NoError(t, err)
require.Nil(t, g)
}
// float plugin
{
var cc batteryCapacityCtx
require.NoError(t, util.DecodeOther(map[string]any{
"capacity": map[string]any{
"source": "const",
"value": "12.5",
},
}, &cc))
g, err := cc.Decorator(ctx)
require.NoError(t, err)
require.NotNil(t, g)
require.Equal(t, 12.5, g())
}
}
func TestBatterySocLimits(t *testing.T) {
other := map[string]any{
"minsoc": 1,
"maxsoc": 99,
}
expected := batterySocLimits{
MinSoc: 1,
MaxSoc: 99,
}
{
var res batterySocLimits
require.NoError(t, util.DecodeOther(other, &res))
require.Equal(t, expected, res)
}
{
var res struct {
batterySocLimits `mapstructure:",squash"`
}
require.NoError(t, util.DecodeOther(other, &res))
require.Equal(t, expected, res.batterySocLimits)
}
{
var res struct {
BatterySocLimits batterySocLimits `mapstructure:",squash"`
}
require.NoError(t, util.DecodeOther(other, &res))
require.Equal(t, expected, res.BatterySocLimits)
}
{
res := struct {
batterySocLimits `mapstructure:",squash"`
}{
batterySocLimits: batterySocLimits{
MinSoc: 20,
MaxSoc: 95,
},
}
require.NoError(t, util.DecodeOther(other, &res))
require.Equal(t, expected, res.batterySocLimits)
}
{
res := struct {
pvMaxACPower `mapstructure:",squash"`
batterySocLimits `mapstructure:",squash"`
}{
batterySocLimits: batterySocLimits{
MinSoc: 20,
MaxSoc: 95,
},
}
require.NoError(t, util.DecodeOther(other, &res))
require.Equal(t, expected, res.batterySocLimits)
}
}