Files
lingniu-vehicle-ingest/go/vehicle-gateway/internal/stats/pure_hydrogen_test.go
2026-07-27 16:46:15 +08:00

135 lines
3.6 KiB
Go

package stats
import (
"encoding/json"
"testing"
"lingniu-vehicle-ingest/go/vehicle-gateway/internal/envelope"
)
func TestPureHydrogenModeFromEnvelope(t *testing.T) {
tests := []struct {
name string
env envelope.FrameEnvelope
active bool
known bool
}{
{
name: "gb32960 fuel cell mode",
env: envelope.FrameEnvelope{Protocol: envelope.ProtocolGB32960, Fields: map[string]any{envelope.FieldFuelCellWorkMode: 2}},
active: true,
known: true,
},
{
name: "gb32960 electric mode",
env: envelope.FrameEnvelope{Protocol: envelope.ProtocolGB32960, Fields: map[string]any{envelope.FieldFuelCellWorkMode: 1}},
known: true,
},
{
name: "yutong active mode",
env: envelope.FrameEnvelope{Protocol: envelope.ProtocolYutongMQTT, Fields: map[string]any{envelope.FieldFuelCellWorkMode: json.Number("4")}},
active: true,
known: true,
},
{
name: "yutong driving mode",
env: envelope.FrameEnvelope{Protocol: envelope.ProtocolYutongMQTT, Fields: map[string]any{envelope.FieldFuelCellWorkMode: "11"}},
active: true,
known: true,
},
{
name: "yutong inactive mode",
env: envelope.FrameEnvelope{Protocol: envelope.ProtocolYutongMQTT, Fields: map[string]any{envelope.FieldFuelCellWorkMode: float64(1)}},
known: true,
},
{
name: "unknown yutong mode",
env: envelope.FrameEnvelope{Protocol: envelope.ProtocolYutongMQTT, Fields: map[string]any{envelope.FieldFuelCellWorkMode: 9}},
},
{
name: "unsupported protocol",
env: envelope.FrameEnvelope{Protocol: envelope.ProtocolJT808, Fields: map[string]any{envelope.FieldFuelCellWorkMode: 3}},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
active, known := PureHydrogenModeFromEnvelope(test.env)
if active != test.active || known != test.known {
t.Fatalf("PureHydrogenModeFromEnvelope() = (%v, %v), want (%v, %v)", active, known, test.active, test.known)
}
})
}
}
func TestPureHydrogenMileageDeltaRequiresContinuousKnownActiveMode(t *testing.T) {
tests := []struct {
name string
previousKM, currentKM float64
previousActive, previousKnown bool
currentActive, currentKnown bool
want float64
}{
{
name: "continuous active interval",
previousKM: 100,
currentKM: 106.5,
previousActive: true,
previousKnown: true,
currentActive: true,
currentKnown: true,
want: 6.5,
},
{
name: "transition into active is unclassified",
previousKM: 100,
currentKM: 106.5,
previousKnown: true,
currentActive: true,
currentKnown: true,
},
{
name: "unknown endpoint is unclassified",
previousKM: 100,
currentKM: 106.5,
previousActive: true,
previousKnown: true,
currentActive: true,
},
{
name: "odometer rollback is rejected",
previousKM: 106.5,
currentKM: 100,
previousActive: true,
previousKnown: true,
currentActive: true,
currentKnown: true,
},
{
name: "implausible jump is rejected",
previousKM: 100,
currentKM: 2601,
previousActive: true,
previousKnown: true,
currentActive: true,
currentKnown: true,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
got := PureHydrogenMileageDelta(
test.previousKM,
test.currentKM,
test.previousActive,
test.previousKnown,
test.currentActive,
test.currentKnown,
)
if got != test.want {
t.Fatalf("PureHydrogenMileageDelta() = %v, want %v", got, test.want)
}
})
}
}