package status import ( "reflect" "testing" ) func TestEvaluate(t *testing.T) { valid := func(power float64) Sample { return Sample{Power: power, Valid: true} } for _, tt := range []struct { name string samples []Sample state string message string }{ {"no samples", nil, "waiting", "Waiting for data..."}, {"one sample", []Sample{valid(10)}, "waiting", "Waiting for data..."}, {"two samples with gap", []Sample{valid(10), {}}, "waiting", "Waiting for data..."}, {"all zero", []Sample{valid(0), valid(0), valid(0)}, "done", "Laundry done"}, {"below threshold", []Sample{valid(2.99), valid(2.99), valid(2.99)}, "done", "Laundry done"}, {"at threshold", []Sample{valid(0), valid(3), valid(0)}, "running", "Laundry not yet done"}, {"mixed", []Sample{valid(47.7), valid(0), valid(2.99)}, "running", "Laundry not yet done"}, {"gap overrides active", []Sample{valid(47.7), {}, valid(0)}, "incomplete", "Incomplete data"}, {"all missing", []Sample{{}, {}, {}}, "incomplete", "Incomplete data"}, } { t.Run(tt.name, func(t *testing.T) { got := Evaluate(tt.samples) if got.State != tt.state || got.Message != tt.message { t.Fatalf("Evaluate() = %q, %q; want %q, %q", got.State, got.Message, tt.state, tt.message) } if len(got.Readings) != len(tt.samples) || got.Readings == nil { t.Fatalf("readings = %#v; want non-nil slice of length %d", got.Readings, len(tt.samples)) } for i, sample := range tt.samples { if got.Readings[i] != sample { t.Errorf("readings[%d] = %+v; want %+v", i, got.Readings[i], sample) } } }) } } func TestWindowKeepsLastThreeOldestFirst(t *testing.T) { var window Window if got := window.Readings(); len(got) != 0 { t.Fatalf("new window = %v", got) } for i := range 7 { window.Add(Sample{Power: float64(i), Valid: true}) } want := []Sample{{Power: 4, Valid: true}, {Power: 5, Valid: true}, {Power: 6, Valid: true}} if got := window.Readings(); !reflect.DeepEqual(got, want) { t.Fatalf("Readings() = %v; want %v", got, want) } snapshot := window.Readings() snapshot[0].Power = 999 if got := window.Readings(); !reflect.DeepEqual(got, want) { t.Fatal("mutating a snapshot changed the window") } for range 3 { window.Add(Sample{Valid: true}) } if got := Evaluate(window.Readings()); got.State != "done" { t.Fatalf("old active samples did not age out: %+v", got) } window.Add(Sample{}) if got := Evaluate(window.Readings()); got.State != "incomplete" { t.Fatalf("missing sample was not recorded: %+v", got) } }