Files
lingniu-vehicle-ingest/vehicle-data-platform/apps/api/internal/openplatform/statistics_test.go
2026-07-27 16:46:15 +08:00

80 lines
3.0 KiB
Go

package openplatform
import (
"testing"
"time"
)
func TestBuildHydrogenDailyStatsSumsDropsAndIgnoresRefuelAndNoise(t *testing.T) {
base := time.Date(2026, 7, 1, 0, 0, 0, 0, time.UTC)
stats := BuildHydrogenDailyStats([]HydrogenObservation{
{VIN: "LTEST32960VIN0001", ObservedAt: base.Add(3 * time.Hour), MassKg: 10.00},
{VIN: "LTEST32960VIN0001", ObservedAt: base, MassKg: 10.50},
{VIN: "LTEST32960VIN0001", ObservedAt: base.Add(time.Hour), MassKg: 10.30},
{VIN: "LTEST32960VIN0001", ObservedAt: base.Add(2 * time.Hour), MassKg: 11.90},
{VIN: "LTEST32960VIN0001", ObservedAt: base.Add(4 * time.Hour), MassKg: 9.98},
}, "2026-07-01", 0.05, 5)
if len(stats) != 1 {
t.Fatalf("stats = %#v", stats)
}
stat := stats[0]
if stat.ConsumptionKg != 2.1 || stat.RefuelCount != 1 || stat.SampleCount != 5 || stat.QualityStatus != "OK" {
t.Fatalf("stat = %#v", stat)
}
}
func TestBuildHydrogenDailyStatsMarksLargeDropSuspect(t *testing.T) {
base := time.Now()
stats := BuildHydrogenDailyStats([]HydrogenObservation{
{VIN: "LTEST32960VIN0001", ObservedAt: base, MassKg: 20},
{VIN: "LTEST32960VIN0001", ObservedAt: base.Add(time.Minute), MassKg: 1},
}, "2026-07-01", 0.05, 5)
if len(stats) != 1 || stats[0].QualityStatus != "SUSPECT" || stats[0].ConsumptionKg != 0 {
t.Fatalf("stats = %#v", stats)
}
}
func TestBuildHydrogenDailyStatsDoesNotMixSources(t *testing.T) {
base := time.Now()
stats := BuildHydrogenDailyStats([]HydrogenObservation{
{VIN: "LTEST32960VIN0001", Source: "source-a", ObservedAt: base, MassKg: 10},
{VIN: "LTEST32960VIN0001", Source: "source-a", ObservedAt: base.Add(2 * time.Minute), MassKg: 9.8},
{VIN: "LTEST32960VIN0001", Source: "source-a", ObservedAt: base.Add(4 * time.Minute), MassKg: 9.6},
{VIN: "LTEST32960VIN0001", Source: "source-b", ObservedAt: base.Add(time.Minute), MassKg: 20},
{VIN: "LTEST32960VIN0001", Source: "source-b", ObservedAt: base.Add(3 * time.Minute), MassKg: 19.9},
}, "2026-07-01", 0.05, 5)
if len(stats) != 1 {
t.Fatalf("stats = %#v", stats)
}
if stats[0].Source != "source-a" || stats[0].ConsumptionKg != 0.4 || stats[0].SampleCount != 3 {
t.Fatalf("stat = %#v", stats[0])
}
}
func TestExtractHydrogenMassSupportsCanonicalStringAndNumber(t *testing.T) {
for _, encoded := range []string{
`{"gb32960.gd_fc_vehicle_info.hydrogen_mass_kg":"12.3"}`,
`{"gb32960.gd_fc_vehicle_info.hydrogen_mass_kg":12.3}`,
} {
value, ok := ExtractHydrogenMass(encoded)
if !ok || value != 12.3 {
t.Fatalf("value=%v ok=%v for %s", value, ok, encoded)
}
}
}
func TestPressureHydrogenMassMatchesGuangdongVehicle(t *testing.T) {
mass, ok := PressureHydrogenMassKg(16.4, 34, 380)
if !ok || mass < 4.47 || mass > 4.49 {
t.Fatalf("mass=%.3f ok=%v", mass, ok)
}
pressure, temperature, ok := ExtractHydrogenPressureTemperature(`{
"gb32960.fuel_cell.max_hydrogen_pressure_mpa":"16.4",
"gb32960.fuel_cell.max_hydrogen_temperature_c":34,
"gb32960.gd_fc_vehicle_info.hydrogen_mass_kg":99.9
}`)
if !ok || pressure != 16.4 || temperature != 34 {
t.Fatalf("pressure=%v temperature=%v ok=%v", pressure, temperature, ok)
}
}