222 lines
7.5 KiB
Go
222 lines
7.5 KiB
Go
|
// Copyright 2015 Frustra. All rights reserved.
|
||
|
// Use of this source code is governed by the MIT
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package bbcode
|
||
|
|
||
|
import (
|
||
|
"strings"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
var fullTestInput = `the quick brown [b]fox[/b]:
|
||
|
[url=http://example][img]http://example.png[/img][/url]`
|
||
|
|
||
|
var fullTestOutput = `the quick brown <b>fox</b>:<br><a href="http://example"><img src="http://example.png"></a>`
|
||
|
|
||
|
func TestFullBasic(t *testing.T) {
|
||
|
c := NewCompiler(false, false)
|
||
|
input := fullTestInput
|
||
|
output := fullTestOutput
|
||
|
for in, out := range basicTests {
|
||
|
input += in
|
||
|
output += out
|
||
|
}
|
||
|
result := c.Compile(input)
|
||
|
if result != output {
|
||
|
t.Errorf("Failed to compile %s.\nExpected: %s, got: %s\n", input, output, result)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkFullBasic(b *testing.B) {
|
||
|
c := NewCompiler(false, false)
|
||
|
input := fullTestInput
|
||
|
for in := range basicTests {
|
||
|
input += in
|
||
|
}
|
||
|
b.SetBytes(int64(len(input)))
|
||
|
b.ReportAllocs()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
c.Compile(input)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var basicTests = map[string]string{
|
||
|
``: ``,
|
||
|
`[url]http://example.com[/url]`: `<a href="http://example.com">http://example.com</a>`,
|
||
|
`[img]http://example.com[/img]`: `<img src="http://example.com">`,
|
||
|
`[img][/img]`: `<img src="">`,
|
||
|
|
||
|
`[url=http://example.com]example[/url]`: `<a href="http://example.com">example</a>`,
|
||
|
`[img=http://example.com][/img]`: `<img src="http://example.com">`,
|
||
|
|
||
|
`[B]bold[/b]`: `<b>bold</b>`,
|
||
|
`[i]italic[/i]`: `<i>italic</i>`,
|
||
|
`[u]underline[/U]`: `<u>underline</u>`,
|
||
|
`[s]strikethrough[/s]`: `<s>strikethrough</s>`,
|
||
|
|
||
|
`[u][b]something[/b] then [b]something else[/b][/u]`: `<u><b>something</b> then <b>something else</b></u>`,
|
||
|
`blank[b][/b]`: `blank<b></b>`,
|
||
|
|
||
|
"test\nnewline\nnewline": `test<br>newline<br>newline`,
|
||
|
"test\n\nnewline": `test<br><br>newline`,
|
||
|
"[b]test[/b]\n\nnewline": `<b>test</b><br><br>newline`,
|
||
|
"[b]test\nnewline[/b]": `<b>test<br>newline</b>`,
|
||
|
|
||
|
"[code][b]some[/b]\n[i]stuff[/i]\n[/quote][/code][b]more[/b]": "<pre>[b]some[/b]\n[i]stuff[/i]\n[/quote]</pre><b>more</b>",
|
||
|
"[quote name=Someguy]hello[/quote]": `<blockquote><cite>Someguy said:</cite>hello</blockquote>`,
|
||
|
"[center]hello[/center]": `<div style="text-align: center;">hello</div>`,
|
||
|
"[size=6]hello[/size]": `<span class="size6">hello</span>`,
|
||
|
"[center][b][color=#00BFFF][size=6]hello[/size][/color][/b][/center]": `<div style="text-align: center;"><b><span style="color: #00BFFF;"><span class="size6">hello</span></span></b></div>`,
|
||
|
|
||
|
`[not a tag][/not ]`: `[not a tag][/not ]`,
|
||
|
`[not a tag]`: `[not a tag]`,
|
||
|
}
|
||
|
var basicMultiArgTests = map[string][]string{
|
||
|
`[img=http://example.com]alt text[/img]`: []string{`<img`, ` src="http://example.com"`, ` alt="alt text"`, ` title="alt text"`, `>`},
|
||
|
`[img = foo]bar[/img]`: []string{`<img`, ` src="foo"`, ` alt="bar"`, ` title="bar"`, `>`},
|
||
|
}
|
||
|
|
||
|
func TestCompile(t *testing.T) {
|
||
|
c := NewCompiler(false, false)
|
||
|
for in, out := range basicTests {
|
||
|
result := c.Compile(in)
|
||
|
if result != out {
|
||
|
t.Errorf("Failed to compile %s.\nExpected: %s, got: %s\n", in, out, result)
|
||
|
}
|
||
|
}
|
||
|
for in, out := range basicMultiArgTests {
|
||
|
result := c.Compile(in)
|
||
|
if !strings.HasPrefix(result, out[0]) || !strings.HasSuffix(result, out[len(out)-1]) {
|
||
|
t.Errorf("Failed to compile %s.\nExpected: %s, got: %s\n", in, out, result)
|
||
|
}
|
||
|
for i := 1; i < len(out)-1; i++ {
|
||
|
if !strings.Contains(result, out[i]) {
|
||
|
t.Errorf("Failed to compile %s.\nExpected: %s, got: %s\n", in, out, result)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var sanitizationTests = map[string]string{
|
||
|
`<script>`: `<script>`,
|
||
|
`[url]<script>[/url]`: `<a href="%3Cscript%3E"><script></a>`,
|
||
|
|
||
|
`[url=<script>]<script>[/url]`: `<a href="%3Cscript%3E"><script></a>`,
|
||
|
|
||
|
`[url=http://a.b/z?\]link[/url]`: `<a href="http://a.b/z?\">link</a>`,
|
||
|
}
|
||
|
var sanitizationMultiArgTests = map[string][]string{
|
||
|
`[img=<script>]<script>[/img]`: []string{`<img`, ` src="%3Cscript%3E"`, ` alt="<script>"`, ` title="<script>"`, `>`},
|
||
|
`[img="http://\"a.b/z"]"link"\[/img]`: []string{`<img`, ` src="http://"a.b/z"`, ` alt=""link"\"`, ` title=""link"\"`, `>`},
|
||
|
}
|
||
|
|
||
|
func TestSanitization(t *testing.T) {
|
||
|
c := NewCompiler(false, false)
|
||
|
for in, out := range sanitizationTests {
|
||
|
result := c.Compile(in)
|
||
|
if result != out {
|
||
|
t.Errorf("Failed to compile %s.\nExpected: %s, got: %s\n", in, out, result)
|
||
|
}
|
||
|
}
|
||
|
for in, out := range sanitizationMultiArgTests {
|
||
|
result := c.Compile(in)
|
||
|
if !strings.HasPrefix(result, out[0]) || !strings.HasSuffix(result, out[len(out)-1]) {
|
||
|
t.Errorf("Failed to compile %s.\nExpected: %s, got: %s\n", in, out, result)
|
||
|
}
|
||
|
for i := 1; i < len(out)-1; i++ {
|
||
|
if !strings.Contains(result, out[i]) {
|
||
|
t.Errorf("Failed to compile %s.\nExpected: %s, got: %s\n", in, out, result)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestFullSanitization(t *testing.T) {
|
||
|
c := NewCompiler(false, false)
|
||
|
input := fullTestInput
|
||
|
output := fullTestOutput
|
||
|
for in, out := range sanitizationTests {
|
||
|
input += in
|
||
|
output += out
|
||
|
}
|
||
|
result := c.Compile(input)
|
||
|
if result != output {
|
||
|
t.Errorf("Failed to compile %s.\nExpected: %s, got: %s\n", input, output, result)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkFullSanitization(b *testing.B) {
|
||
|
c := NewCompiler(false, false)
|
||
|
input := fullTestInput
|
||
|
for in := range sanitizationTests {
|
||
|
input += in
|
||
|
}
|
||
|
b.SetBytes(int64(len(input)))
|
||
|
b.ReportAllocs()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
c.Compile(input)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var brokenTests = map[string]string{
|
||
|
"[b]": `[b]`,
|
||
|
"[b]\n": `[b]<br>`,
|
||
|
"[b]hello": `[b]hello`,
|
||
|
"[b]hello\n": `[b]hello<br>`,
|
||
|
"the quick brown [b][i]fox[/b][/i]\n[i]\n[b]hi[/b]][b][url=http://example[img]http://example.png[/img][/url][b]": `the quick brown <b>[i]fox</b>[/i]<br>[i]<br><b>hi</b>][b][url=http://example<img src="http://example.png">[/url][b]`,
|
||
|
"the quick brown[/b][b]hello[/b]": `the quick brown[/b]<b>hello</b>`,
|
||
|
"the quick brown[/b][/code]": `the quick brown[/b][/code]`,
|
||
|
"[ b][ i]the quick brown[/i][/b=hello]": `[ b]<i>the quick brown</i>[/b=hello]`,
|
||
|
"[b [herp@#$%]]the quick brown[/b]": `[b [herp@#$%]]the quick brown[/b]`,
|
||
|
"[b=hello a=hi q]the quick brown[/b]": `<b>the quick brown</b>`,
|
||
|
"[b]hi[": `[b]hi[`,
|
||
|
"[b hi=derp": `[b hi=derp`,
|
||
|
}
|
||
|
|
||
|
func TestBroken(t *testing.T) {
|
||
|
c := NewCompiler(false, false)
|
||
|
for in, out := range brokenTests {
|
||
|
result := c.Compile(in)
|
||
|
if result != out {
|
||
|
t.Errorf("Failed to compile %s.\nExpected: %s, got: %s\n", in, out, result)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkFullBroken(b *testing.B) {
|
||
|
c := NewCompiler(false, false)
|
||
|
input := fullTestInput
|
||
|
for in := range brokenTests {
|
||
|
input += in
|
||
|
}
|
||
|
b.SetBytes(int64(len(input)))
|
||
|
b.ReportAllocs()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
c.Compile(input)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var customTests = map[string]string{
|
||
|
`[img]//foo/bar.png[/img]`: `<img src="//custom.png">`,
|
||
|
`[url]//foo/bar.png[/url]`: `[url]//foo/bar.png[/url]`,
|
||
|
}
|
||
|
|
||
|
func compileImg(node *BBCodeNode) (*HTMLTag, bool) {
|
||
|
out, appendExpr := DefaultTagCompilers["img"](node)
|
||
|
out.Attrs["src"] = "//custom.png"
|
||
|
return out, appendExpr
|
||
|
}
|
||
|
|
||
|
func TestCompileCustom(t *testing.T) {
|
||
|
c := NewCompiler(false, false)
|
||
|
c.SetTag("url", nil)
|
||
|
c.SetTag("img", compileImg)
|
||
|
for in, out := range customTests {
|
||
|
result := c.Compile(in)
|
||
|
if result != out {
|
||
|
t.Errorf("Failed to compile %s.\nExpected: %s, got: %s\n", in, out, result)
|
||
|
}
|
||
|
}
|
||
|
}
|