@ -3,314 +3,109 @@ package wikilink_test
import (
import (
"testing"
"testing"
"github.com/stretchr/testify/assert"
"go.uber.org/zap/zapcore"
"code.ndumas.com/ndumas/wikilink-parser"
"code.ndumas.com/ndumas/wikilink-parser"
)
)
var SingleWikilink = [ ] tc {
func Test_Lexer ( t * testing . T ) {
{
// t.Parallel()
name : "wikilink" ,
tcs := [ ] struct {
in : "[[wikilink]]" ,
name string
expected : [ ] wikilink . Lexeme {
in string
{ Typ : wikilink . LexOpenLink , Val : "[[" } ,
expected [ ] wikilink . Item
{ Typ : wikilink . LexIdent , Val : "wikilink" } ,
} {
{ Typ : wikilink . LexCloseLink , 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 . 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 . 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 . Lexeme {
{ Typ : wikilink . LexOpenLink , Val : "[[" } ,
{ Typ : wikilink . LexIdent , Val : "wikilink spaces" } ,
{ Typ : wikilink . LexCloseLink , 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 . 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" ,
name : "wikilink" , in : "[[wikilink]]" , expected : [ ] wikilink . Item {
in : "[[wikilink#heading|display name|second pipe]]" ,
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
expected : [ ] wikilink . Lexeme {
{ Typ : wikilink . ItemIdent , Val : "wikilink" } ,
{ Typ : wikilink . LexOpenLink , Val : "[[" } ,
{ Typ : wikilink . ItemCloseLink , 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" ,
name : "wikilink|display name" , in : "[[wikilink|display name]]" , expected : [ ] wikilink . Item {
in : "[[wikilink#heading|420|second pipe]]" ,
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
expected : [ ] wikilink . Lexeme {
{ Typ : wikilink . ItemIdent , Val : "wikilink" } ,
{ Typ : wikilink . LexOpenLink , Val : "[[" } ,
{ Typ : wikilink . ItemAlias , Val : "|" } ,
{ Typ : wikilink . LexIdent , Val : "wikilink" } ,
{ Typ : wikilink . ItemIdent , Val : "display name" } ,
{ Typ : wikilink . LexHeading , Val : "#" } ,
{ Typ : wikilink . ItemCloseLink , 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" ,
name : "wikilink|display name|second pipe" , in : "[[wikilink|display name|second pipe]]" , expected : [ ] wikilink . Item {
in : "[[#^blockRef]]" ,
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
expected : [ ] wikilink . Lexeme {
{ Typ : wikilink . ItemIdent , Val : "wikilink" } ,
{ Typ : wikilink . LexOpenLink, Val : "[[ "} ,
{ Typ : wikilink . ItemAlias , Val : "|" } ,
{ Typ : wikilink . LexIdent, Val : " "} ,
{ Typ : wikilink . ItemIdent , Val : "display name" } ,
{ Typ : wikilink . LexBlockRef, Val : "#^ "} ,
{ Typ : wikilink . ItemAlias , Val : "|" } ,
{ Typ : wikilink . LexIdent, Val : "blockRef "} ,
{ Typ : wikilink . ItemIdent , Val : "second pipe" } ,
{ Typ : wikilink . Lex CloseLink, Val : "]]" } ,
{ Typ : wikilink . ItemCloseLink , Val : "]]" } ,
} ,
} ,
} ,
} ,
{
{
name : "wikilink#^blockRef" ,
name : "wikilink with numeric alias|420|second pipe" , in : "[[wikilink|420|second pipe]]" , expected : [ ] wikilink . Item {
in : "[[wikilink#^blockRef]]" ,
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
expected : [ ] wikilink . Lexeme {
{ Typ : wikilink . ItemIdent , Val : "wikilink" } ,
{ Typ : wikilink . LexOpenLink, Val : "[[ "} ,
{ Typ : wikilink . ItemAlias , Val : "|" } ,
{ Typ : wikilink . LexIdent, Val : "wikilink "} ,
{ Typ : wikilink . ItemIdent , Val : "420" } ,
{ Typ : wikilink . LexBlockRef, Val : "#^ "} ,
{ Typ : wikilink . ItemAlias , Val : "|" } ,
{ Typ : wikilink . LexIdent, Val : "blockRef "} ,
{ Typ : wikilink . ItemIdent , Val : "second pipe" } ,
{ Typ : wikilink . Lex CloseLink, Val : "]]" } ,
{ Typ : wikilink . ItemCloseLink , Val : "]]" } ,
} ,
} ,
} ,
} ,
{
{
name : "wikilink#^blockRef|display name" ,
name : "wikilink with spaces in filename" , in : "[[wikilink spaces]]" , expected : [ ] wikilink . Item {
in : "[[wikilink#^blockRef|display name]]" ,
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
expected : [ ] wikilink . Lexeme {
{ Typ : wikilink . ItemIdent , Val : "wikilink spaces" } ,
{ Typ : wikilink . LexOpenLink , Val : "[[" } ,
{ Typ : wikilink . ItemCloseLink , 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" ,
name : "#heading" , in : "[[#heading]]" , expected : [ ] wikilink . Item {
in : "[[wikilink#^blockRef|display name|second pipe]]" ,
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
expected : [ ] wikilink . Lexeme {
{ Typ : wikilink . ItemHeading , Val : "#" } ,
{ Typ : wikilink . LexOpenLink , Val : "[[" } ,
{ Typ : wikilink . ItemIdent , Val : "heading" } ,
{ Typ : wikilink . LexIdent , Val : "wikilink" } ,
{ Typ : wikilink . ItemCloseLink , Val : "]]" } ,
{ 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" ,
name : "wikilink#heading" , in : "[[wikilink#heading]]" , expected : [ ] wikilink . Item {
in : "[[wikilink#^blockRef|420|second pipe]]" ,
{ Typ : wikilink . ItemOpenLink , Val : "[[" } ,
expected : [ ] wikilink . Lexeme {
{ Typ : wikilink . ItemIdent , Val : "wikilink" } ,
{ Typ : wikilink . LexOpenLink , Val : "[[" } ,
{ Typ : wikilink . ItemHeading , Val : "#" } ,
{ Typ : wikilink . LexIdent , Val : "wikilink" } ,
{ Typ : wikilink . ItemIdent , Val : "heading" } ,
{ Typ : wikilink . LexBlockRef , Val : "#^" } ,
{ Typ : wikilink . ItemCloseLink , Val : "]]" } ,
{ Typ : wikilink . LexIdent , Val : "blockRef" } ,
} ,
{ Typ : wikilink . LexAlias , Val : "|" } ,
} ,
{ Typ : wikilink . LexIdent , Val : "420" } ,
/ *
{ Typ : wikilink . LexAlias , Val : "|" } ,
{ name : "" , in : "" , expected : [ ] wikilink . ItemType { } } ,
{ Typ : wikilink . LexIdent , Val : "second pipe" } ,
{ name : "wikilink#heading|display name" , in : "[[wikilink#heading|display name]]" , expected : [ ] wikilink . ItemType { } } ,
{ Typ : wikilink . LexCloseLink , Val : "]]" } ,
{ 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 { } } ,
func Test_ObsidianWikilinks_LinksEndOfMultiLineInput ( t * testing . T ) {
{ name : "wikilink^blockRef|display name|second pipe" , in : "[[wikilink#^blockRef|display name|second pipe]]" , expected : [ ] wikilink . ItemType { } } ,
for _ , tc := range SingleWikilink {
{ name : "wikilink with numeric aliases^blockRef|420|second pipe" , in : "[[wikilink#^blockRef|420|second pipe]]" , expected : [ ] wikilink . ItemType { } } ,
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 )
}
}
}
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 tcs {
for _ , tc := range SingleWikilink {
tc := tc
mut , test := mutateTestCase (
t . Run ( tc . name , func ( t * testing . T ) {
tc ,
// t.Parallel()
"this is a " ,
l := wikilink . Lex ( "testLexer" , tc . in )
"" ,
defer l . L . Sync ( )
[ ] wikilink . Lexeme {
for _ , e := range tc . expected {
{ Typ : wikilink . LexText , Val : "this is a " } ,
n := l . NextItem ( )
} ,
if e . Typ != n . Typ {
[ ] wikilink . Lexeme {
t . Logf ( "expected Type %s, received %s" , e . Typ . String ( ) , n . Typ . String ( ) )
{ Typ : wikilink . LexText , Val : "" } ,
t . Fail ( )
} ,
)
t . Run ( mut . name , test )
}
}
}
func Test_ObsidianWikilinks_Basic ( t * testing . T ) {
for _ , tc := range SingleWikilink {
if e . Val != n . Val {
mut , test := mutateTestCase (
t . Logf ( "expected Value %q, received %q" , e . Val , n . Val )
tc ,
t . Fail ( )
"" ,
"" ,
[ ] 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" )
}
}
}
}