@ -3,109 +3,314 @@ package wikilink_test
import (
"testing"
"github.com/stretchr/testify/assert"
"go.uber.org/zap/zapcore"
"code.ndumas.com/ndumas/wikilink-parser"
)
func Test_Lexer ( t * testing . T ) {
// t.Parallel()
tcs := [ ] struct {
name string
in string
expected [ ] wikilink . Item
} {
var SingleWikilink = [ ] tc {
{
name : "wikilink" , in : "[[wikilink]]" , expected : [ ] wikilink . Item {
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
{ Typ : wikilink . ItemIdent , Val : "wikilink" } ,
{ Typ : wikilink . ItemCloseLink , Val : "]]" } ,
name : "wikilink" ,
in : "[[wikilink]]" ,
expected : [ ] wikilink . Lexeme {
{ Typ : wikilink . LexOpenLink , Val : "[[" } ,
{ Typ : wikilink . LexIdent , Val : "wikilink" } ,
{ Typ : wikilink . LexCloseLink , Val : "]]" } ,
} ,
} ,
{
name : "wikilink|display name" , in : "[[wikilink|display name]]" , expected : [ ] wikilink . Item {
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
{ Typ : wikilink . ItemIdent , Val : "wikilink" } ,
{ Typ : wikilink . ItemAlias , Val : "|" } ,
{ Typ : wikilink . ItemIdent , Val : "display name" } ,
{ Typ : wikilink . ItemCloseLink , 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 : "]]" } ,
} ,
} ,
{
name : "wikilink|display name|second pipe" , in : "[[wikilink|display name|second pipe]]" , expected : [ ] wikilink . Item {
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
{ Typ : wikilink . ItemIdent , Val : "wikilink" } ,
{ Typ : wikilink . ItemAlias , Val : "|" } ,
{ Typ : wikilink . ItemIdent , Val : "display name" } ,
{ Typ : wikilink . ItemAlias , Val : "|" } ,
{ Typ : wikilink . ItemIdent , Val : "second pipe" } ,
{ Typ : wikilink . ItemCloseLink , 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 : "]]" } ,
} ,
} ,
{
name : "wikilink with numeric alias|420|second pipe" , in : "[[wikilink|420|second pipe]]" , expected : [ ] wikilink . Item {
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
{ Typ : wikilink . ItemIdent , Val : "wikilink" } ,
{ Typ : wikilink . ItemAlias , Val : "|" } ,
{ Typ : wikilink . ItemIdent , Val : "420" } ,
{ Typ : wikilink . ItemAlias , Val : "|" } ,
{ Typ : wikilink . ItemIdent , Val : "second pipe" } ,
{ Typ : wikilink . ItemCloseLink , 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 : "]]" } ,
} ,
} ,
{
name : "wikilink with spaces in filename" , in : "[[wikilink spaces]]" , expected : [ ] wikilink . Item {
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
{ Typ : wikilink . ItemIdent , Val : "wikilink spaces" } ,
{ Typ : wikilink . ItemCloseLink , 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 : "]]" } ,
} ,
} ,
{
name : "#heading" , in : "[[#heading]]" , expected : [ ] wikilink . Item {
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
{ Typ : wikilink . ItemHeading , Val : "#" } ,
{ Typ : wikilink . ItemIdent , Val : "heading" } ,
{ Typ : wikilink . ItemCloseLink , 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 : "]]" } ,
} ,
} ,
{
name : "wikilink#heading" , in : "[[wikilink#heading]]" , expected : [ ] wikilink . Item {
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
{ Typ : wikilink . ItemIdent , Val : "wikilink" } ,
{ Typ : wikilink . ItemHeading , Val : "#" } ,
{ Typ : wikilink . ItemIdent , Val : "heading" } ,
{ Typ : wikilink . ItemCloseLink , Val : "]]" } ,
} ,
} ,
/ *
{ name : "" , in : "" , expected : [ ] wikilink . ItemType { } } ,
{ name : "wikilink#heading|display name" , in : "[[wikilink#heading|display name]]" , expected : [ ] wikilink . ItemType { } } ,
{ name : "wikilink#heading|display name|second pipe" , in : "[[wikilink#heading|display name|second pipe]]" , expected : [ ] wikilink . ItemType { } } ,
{ name : "wikilink with numeric aliases#heading|420|display name" , in : "[[wikilink#heading|420|second pipe]]" , expected : [ ] wikilink . ItemType { } } ,
{ name : "^blockRef" , in : "[[^blockRef]]" , expected : [ ] wikilink . ItemType { } } ,
{ name : "wikilink^blockRef" , in : "[[wikilink^blockRef]]" , expected : [ ] wikilink . ItemType { } } ,
{ name : "wikilink^blockRef|display name" , in : "[[wikilink#^blockRef|display name]]" , expected : [ ] wikilink . ItemType { } } ,
{ name : "wikilink^blockRef|display name|second pipe" , in : "[[wikilink#^blockRef|display name|second pipe]]" , expected : [ ] wikilink . ItemType { } } ,
{ name : "wikilink with numeric aliases^blockRef|420|second pipe" , in : "[[wikilink#^blockRef|420|second pipe]]" , expected : [ ] wikilink . ItemType { } } ,
* /
}
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 ( )
for _ , e := range tc . expected {
n := l . NextItem ( )
if e . Typ != n . Typ {
t . Logf ( "expected Type %s, received %s" , e . Typ . String ( ) , n . Typ . String ( ) )
t . Fail ( )
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 : "]]" } ,
} ,
} ,
{
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 : "]]" } ,
} ,
} ,
{
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 : "]]" } ,
} ,
} ,
{
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 : "]]" } ,
} ,
} ,
{
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 : "]]" } ,
} ,
} ,
{
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 : "]]" } ,
} ,
} ,
{
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 : "]]" } ,
} ,
} ,
{
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 : "]]" } ,
} ,
} ,
{
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 : "]]" } ,
} ,
} ,
}
func Test_ObsidianWikilinks_LinksEndOfMultiLineInput ( t * testing . T ) {
for _ , tc := range SingleWikilink {
mut , test := mutateTestCase (
tc ,
" test data please ignore.\nbling blonk more lines\nbling blong\nthis is a" ,
"" ,
[ ] wikilink . Lexeme {
{ Typ : wikilink . LexText , Val : " test data please ignore.\n" } ,
{ Typ : wikilink . LexText , Val : "bling blonk more lines\n" } ,
{ Typ : wikilink . LexText , Val : "bling blong\n" } ,
{ Typ : wikilink . LexText , Val : "this is a" } ,
} ,
[ ] wikilink . Lexeme {
{ Typ : wikilink . LexText , Val : "" } ,
} ,
)
t . Run ( mut . name , test )
}
}
func Test_ObsidianWikilinks_LinksStartOfMultiLineInput ( t * testing . T ) {
for _ , tc := range SingleWikilink {
mut , test := mutateTestCase (
tc ,
"" ,
" test data please ignore.\nbling blonk more lines\nbling blong\nthis is a" ,
[ ] wikilink . Lexeme {
{ Typ : wikilink . LexText , Val : "" } ,
} ,
[ ] wikilink . Lexeme {
{ Typ : wikilink . LexText , Val : " test data please ignore.\n" } ,
{ Typ : wikilink . LexText , Val : "bling blonk more lines\n" } ,
{ Typ : wikilink . LexText , Val : "bling blong\n" } ,
{ Typ : wikilink . LexText , Val : "this is a" } ,
} ,
)
t . Run ( mut . name , test )
}
}
if e . Val != n . Val {
t . Logf ( "expected Value %q, received %q" , e . Val , n . Val )
t . Fail ( )
func Test_ObsidianWikilinks_LinksStartOfInput ( t * testing . T ) {
for _ , tc := range SingleWikilink {
mut , test := mutateTestCase (
tc ,
"" ,
" test data please ignore" ,
[ ] wikilink . Lexeme {
{ Typ : wikilink . LexText , Val : "" } ,
} ,
[ ] wikilink . Lexeme {
{ Typ : wikilink . LexText , Val : " test data please ignore" } ,
} ,
)
t . Run ( mut . name , test )
}
}
func Test_ObsidianWikilinks_LinksEndOfInput ( t * testing . T ) {
for _ , tc := range SingleWikilink {
mut , test := mutateTestCase (
tc ,
"this is a " ,
"" ,
[ ] wikilink . Lexeme {
{ Typ : wikilink . LexText , Val : "this is a " } ,
} ,
[ ] wikilink . Lexeme {
{ Typ : wikilink . LexText , Val : "" } ,
} ,
)
t . Run ( mut . name , test )
}
} )
}
func Test_ObsidianWikilinks_Basic ( t * testing . T ) {
for _ , tc := range SingleWikilink {
mut , test := mutateTestCase (
tc ,
"" ,
"" ,
[ ] wikilink . Lexeme {
{ Typ : wikilink . LexText , Val : "" } ,
} ,
[ ] wikilink . Lexeme {
{ Typ : wikilink . LexText , Val : "" } ,
} ,
)
t . Run ( mut . name , test )
}
}
type tc struct {
name string
in string
expected [ ] wikilink . Lexeme
}
func mutateTestCase ( tc tc , prefix , suffix string , expectedPrefix , expectedSuffix [ ] wikilink . Lexeme ) ( tc , func ( t * testing . T ) ) {
tc . in = prefix + tc . in
tc . in = tc . in + suffix
if expectedPrefix != nil {
tc . expected = append ( expectedPrefix , tc . expected ... )
}
if expectedSuffix != nil {
tc . expected = append ( tc . expected , expectedSuffix ... )
}
return tc , func ( t * testing . T ) {
l := wikilink . Lex ( "testLexer" , tc . in , zapcore . WarnLevel )
defer l . L . Sync ( )
assert . Equal ( t , tc . expected , l . Items , "token stream mismatch" )
}
}