package main
import (
"strconv"
"testing"
c "github.com/Azareal/Gosora/common"
e "github.com/Azareal/Gosora/extend"
)
// go test -v
// TODO: Write a test for Hello World?
type MEPair struct {
Msg string
Expects string
}
type MEPairList struct {
Items []MEPair
}
func (l *MEPairList) Add(msg, expects string) {
l.Items = append(l.Items, MEPair{msg, expects})
}
func TestBBCodeRender(t *testing.T) {
//t.Skip()
if e := e.InitBbcode(c.Plugins["bbcode"]); e != nil {
t.Fatal(e)
}
var res string
l := &MEPairList{nil}
l.Add("", "")
l.Add(" ", " ")
l.Add(" ", " ")
l.Add(" ", " ")
l.Add("[b]", "")
l.Add("[b][/b]", "")
l.Add("hi", "hi")
l.Add("😀", "😀")
l.Add("[b]😀[/b]", "😀")
l.Add("[b]😀😀😀[/b]", "😀😀😀")
l.Add("[b]hi[/b]", "hi")
l.Add("[u]hi[/u]", "hi")
l.Add("[i]hi[/i]", "hi")
l.Add("[s]hi[/s]", "hi")
l.Add("[c]hi[/c]", "[c]hi[/c]")
l.Add("[h1]hi", "[h1]hi")
l.Add("[h1]hi[/h1]", "
hi
")
if !testing.Short() {
//l.Add("[b]hi[/i]", "[b]hi[/i]")
//l.Add("[/b]hi[b]", "[/b]hi[b]")
//l.Add("[/b]hi[/b]", "[/b]hi[/b]")
//l.Add("[b][b]hi[/b]", "hi")
//l.Add("[b][b]hi", "[b][b]hi")
//l.Add("[b][b][b]hi", "[b][b][b]hi")
//l.Add("[/b]hi", "[/b]hi")
}
l.Add("[spoiler]hi[/spoiler]", "hi")
l.Add("[code]hi[/code]", "hi")
l.Add("[code][b]hi[/b][/code]", "[b]hi[/b]")
l.Add("[code][b]hi[/code][/b]", "[b]hi[/b]")
l.Add("[quote]hi[/quote]", "hi
")
l.Add("[quote][b]hi[/b][/quote]", "hi
")
l.Add("[quote][b]h[/b][/quote]", "h
")
l.Add("[quote][b][/b][/quote]", "
")
l.Add("[url][/url]", "")
l.Add("[url]https://github.com/Azareal/Gosora[/url]", "https://github.com/Azareal/Gosora")
l.Add("[url]http://github.com/Azareal/Gosora[/url]", "http://github.com/Azareal/Gosora")
l.Add("[url]//github.com/Azareal/Gosora[/url]", "//github.com/Azareal/Gosora")
l.Add("-ä½ å¥½-", "-ä½ å¥½-")
l.Add("[i]-ä½ å¥½-[/i]", "-ä½ å¥½-") // TODO: More of these Unicode tests? Emoji, Chinese, etc.?
t.Log("Testing BbcodeFullParse")
for _, item := range l.Items {
res = e.BbcodeFullParse(item.Msg)
if res != item.Expects {
t.Error("Testing string '" + item.Msg + "'")
t.Error("Bad output:", "'"+res+"'")
t.Error("Expected:", "'"+item.Expects+"'")
}
}
f := func(msg, expects string) {
t.Log("Testing string '" + msg + "'")
res := e.BbcodeFullParse(msg)
if res != expects {
t.Error("Bad output:", "'"+res+"'")
t.Error("Expected:", "'"+expects+"'")
}
}
f("[rand][/rand]", "[Invalid Number][rand][/rand]")
f("[rand]-1[/rand]", "[No Negative Numbers][rand]-1[/rand]")
f("[rand]-01[/rand]", "[No Negative Numbers][rand]-01[/rand]")
f("[rand]NaN[/rand]", "[Invalid Number][rand]NaN[/rand]")
f("[rand]Inf[/rand]", "[Invalid Number][rand]Inf[/rand]")
f("[rand]+[/rand]", "[Invalid Number][rand]+[/rand]")
f("[rand]1+1[/rand]", "[Invalid Number][rand]1+1[/rand]")
msg := "[rand]1[/rand]"
t.Log("Testing string '" + msg + "'")
res = e.BbcodeFullParse(msg)
conv, err := strconv.Atoi(res)
if err != nil || (conv > 1 || conv < 0) {
t.Error("Bad output:", "'"+res+"'")
t.Error("Expected a number in the range 0-1")
}
msg = "[rand]0[/rand]"
t.Log("Testing string '" + msg + "'")
res = e.BbcodeFullParse(msg)
conv, err = strconv.Atoi(res)
if err != nil || conv != 0 {
t.Error("Bad output:", "'"+res+"'")
t.Error("Expected the number 0")
}
msg = "[rand]2147483647[/rand]" // Signed 32-bit MAX
t.Log("Testing string '" + msg + "'")
res = e.BbcodeFullParse(msg)
conv, err = strconv.Atoi(res)
if err != nil || (conv > 2147483647 || conv < 0) {
t.Error("Bad output:", "'"+res+"'")
t.Error("Expected a number between 0 and 2147483647")
}
msg = "[rand]9223372036854775807[/rand]" // Signed 64-bit MAX
t.Log("Testing string '" + msg + "'")
res = e.BbcodeFullParse(msg)
conv, err = strconv.Atoi(res)
if err != nil || (conv > 9223372036854775807 || conv < 0) {
t.Error("Bad output:", "'"+res+"'")
t.Error("Expected a number between 0 and 9223372036854775807")
}
// Note: conv is commented out in these two, as these numbers overflow int
msg = "[rand]18446744073709551615[/rand]" // Unsigned 64-bit MAX
t.Log("Testing string '" + msg + "'")
res = e.BbcodeFullParse(msg)
_, err = strconv.Atoi(res)
if err != nil && res != "[Invalid Number][rand]18446744073709551615[/rand]" {
t.Error("Bad output:", "'"+res+"'")
t.Error("Expected a number between 0 and 18446744073709551615")
}
msg = "[rand]170141183460469231731687303715884105727[/rand]" // Signed 128-bit MAX
t.Log("Testing string '" + msg + "'")
res = e.BbcodeFullParse(msg)
_, err = strconv.Atoi(res)
if err != nil && res != "[Invalid Number][rand]170141183460469231731687303715884105727[/rand]" {
t.Error("Bad output:", "'"+res+"'")
t.Error("Expected a number between 0 and 170141183460469231731687303715884105727")
}
/*t.Log("Testing bbcode_regex_parse")
for _, item := range l.Items {
t.Log("Testing string '" + item.Msg + "'")
res = bbcodeRegexParse(item.Msg)
if res != item.Expects {
t.Error("Bad output:", "'"+res+"'")
t.Error("Expected:", item.Expects)
}
}*/
l = &MEPairList{nil}
l.Add("", "")
l.Add("ddd", "ddd")
l.Add("[b][/b]", "")
l.Add("[b]ddd[/b]", "ddd")
l.Add("ddd[b]ddd[/b]ddd", "ddddddddd")
l.Add("ddd\n[b]ddd[/b]\nddd", "ddd\nddd\nddd")
t.Log("Testing BbcodeStripTags")
for _, item := range l.Items {
res = e.BbcodeStripTags(item.Msg)
if res != item.Expects {
t.Error("Testing string '" + item.Msg + "'")
t.Error("Bad output:", "'"+res+"'")
t.Error("Expected:", "'"+item.Expects+"'")
}
}
}
func TestMarkdownRender(t *testing.T) {
//t.Skip()
if err := e.InitMarkdown(c.Plugins["markdown"]); err != nil {
t.Fatal(err)
}
l := &MEPairList{nil}
l2 := &MEPairList{nil}
// TODO: Fix more of these odd cases
l.Add("", "")
l.Add(" ", " ")
l.Add(" ", " ")
l.Add(" ", " ")
l.Add("\t", "\t")
l.Add("\n", "\n")
l.Add("*", "*")
l.Add("`", "`")
//l.Add("**", "")
l.Add("h", "h")
l.Add("hi", "hi")
l.Add("**h**", "h")
l.Add("**hi**", "hi")
l.Add("_h_", "h")
l.Add("_hi_", "hi")
l.Add("*h*", "h")
l.Add("*hi*", "hi")
l.Add("~h~", "h")
l.Add("~hi~", "hi")
l.Add("`hi`", "hi
")
// TODO: Hide the backslash after escaping the item
// TODO: Doesn't behave consistently with d in-front of it
l2.Add("\\`hi`", "\\`hi`")
l2.Add("#", "#")
l2.Add("#h", "h
")
l2.Add("#hi", "hi
")
l2.Add("# hi", "hi
")
l2.Add("# hi", "hi
")
l.Add("\n#", "\n#")
l.Add("\n#h", "\nh
")
l.Add("\n#hi", "\nhi
")
l.Add("\n#h\n", "\nh
")
l.Add("\n#hi\n", "\nhi
")
l.Add("*hi**", "hi*")
l.Add("**hi***", "hi*")
//l.Add("**hi*", "*hi")
l.Add("***hi***", "hi")
l.Add("***h***", "h")
l.Add("\\***h**\\*", "*h*")
l.Add("\\*\\**h*\\*\\*", "**h**")
l.Add("\\*hi\\*", "*hi*")
l.Add("d\\*hi\\*", "d*hi*")
l.Add("\\*hi\\*d", "*hi*d")
l.Add("d\\*hi\\*d", "d*hi*d")
l.Add("\\", "\\")
l.Add("\\\\", "\\\\")
l.Add("\\d", "\\d")
l.Add("\\\\d", "\\\\d")
l.Add("\\\\\\d", "\\\\\\d")
l.Add("d\\", "d\\")
l.Add("\\d\\", "\\d\\")
l.Add("*_hi_*", "hi")
l.Add("*~hi~*", "hi")
//l.Add("~*hi*~", "hi")
//l.Add("~ *hi* ~", " hi ")
l.Add("_~hi~_", "hi")
l.Add("***~hi~***", "hi")
l.Add("**", "**")
l.Add("***", "***")
l.Add("****", "****")
l.Add("*****", "*****")
l.Add("******", "******")
l.Add("*******", "*******")
l.Add("~~", "~~")
l.Add("~~~", "~~~")
l.Add("~~~~", "~~~~")
l.Add("~~~~~", "~~~~~")
l.Add("|hi|", "hi")
l.Add("__", "__")
l.Add("___", "___")
l.Add("_ _", " ")
l.Add("* *", " ")
l.Add("** **", " ")
l.Add("*** ***", " ")
l.Add("-ä½ å¥½-", "-ä½ å¥½-")
l.Add("*-ä½ å¥½-*", "-ä½ å¥½-") // TODO: More of these Unicode tests? Emoji, Chinese, etc.?
for _, item := range l.Items {
if res := e.MarkdownParse(item.Msg); res != item.Expects {
t.Error("Testing string '" + item.Msg + "'")
t.Error("Bad output:", "'"+res+"'")
//t.Error("Ouput in bytes:", []byte(res))
t.Error("Expected:", "'"+item.Expects+"'")
}
}
for _, item := range l2.Items {
if res := e.MarkdownParse(item.Msg); res != item.Expects {
t.Error("Testing string '" + item.Msg + "'")
t.Error("Bad output:", "'"+res+"'")
//t.Error("Ouput in bytes:", []byte(res))
t.Error("Expected:", "'"+item.Expects+"'")
}
}
for _, item := range l.Items {
if res := e.MarkdownParse("d" + item.Msg); res != "d"+item.Expects {
t.Error("Testing string 'd" + item.Msg + "'")
t.Error("Bad output:", "'"+res+"'")
//t.Error("Ouput in bytes:", []byte(res))
t.Error("Expected:", "'d"+item.Expects+"'")
}
}
// TODO: Write suffix tests and double string tests
// TODO: Write similar prefix, suffix, and double string tests for plugin_bbcode. Ditto for the outer parser along with suitable tests for that like making sure the URL parser and media embedder works.
}