package bibtex import ( "io/ioutil" "log" "os" "os/exec" "strings" "testing" "text/template" ) func bibtex(bib string, style string, entry string) string { f, err := os.Create("test.aux") if err != nil { log.Print(err) } defer f.Close() tpl := ` \relax \citation{[.Entry]} \bibstyle{[.Style]} \bibdata{[.Bib]}` type params struct { Entry string Style string Bib string } t := template.New("") t.Delims("[", "]") t = template.Must(t.Parse(tpl)) err = t.Execute(f, params{entry, style, bib}) if err != nil { log.Print(err) } exec.Command("bibtex", "test").Output() in, _ := ioutil.ReadFile("test.bbl") return string(in) } func TestName(t *testing.T) { os.Chdir("testdata") f, _ := os.Open("parsing.bib") defer f.Close() parser := NewParser(f) err := parser.Parse(false) if err != nil { log.Print(err) } for _, entry := range parser.entries { lines := strings.Split(bibtex("parsing", "names", entry.key), "\n") names := SplitNames(entry.fields["author"]) i := 0 var s string for _, name := range names { s = name.Format("{ff}|{vv}|{ll}|{jj}") if lines[i] != s { t.Errorf("Expected: %q, actual: %q", lines[i], s) } i += 1 s = name.Format("{f}|{v}|{l}|{j}") if lines[i] != s { t.Errorf("Expected: %q, actual: %q", lines[i], s) } i += 1 s = name.Format("{ff~}{vv~}{ll}{, jj}") if lines[i] != s { t.Errorf("Expected: %q, actual: %q", lines[i], s) } i += 1 s = name.Format("{f~}{vv~}{ll}{, jj}") if lines[i] != s { t.Errorf("Expected: %q, actual: %q", lines[i], s) } i += 1 } } } func TestLength(t *testing.T) { tests := []struct { s string expected int }{ {"", 0}, {"a", 1}, {"{ab}", 4}, {"{\\abc}", 1}, {"{ab{c}}a{\\a{bc}}a", 10}, } for _, test := range tests { actual := length(test.s) if test.expected != actual { t.Errorf("Expected: %d, actual: %d", test.expected, actual) } } }