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("author.bib") defer f.Close() db, err := Parse(f, false) if err != nil { log.Print(err) } for _, entry := range db.Entries { lines := strings.Split(bibtex("author", "names", entry.Key), "\n") names := SplitNames(entry.Fields["author"].String()) 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("%s, expected: %d, actual: %d", test.s, test.expected, actual) } } } func TestIsLower(t *testing.T) { tests := []struct { s string expected bool }{ {"", false}, {"abc", true}, {"Abc", false}, {"a{bc}", true}, {"A{bc}", false}, {"{a}A", false}, {"{A}a", true}, {"{\\i B}A", true}, {"{\\AA a}a", false}, {"{abc}A", false}, {"{Abc}a", true}, } for _, test := range tests { actual := isLower(test.s) if test.expected != actual { t.Errorf("%s, expected: %t, actual: %t", test.s, test.expected, actual) } } } func TestUnTex(t *testing.T) { tests := []struct { s string expected string }{ {"\\' a\\OE{\\c {cd}}\\&{\\emph{test}}", "áŒç&test"}, } for _, test := range tests { actual := UnTex(test.s) if test.expected != actual { t.Errorf("%q, expected: %q, actual: %q", test.s, test.expected, actual) } } }