github.com/Azareal/Gosora@v0.0.0-20210729070923-553e66b59003/plugin_test.go (about)

     1  package main
     2  
     3  import (
     4  	"strconv"
     5  	"testing"
     6  
     7  	c "github.com/Azareal/Gosora/common"
     8  	e "github.com/Azareal/Gosora/extend"
     9  )
    10  
    11  // go test -v
    12  
    13  // TODO: Write a test for Hello World?
    14  
    15  type MEPair struct {
    16  	Msg     string
    17  	Expects string
    18  }
    19  
    20  type MEPairList struct {
    21  	Items []MEPair
    22  }
    23  
    24  func (l *MEPairList) Add(msg, expects string) {
    25  	l.Items = append(l.Items, MEPair{msg, expects})
    26  }
    27  
    28  func TestBBCodeRender(t *testing.T) {
    29  	//t.Skip()
    30  	if e := e.InitBbcode(c.Plugins["bbcode"]); e != nil {
    31  		t.Fatal(e)
    32  	}
    33  
    34  	var res string
    35  	l := &MEPairList{nil}
    36  	l.Add("", "")
    37  	l.Add(" ", " ")
    38  	l.Add("  ", "  ")
    39  	l.Add("   ", "   ")
    40  	l.Add("[b]", "<b></b>")
    41  	l.Add("[b][/b]", "<b></b>")
    42  	l.Add("hi", "hi")
    43  	l.Add("😀", "😀")
    44  	l.Add("[b]😀[/b]", "<b>😀</b>")
    45  	l.Add("[b]😀😀😀[/b]", "<b>😀😀😀</b>")
    46  	l.Add("[b]hi[/b]", "<b>hi</b>")
    47  	l.Add("[u]hi[/u]", "<u>hi</u>")
    48  	l.Add("[i]hi[/i]", "<i>hi</i>")
    49  	l.Add("[s]hi[/s]", "<s>hi</s>")
    50  	l.Add("[c]hi[/c]", "[c]hi[/c]")
    51  	l.Add("[h1]hi", "[h1]hi")
    52  	l.Add("[h1]hi[/h1]", "<h2>hi</h2>")
    53  	if !testing.Short() {
    54  		//l.Add("[b]hi[/i]", "[b]hi[/i]")
    55  		//l.Add("[/b]hi[b]", "[/b]hi[b]")
    56  		//l.Add("[/b]hi[/b]", "[/b]hi[/b]")
    57  		//l.Add("[b][b]hi[/b]", "<b>hi</b>")
    58  		//l.Add("[b][b]hi", "[b][b]hi")
    59  		//l.Add("[b][b][b]hi", "[b][b][b]hi")
    60  		//l.Add("[/b]hi", "[/b]hi")
    61  	}
    62  	l.Add("[spoiler]hi[/spoiler]", "<spoiler>hi</spoiler>")
    63  	l.Add("[code]hi[/code]", "<span class='codequotes'>hi</span>")
    64  	l.Add("[code][b]hi[/b][/code]", "<span class='codequotes'>[b]hi[/b]</span>")
    65  	l.Add("[code][b]hi[/code][/b]", "<span class='codequotes'>[b]hi</span>[/b]")
    66  	l.Add("[quote]hi[/quote]", "<blockquote>hi</blockquote>")
    67  	l.Add("[quote][b]hi[/b][/quote]", "<blockquote><b>hi</b></blockquote>")
    68  	l.Add("[quote][b]h[/b][/quote]", "<blockquote><b>h</b></blockquote>")
    69  	l.Add("[quote][b][/b][/quote]", "<blockquote><b></b></blockquote>")
    70  	l.Add("[url][/url]", "<a href=''></a>")
    71  	l.Add("[url]https://github.com/Azareal/Gosora[/url]", "<a href='https://github.com/Azareal/Gosora'>https://github.com/Azareal/Gosora</a>")
    72  	l.Add("[url]http://github.com/Azareal/Gosora[/url]", "<a href='http://github.com/Azareal/Gosora'>http://github.com/Azareal/Gosora</a>")
    73  	l.Add("[url]//github.com/Azareal/Gosora[/url]", "<a href='//github.com/Azareal/Gosora'>//github.com/Azareal/Gosora</a>")
    74  	l.Add("-你好-", "-你好-")
    75  	l.Add("[i]-你好-[/i]", "<i>-你好-</i>") // TODO: More of these Unicode tests? Emoji, Chinese, etc.?
    76  
    77  	t.Log("Testing BbcodeFullParse")
    78  	for _, item := range l.Items {
    79  		res = e.BbcodeFullParse(item.Msg)
    80  		if res != item.Expects {
    81  			t.Error("Testing string '" + item.Msg + "'")
    82  			t.Error("Bad output:", "'"+res+"'")
    83  			t.Error("Expected:", "'"+item.Expects+"'")
    84  		}
    85  	}
    86  
    87  	f := func(msg, expects string) {
    88  		t.Log("Testing string '" + msg + "'")
    89  		res := e.BbcodeFullParse(msg)
    90  		if res != expects {
    91  			t.Error("Bad output:", "'"+res+"'")
    92  			t.Error("Expected:", "'"+expects+"'")
    93  		}
    94  	}
    95  	f("[rand][/rand]", "<red>[Invalid Number]</red>[rand][/rand]")
    96  	f("[rand]-1[/rand]", "<red>[No Negative Numbers]</red>[rand]-1[/rand]")
    97  	f("[rand]-01[/rand]", "<red>[No Negative Numbers]</red>[rand]-01[/rand]")
    98  	f("[rand]NaN[/rand]", "<red>[Invalid Number]</red>[rand]NaN[/rand]")
    99  	f("[rand]Inf[/rand]", "<red>[Invalid Number]</red>[rand]Inf[/rand]")
   100  	f("[rand]+[/rand]", "<red>[Invalid Number]</red>[rand]+[/rand]")
   101  	f("[rand]1+1[/rand]", "<red>[Invalid Number]</red>[rand]1+1[/rand]")
   102  
   103  	msg := "[rand]1[/rand]"
   104  	t.Log("Testing string '" + msg + "'")
   105  	res = e.BbcodeFullParse(msg)
   106  	conv, err := strconv.Atoi(res)
   107  	if err != nil || (conv > 1 || conv < 0) {
   108  		t.Error("Bad output:", "'"+res+"'")
   109  		t.Error("Expected a number in the range 0-1")
   110  	}
   111  
   112  	msg = "[rand]0[/rand]"
   113  	t.Log("Testing string '" + msg + "'")
   114  	res = e.BbcodeFullParse(msg)
   115  	conv, err = strconv.Atoi(res)
   116  	if err != nil || conv != 0 {
   117  		t.Error("Bad output:", "'"+res+"'")
   118  		t.Error("Expected the number 0")
   119  	}
   120  
   121  	msg = "[rand]2147483647[/rand]" // Signed 32-bit MAX
   122  	t.Log("Testing string '" + msg + "'")
   123  	res = e.BbcodeFullParse(msg)
   124  	conv, err = strconv.Atoi(res)
   125  	if err != nil || (conv > 2147483647 || conv < 0) {
   126  		t.Error("Bad output:", "'"+res+"'")
   127  		t.Error("Expected a number between 0 and 2147483647")
   128  	}
   129  
   130  	msg = "[rand]9223372036854775807[/rand]" // Signed 64-bit MAX
   131  	t.Log("Testing string '" + msg + "'")
   132  	res = e.BbcodeFullParse(msg)
   133  	conv, err = strconv.Atoi(res)
   134  	if err != nil || (conv > 9223372036854775807 || conv < 0) {
   135  		t.Error("Bad output:", "'"+res+"'")
   136  		t.Error("Expected a number between 0 and 9223372036854775807")
   137  	}
   138  
   139  	// Note: conv is commented out in these two, as these numbers overflow int
   140  	msg = "[rand]18446744073709551615[/rand]" // Unsigned 64-bit MAX
   141  	t.Log("Testing string '" + msg + "'")
   142  	res = e.BbcodeFullParse(msg)
   143  	_, err = strconv.Atoi(res)
   144  	if err != nil && res != "<red>[Invalid Number]</red>[rand]18446744073709551615[/rand]" {
   145  		t.Error("Bad output:", "'"+res+"'")
   146  		t.Error("Expected a number between 0 and 18446744073709551615")
   147  	}
   148  	msg = "[rand]170141183460469231731687303715884105727[/rand]" // Signed 128-bit MAX
   149  	t.Log("Testing string '" + msg + "'")
   150  	res = e.BbcodeFullParse(msg)
   151  	_, err = strconv.Atoi(res)
   152  	if err != nil && res != "<red>[Invalid Number]</red>[rand]170141183460469231731687303715884105727[/rand]" {
   153  		t.Error("Bad output:", "'"+res+"'")
   154  		t.Error("Expected a number between 0 and 170141183460469231731687303715884105727")
   155  	}
   156  
   157  	/*t.Log("Testing bbcode_regex_parse")
   158  	for _, item := range l.Items {
   159  		t.Log("Testing string '" + item.Msg + "'")
   160  		res = bbcodeRegexParse(item.Msg)
   161  		if res != item.Expects {
   162  			t.Error("Bad output:", "'"+res+"'")
   163  			t.Error("Expected:", item.Expects)
   164  		}
   165  	}*/
   166  	
   167  	l = &MEPairList{nil}
   168  	l.Add("", "")
   169  	l.Add("ddd", "ddd")
   170  	l.Add("[b][/b]", "")
   171  	l.Add("[b]ddd[/b]", "ddd")
   172  	l.Add("ddd[b]ddd[/b]ddd", "ddddddddd")
   173  	l.Add("ddd\n[b]ddd[/b]\nddd", "ddd\nddd\nddd")
   174  	t.Log("Testing BbcodeStripTags")
   175  	for _, item := range l.Items {
   176  		res = e.BbcodeStripTags(item.Msg)
   177  		if res != item.Expects {
   178  			t.Error("Testing string '" + item.Msg + "'")
   179  			t.Error("Bad output:", "'"+res+"'")
   180  			t.Error("Expected:", "'"+item.Expects+"'")
   181  		}
   182  	}
   183  }
   184  
   185  func TestMarkdownRender(t *testing.T) {
   186  	//t.Skip()
   187  	if err := e.InitMarkdown(c.Plugins["markdown"]); err != nil {
   188  		t.Fatal(err)
   189  	}
   190  
   191  	l := &MEPairList{nil}
   192  	l2 := &MEPairList{nil}
   193  	// TODO: Fix more of these odd cases
   194  	l.Add("", "")
   195  	l.Add(" ", " ")
   196  	l.Add("  ", "  ")
   197  	l.Add("   ", "   ")
   198  	l.Add("\t", "\t")
   199  	l.Add("\n", "\n")
   200  	l.Add("*", "*")
   201  	l.Add("`", "`")
   202  	//l.Add("**", "<i></i>")
   203  	l.Add("h", "h")
   204  	l.Add("hi", "hi")
   205  	l.Add("**h**", "<b>h</b>")
   206  	l.Add("**hi**", "<b>hi</b>")
   207  	l.Add("_h_", "<u>h</u>")
   208  	l.Add("_hi_", "<u>hi</u>")
   209  	l.Add(" _hi_", " <u>hi</u>")
   210  	l.Add("h_hi_h", "h_hi_h")
   211  	l.Add("h _hi_ h", "h <u>hi</u> h")
   212  	l.Add("h _hi_h", "h <u>hi</u>h")
   213  	l.Add("*h*", "<i>h</i>")
   214  	l.Add("*hi*", "<i>hi</i>")
   215  	l.Add("~h~", "<s>h</s>")
   216  	l.Add("~hi~", "<s>hi</s>")
   217  	l.Add("`hi`", "<blockquote>hi</blockquote>")
   218  	// TODO: Hide the backslash after escaping the item
   219  	// TODO: Doesn't behave consistently with d in-front of it
   220  	l2.Add("\\`hi`", "\\`hi`")
   221  	l2.Add("#", "#")
   222  	l2.Add("#h", "<h2>h</h2>")
   223  	l2.Add("#hi", "<h2>hi</h2>")
   224  	l2.Add("# hi", "<h2>hi</h2>")
   225  	l2.Add("#      hi", "<h2>hi</h2>")
   226  	l.Add("\n#", "\n#")
   227  	l.Add("\n#h", "\n<h2>h</h2>")
   228  	l.Add("\n#hi", "\n<h2>hi</h2>")
   229  	l.Add("\n#h\n", "\n<h2>h</h2>")
   230  	l.Add("\n#hi\n", "\n<h2>hi</h2>")
   231  	l.Add("*hi**", "<i>hi</i>*")
   232  	l.Add("**hi***", "<b>hi</b>*")
   233  	//l.Add("**hi*", "*<i>hi</i>")
   234  	l.Add("***hi***", "<b><i>hi</i></b>")
   235  	l.Add("***h***", "<b><i>h</i></b>")
   236  	l.Add("\\***h**\\*", "*<b>h</b>*")
   237  	l.Add("\\*\\**h*\\*\\*", "**<i>h</i>**")
   238  	l.Add("\\*hi\\*", "*hi*")
   239  	l.Add("d\\*hi\\*", "d*hi*")
   240  	l.Add("\\*hi\\*d", "*hi*d")
   241  	l.Add("d\\*hi\\*d", "d*hi*d")
   242  	l.Add("\\", "\\")
   243  	l.Add("\\\\", "\\\\")
   244  	l.Add("\\d", "\\d")
   245  	l.Add("\\\\d", "\\\\d")
   246  	l.Add("\\\\\\d", "\\\\\\d")
   247  	l.Add("d\\", "d\\")
   248  	l.Add("\\d\\", "\\d\\")
   249  	l.Add("*_hi_*", "<i><u>hi</u></i>")
   250  	l.Add("*~hi~*", "<i><s>hi</s></i>")
   251  	//l.Add("~*hi*~", "<s><i>hi</i></s>")
   252  	//l.Add("~ *hi* ~", "<s> <i>hi</i> </s>")
   253  	l.Add("_~hi~_", "<u><s>hi</s></u>")
   254  	l.Add("***~hi~***", "<b><i><s>hi</s></i></b>")
   255  	l.Add("**", "**")
   256  	l.Add("***", "***")
   257  	l.Add("****", "****")
   258  	l.Add("*****", "*****")
   259  	l.Add("******", "******")
   260  	l.Add("*******", "*******")
   261  	l.Add("~~", "~~")
   262  	l.Add("~~~", "~~~")
   263  	l.Add("~~~~", "~~~~")
   264  	l.Add("~~~~~", "~~~~~")
   265  	l.Add("|hi|", "<spoiler>hi</spoiler>")
   266  	l.Add("__", "__")
   267  	l.Add("___", "___")
   268  	l.Add("_ _", "<u> </u>")
   269  	l.Add("* *", "<i> </i>")
   270  	l.Add("** **", "<b> </b>")
   271  	l.Add("*** ***", "<b><i> </i></b>")
   272  	l.Add("-你好-", "-你好-")
   273  	l.Add("*-你好-*", "<i>-你好-</i>") // TODO: More of these Unicode tests? Emoji, Chinese, etc.?
   274  
   275  	for _, item := range l.Items {
   276  		if res := e.MarkdownParse(item.Msg); res != item.Expects {
   277  			t.Error("Testing string '" + item.Msg + "'")
   278  			t.Error("Bad output:", "'"+res+"'")
   279  			//t.Error("Ouput in bytes:", []byte(res))
   280  			t.Error("Expected:", "'"+item.Expects+"'")
   281  		}
   282  	}
   283  
   284  	for _, item := range l2.Items {
   285  		if res := e.MarkdownParse(item.Msg); res != item.Expects {
   286  			t.Error("Testing string '" + item.Msg + "'")
   287  			t.Error("Bad output:", "'"+res+"'")
   288  			//t.Error("Ouput in bytes:", []byte(res))
   289  			t.Error("Expected:", "'"+item.Expects+"'")
   290  		}
   291  	}
   292  
   293  	/*for _, item := range l.Items {
   294  		if res := e.MarkdownParse("d" + item.Msg); res != "d"+item.Expects {
   295  			t.Error("Testing string 'd" + item.Msg + "'")
   296  			t.Error("Bad output:", "'"+res+"'")
   297  			//t.Error("Ouput in bytes:", []byte(res))
   298  			t.Error("Expected:", "'d"+item.Expects+"'")
   299  		}
   300  	}*/
   301  
   302  	// TODO: Write suffix tests and double string tests
   303  	// 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.
   304  }