package pdfinfo import ( "fmt" "strings" "testing" ) // fakePDF builds a minimal but structurally scannable PDF with a page-tree // /Count and N /Type /Page objects. func fakePDF(pages, declared int) []byte { var objs []string for i := 1; i <= pages; i++ { objs = append(objs, fmt.Sprintf("%d 0 obj<>endobj", i)) } objs = append(objs, fmt.Sprintf("99 0 obj<>endobj", declared)) body := strings.Join(objs, "\n") return []byte("%PDF-1.7\n" + body + "\n%%EOF") } func TestPagesCount(t *testing.T) { for _, n := range []int{1, 2, 7, 23} { got, err := Pages(fakePDF(n, n)) if err != nil { t.Fatalf("n=%d: %v", n, err) } if got != n { t.Fatalf("n=%d got %d", n, got) } } } func TestPagesFallsBackToPageObjects(t *testing.T) { // No /Pages /Count reachable: count /Type /Page objects instead. pdf := []byte("%PDF-1.7\n1 0 obj<>endobj\n2 0 obj<>endobj\n%%EOF") got, err := Pages(pdf) if err != nil || got != 2 { t.Fatalf("got=%d err=%v", got, err) } } func TestPagesRejectsNonPDF(t *testing.T) { if _, err := Pages([]byte("hello")); err == nil { t.Fatal("want error for non-PDF") } if _, err := Pages(nil); err == nil { t.Fatal("want error for empty input") } } func TestPagesDoesNotCountPagesType(t *testing.T) { // "/Type /Pages" must not match the /Type /Page fallback. pdf := []byte("%PDF-1.7\n1 0 obj<>endobj\n2 0 obj<>endobj\n%%EOF") got, err := Pages(pdf) if err != nil || got != 5 { t.Fatalf("got=%d err=%v", got, err) } }