|
|
|
package wikilink_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"code.ndumas.com/ndumas/wikilink-parser"
|
|
|
|
)
|
|
|
|
|
|
|
|
func Test_ObsidianWikilinks(t *testing.T) {
|
|
|
|
// t.Parallel()
|
|
|
|
tcs := []struct {
|
|
|
|
name string
|
|
|
|
in string
|
|
|
|
expected []wikilink.Lexeme
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "wikilink",
|
|
|
|
in: "[[wikilink]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "wikilink"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "wikilink|display name",
|
|
|
|
in: "[[wikilink|display name]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "wikilink"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "display name"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "wikilink|display name|second pipe",
|
|
|
|
in: "[[wikilink|display name|second pipe]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "wikilink"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "display name"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "second pipe"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "wikilink with numeric alias|420|second pipe",
|
|
|
|
in: "[[wikilink|420|second pipe]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "wikilink"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "420"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "second pipe"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "wikilink with spaces in filename",
|
|
|
|
in: "[[wikilink spaces]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "wikilink spaces"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "#heading",
|
|
|
|
in: "[[#heading]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: ""},
|
|
|
|
{Typ: wikilink.LexHeading, Val: "#"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "heading"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "wikilink#heading",
|
|
|
|
in: "[[wikilink#heading]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "wikilink"},
|
|
|
|
{Typ: wikilink.LexHeading, Val: "#"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "heading"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "wikilink#heading|display name",
|
|
|
|
in: "[[wikilink#heading|display name]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "wikilink"},
|
|
|
|
{Typ: wikilink.LexHeading, Val: "#"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "heading"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "display name"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "wikilink#heading|display name|second pipe",
|
|
|
|
in: "[[wikilink#heading|display name|second pipe]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "wikilink"},
|
|
|
|
{Typ: wikilink.LexHeading, Val: "#"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "heading"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "display name"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "second pipe"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "wikilink with numeric aliases#heading|420|display name",
|
|
|
|
in: "[[wikilink#heading|420|second pipe]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "wikilink"},
|
|
|
|
{Typ: wikilink.LexHeading, Val: "#"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "heading"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "420"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "second pipe"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "#^blockRef",
|
|
|
|
in: "[[#^blockRef]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: ""},
|
|
|
|
{Typ: wikilink.LexBlockRef, Val: "#^"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "blockRef"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "wikilink#^blockRef",
|
|
|
|
in: "[[wikilink#^blockRef]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "wikilink"},
|
|
|
|
{Typ: wikilink.LexBlockRef, Val: "#^"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "blockRef"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "wikilink#^blockRef|display name",
|
|
|
|
in: "[[wikilink#^blockRef|display name]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "wikilink"},
|
|
|
|
{Typ: wikilink.LexBlockRef, Val: "#^"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "blockRef"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "display name"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "wikilink#^blockRef|display name|second pipe",
|
|
|
|
in: "[[wikilink#^blockRef|display name|second pipe]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "wikilink"},
|
|
|
|
{Typ: wikilink.LexBlockRef, Val: "#^"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "blockRef"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "display name"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "second pipe"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "wikilink with numeric aliases#^blockRef|420|second pipe",
|
|
|
|
in: "[[wikilink#^blockRef|420|second pipe]]",
|
|
|
|
expected: []wikilink.Lexeme{
|
|
|
|
{Typ: wikilink.LexOpenLink, Val: "[["},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "wikilink"},
|
|
|
|
{Typ: wikilink.LexBlockRef, Val: "#^"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "blockRef"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "420"},
|
|
|
|
{Typ: wikilink.LexAlias, Val: "|"},
|
|
|
|
{Typ: wikilink.LexIdent, Val: "second pipe"},
|
|
|
|
{Typ: wikilink.LexCloseLink, Val: "]]"},
|
|
|
|
{Typ: wikilink.LexText, Val: ""},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, tc := range tcs {
|
|
|
|
tc := tc
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
l := wikilink.Lex("testLexer", tc.in)
|
|
|
|
defer l.L.Sync()
|
|
|
|
if len(tc.expected) != len(l.Items) {
|
|
|
|
t.Logf("expected %d tokens, got %d\n", len(tc.expected), len(l.Items))
|
|
|
|
t.Fail()
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
for i, e := range tc.expected {
|
|
|
|
n := l.Items[i]
|
|
|
|
if e.Typ != n.Typ {
|
|
|
|
t.Logf("expected Type %s, received %s", e.Typ.String(), n.Typ.String())
|
|
|
|
t.Fail()
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if e.Val != n.Val {
|
|
|
|
t.Logf("expected Value %q, received %q", e.Val, n.Val)
|
|
|
|
t.Fail()
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|