// Copyright (c) 2026 Storm Dragon // Authors: Storm Dragon, Angus Kola // SPDX-License-Identifier: GPL-3.0-or-later package speech import ( "context" "testing" "time" ) func TestReadDefaults(t *testing.T) { path, server := newSettingsServer(t, func(command string) string { switch command { case "GET RATE": return "200-20\r\n200 OK\r\n" case "GET PITCH": return "200--10\r\n200 OK\r\n" case "GET VOLUME": return "200-100\r\n200 OK\r\n" } return "" }) defaults, err := ReadDefaults(t.Context(), path) if err != nil || defaults.Rate == nil || *defaults.Rate != 20 || defaults.Pitch == nil || *defaults.Pitch != -10 || defaults.Volume == nil || *defaults.Volume != 100 { t.Fatalf("defaults=%+v, err=%v", defaults, err) } for _, command := range []string{"SET SELF RATE 20", "SET SELF PITCH -10", "SET SELF VOLUME 100", "SPEAK"} { if server.saw(1, command) { t.Fatalf("query changed speech: %s", command) } } } func TestReadDefaultsRejectsUnsupportedAndInvalidValues(t *testing.T) { for _, response := range []string{"500 UNSUPPORTED\r\n", "200 OK\r\n", "200-invalid\r\n200 OK\r\n", "200-101\r\n200 OK\r\n", "200-0\r\n200-1\r\n200 OK\r\n"} { t.Run(response, func(t *testing.T) { path, _ := newSettingsServer(t, func(string) string { return response }) defaults, err := ReadDefaults(t.Context(), path) if err != nil || defaults.Rate != nil || defaults.Pitch != nil || defaults.Volume != nil { t.Fatalf("invalid defaults=%+v, err=%v", defaults, err) } }) } } func TestReadDefaultsRetainsPartialValuesAndHonorsDeadline(t *testing.T) { path, _ := newSettingsServer(t, func(command string) string { if command == "GET RATE" { return "200-0\r\n200 OK\r\n" } if command == "GET PITCH" { return "200-unfinished\r\n" } return "" }) ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) defer cancel() defaults, err := ReadDefaults(ctx, path) if err == nil || defaults.Rate == nil || *defaults.Rate != 0 || defaults.Pitch != nil || defaults.Volume != nil { t.Fatalf("partial defaults=%+v, err=%v", defaults, err) } }