go-org-orgwiki/org/org_writer_test.go
Donald Hunter 83bde78a85 Add diff to error report when tests fail
Signed-off-by: Donald Hunter <donald.hunter@gmail.com>
2024-05-28 23:10:02 +01:00

89 lines
2.1 KiB
Go

package org
import (
"fmt"
"io/ioutil"
"path/filepath"
"strings"
"testing"
"github.com/pmezard/go-difflib/difflib"
)
type ExtendedOrgWriter struct {
*OrgWriter
callCount int
}
func (w *ExtendedOrgWriter) WriteText(t Text) {
w.callCount++
w.OrgWriter.WriteText(t)
}
func TestOrgWriter(t *testing.T) {
testWriter(t, func() Writer { return NewOrgWriter() }, ".pretty_org")
}
func TestExtendedOrgWriter(t *testing.T) {
p := Paragraph{Children: []Node{Text{Content: "text"}, Text{Content: "more text"}}}
orgWriter := NewOrgWriter()
extendedWriter := &ExtendedOrgWriter{orgWriter, 0}
orgWriter.ExtendingWriter = extendedWriter
WriteNodes(extendedWriter, p)
if extendedWriter.callCount != 2 {
t.Errorf("WriteText method of extending writer was not called: CallCount %d", extendedWriter.callCount)
}
}
func testWriter(t *testing.T, newWriter func() Writer, ext string) {
for _, path := range orgTestFiles() {
tmpPath := path[:len(path)-len(".org")]
t.Run(filepath.Base(tmpPath), func(t *testing.T) {
expected := fileString(t, tmpPath+ext)
reader := strings.NewReader(fileString(t, path))
actual, err := New().Silent().Parse(reader, path).Write(newWriter())
if err != nil {
t.Fatalf("%s\n got error: %s", path, err)
} else if actual != expected {
t.Fatalf("%s:\n%s'", path, diff(actual, expected))
}
})
}
}
func orgTestFiles() []string {
dir := "./testdata"
files, err := ioutil.ReadDir(dir)
if err != nil {
panic(fmt.Sprintf("Could not read directory: %s", err))
}
orgFiles := []string{}
for _, f := range files {
name := f.Name()
if filepath.Ext(name) != ".org" {
continue
}
orgFiles = append(orgFiles, filepath.Join(dir, name))
}
return orgFiles
}
func fileString(t *testing.T, path string) string {
bs, err := ioutil.ReadFile(path)
if err != nil {
t.Fatalf("Could not read file %s: %s", path, err)
}
return string(bs)
}
func diff(actual, expected string) string {
diff := difflib.UnifiedDiff{
A: difflib.SplitLines(actual),
B: difflib.SplitLines(expected),
FromFile: "Actual",
ToFile: "Expected",
Context: 3,
}
text, _ := difflib.GetUnifiedDiffString(diff)
return text
}