135 lines
3.6 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|
|
}
|