diff options
Diffstat (limited to 'gui/internal/model/preview_test.go')
| -rw-r--r-- | gui/internal/model/preview_test.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/gui/internal/model/preview_test.go b/gui/internal/model/preview_test.go index 8c19922..b620a92 100644 --- a/gui/internal/model/preview_test.go +++ b/gui/internal/model/preview_test.go @@ -5,6 +5,7 @@ package model import ( "context" "os" + "os/exec" "path/filepath" "strings" "testing" @@ -96,3 +97,58 @@ func TestPreviewShowsOnlyTheHead(t *testing.T) { t.Error("a cut file does not say it was cut") } } + +// TestPdfPreviewsDoNotMixUp: two PDFs looked at one after the other each +// get their own rendered page. pdftoppm names its file after the page +// number, so previews sharing a directory would collide - one of his ended +// up showing another document's cover. +func TestPdfPreviewsDoNotMixUp(t *testing.T) { + if _, err := exec.LookPath("pdftoppm"); err != nil { + t.Skip("pdftoppm is not installed") + } + if _, err := exec.LookPath("groff"); err != nil { + t.Skip("groff is not installed, so there is nothing to make a PDF with") + } + dir := t.TempDir() + pdf := func(name, text string) string { + p := filepath.Join(dir, name) + f, err := os.Create(p) + if err != nil { + t.Fatal(err) + } + defer f.Close() + cmd := exec.Command("groff", "-Tpdf", "-ms") + cmd.Stdin = strings.NewReader(".TL\n" + text + "\n") + cmd.Stdout = f + if err := cmd.Run(); err != nil { + t.Skipf("groff cannot write a PDF here: %v", err) + } + return p + } + first := pdf("first.pdf", "The first document") + second := pdf("second.pdf", "The second document") + + tmp := t.TempDir() + a := MakePreview(context.Background(), first, tmp) + b := MakePreview(context.Background(), second, tmp) + if a.Kind != PreviewImage || b.Kind != PreviewImage { + t.Fatalf("previews = %+v, %+v", a, b) + } + if a.Image == b.Image { + t.Fatalf("both previews point at %s", a.Image) + } + sameBytes := func(x, y string) bool { + bx, err1 := os.ReadFile(x) + by, err2 := os.ReadFile(y) + return err1 == nil && err2 == nil && string(bx) == string(by) + } + if sameBytes(a.Image, b.Image) { + t.Error("the second preview is a copy of the first page rendered") + } + // The caller is told where to clean up. + for _, p := range []Preview{a, b} { + if p.Dir == "" { + t.Error("a rendered page comes with no directory to remove") + } + } +} |
