// Fenrir console screen reader. // Copyright (c) 2026 Storm Dragon // SPDX-License-Identifier: GPL-3.0-or-later // // This program is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation, either version 3 of the License, or (at your option) // any later version. // // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for // more details. // // You should have received a copy of the GNU General Public License along with // this program. If not, see . package clipboard import ( "net" "os" "path/filepath" "strings" "syscall" "testing" ) func TestHistoryLimitUnicodeWrappingAndClear(t *testing.T) { history := New_history(2) for _, text := range []string{"old", "é界\nnext", "new"} { if err := history.Add(text); err != nil { t.Fatal(err) } } history.Move(-1) if text, ok := history.Current(); !ok || text != "é界\nnext" || !history.At_last() { t.Fatal(text, ok) } history.Move(1) if text, _ := history.Current(); text != "new" || !history.At_first() { t.Fatal(text) } history.Last() history.First() if text, _ := history.Current(); text != "new" { t.Fatal(text) } for _, text := range []string{string([]byte{0xff}), strings.Repeat("x", MaxBytes+1)} { if err := history.Add(text); err == nil { t.Fatal("unbounded or invalid text accepted") } } history.Clear() if _, ok := history.Current(); ok { t.Fatal("clear retained history") } } func TestDisplaySelectionDoesNotFallThroughAndDiscoversHigherNumbers(t *testing.T) { root := t.TempDir() for _, fixture := range []struct{ configured, current, want string }{{":8", ":7", ":8"}, {"", ":7", ":7"}} { targets, err := Display_candidates(fixture.configured, fixture.current, "/test/auth", root, "/does-not-exist") if err != nil || len(targets) != 1 || targets[0] != (Target{fixture.want, "/test/auth"}) { t.Fatal(targets, err) } } listener, err := net.Listen("unix", filepath.Join(root, "X42")) if err != nil { t.Fatal(err) } defer listener.Close() if err := os.WriteFile(filepath.Join(root, "X3"), nil, 0600); err != nil { t.Fatal(err) } targets, err := Display_candidates("", "", "", root, root) if err != nil || len(targets) != 1 || targets[0].Display != ":42" { t.Fatal(targets, err) } other, err := net.Listen("unix", filepath.Join(root, "X43")) if err != nil { t.Fatal(err) } defer other.Close() if _, err := Display_candidates("", "", "", root, root); err == nil { t.Fatal("silently chose among multiple desktops") } } func TestFileRoundTripBoundsPrivacyAndNonregularInput(t *testing.T) { root := t.TempDir() path := filepath.Join(root, "clipboard") text := "é界\nsecond line\n" if err := write_file(path, text); err != nil { t.Fatal(err) } if got, err := read_file(path); err != nil || got != text { t.Fatal(got, err) } info, err := os.Stat(path) if err != nil || info.Mode().Perm() != 0600 { t.Fatal(info, err) } if err := write_file(path, strings.Repeat("x", MaxBytes+1)); err == nil { t.Fatal("oversize export accepted") } if got, _ := read_file(path); got != text { t.Fatal("failed export changed original") } if err := syscall.Mkfifo(filepath.Join(root, "fifo"), 0600); err != nil { t.Fatal(err) } if _, err := read_file(filepath.Join(root, "fifo")); err == nil { t.Fatal("FIFO accepted") } if err := os.WriteFile(path, []byte{0xff}, 0600); err != nil { t.Fatal(err) } if _, err := read_file(path); err == nil { t.Fatal("invalid UTF-8 imported") } }