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) } }) } }