Entry implements TextUnmarshaler

This commit is contained in:
Dan Jones 2024-01-28 17:39:42 -06:00
commit c45acd57c4
2 changed files with 112 additions and 5 deletions

View file

@ -1,9 +1,10 @@
package models
import (
"bufio"
"encoding"
"encoding/json"
"errors"
"strings"
"testing"
"time"
@ -101,9 +102,12 @@ func TestEntryUnmarshal(t *testing.T) {
err error
}{
{"one-line", "@begin " + whens + " - A Title @end", "A Title", when, simple, nil},
{"rfc3999-date", "@begin " + when.Format(time.RFC3339) + " - A Title @end", "A Title", when, simple, nil},
{"multi-title", "@begin " + whens + " - A Title\nwith break @end", "A Title\nwith break", when, simple, nil},
{"no-title", "@begin " + whens + " - @end", "", when, simple, errors.New("Missing title")},
{"no-date", "@begin - A Title @end", "A Title", when, simple, errors.New("Missing date")},
{"no-title", "@begin " + whens + " - @end", "", when, simple, ErrorMissingTitle},
{"parse-error", "this is no good", "", when, simple, ErrorParsing},
{"no-date", "@begin - A Title @end", "A Title", when, simple, ErrorMissingDate},
{"bad-date", "@begin not-a-real date - A Title @end", "A Title", when, simple, ErrorParsing},
{"one-field", "@begin " + whens + " - A Title\n@age 41 @end", "A Title", when, []Meta{{"age", 41}}, nil},
{
"two-fields",
@ -142,8 +146,8 @@ func getEntryUnmarshalTestRunner(in string, title string, date time.Time, fields
return func(t *testing.T) {
e := &Entry{}
er := e.UnmarshalText([]byte(in))
assert.Equal(t, err, er)
if err != nil {
assert.ErrorIs(t, er, err)
return
}
@ -152,7 +156,15 @@ func getEntryUnmarshalTestRunner(in string, title string, date time.Time, fields
for _, f := range fields {
got := false
for _, m := range e.Fields {
if m == f {
var mVal any = m.Value
var fVal any = f.Value
if mJ, ok := m.Value.(json.RawMessage); ok {
mVal = string(mJ)
}
if fJ, ok := f.Value.(json.RawMessage); ok {
fVal = string(fJ)
}
if m.Key == f.Key && mVal == fVal {
got = true
break
}
@ -161,3 +173,17 @@ func getEntryUnmarshalTestRunner(in string, title string, date time.Time, fields
}
}
}
func TestScan(t *testing.T) {
in := "@begin date - Title\nlong\n@foo john\njones\n@bar 42@nobody @end"
read := strings.NewReader(in)
scan := bufio.NewScanner(read)
scan.Split(scanEntry)
assert.True(t, scan.Scan())
assert.Equal(t, "@begin date - Title\nlong", scan.Text())
assert.True(t, scan.Scan())
assert.Equal(t, "@foo john\njones", scan.Text())
assert.True(t, scan.Scan())
assert.Equal(t, "@bar 42@nobody", scan.Text())
assert.False(t, scan.Scan())
}