...

Source file src/html/escape_test.go

Documentation: html

		 1  // Copyright 2013 The Go Authors. All rights reserved.
		 2  // Use of this source code is governed by a BSD-style
		 3  // license that can be found in the LICENSE file.
		 4  
		 5  package html
		 6  
		 7  import (
		 8  	"strings"
		 9  	"testing"
		10  )
		11  
		12  type unescapeTest struct {
		13  	// A short description of the test case.
		14  	desc string
		15  	// The HTML text.
		16  	html string
		17  	// The unescaped text.
		18  	unescaped string
		19  }
		20  
		21  var unescapeTests = []unescapeTest{
		22  	// Handle no entities.
		23  	{
		24  		"copy",
		25  		"A\ttext\nstring",
		26  		"A\ttext\nstring",
		27  	},
		28  	// Handle simple named entities.
		29  	{
		30  		"simple",
		31  		"& > <",
		32  		"& > <",
		33  	},
		34  	// Handle hitting the end of the string.
		35  	{
		36  		"stringEnd",
		37  		"&amp &amp",
		38  		"& &",
		39  	},
		40  	// Handle entities with two codepoints.
		41  	{
		42  		"multiCodepoint",
		43  		"text &gesl; blah",
		44  		"text \u22db\ufe00 blah",
		45  	},
		46  	// Handle decimal numeric entities.
		47  	{
		48  		"decimalEntity",
		49  		"Delta = &#916; ",
		50  		"Delta = Δ ",
		51  	},
		52  	// Handle hexadecimal numeric entities.
		53  	{
		54  		"hexadecimalEntity",
		55  		"Lambda = &#x3bb; = &#X3Bb ",
		56  		"Lambda = λ = λ ",
		57  	},
		58  	// Handle numeric early termination.
		59  	{
		60  		"numericEnds",
		61  		"&# &#x &#128;43 &copy = &#169f = &#xa9",
		62  		"&# &#x €43 © = ©f = ©",
		63  	},
		64  	// Handle numeric ISO-8859-1 entity replacements.
		65  	{
		66  		"numericReplacements",
		67  		"Footnote&#x87;",
		68  		"Footnote‡",
		69  	},
		70  	// Handle single ampersand.
		71  	{
		72  		"copySingleAmpersand",
		73  		"&",
		74  		"&",
		75  	},
		76  	// Handle ampersand followed by non-entity.
		77  	{
		78  		"copyAmpersandNonEntity",
		79  		"text &test",
		80  		"text &test",
		81  	},
		82  	// Handle "&#".
		83  	{
		84  		"copyAmpersandHash",
		85  		"text &#",
		86  		"text &#",
		87  	},
		88  }
		89  
		90  func TestUnescape(t *testing.T) {
		91  	for _, tt := range unescapeTests {
		92  		unescaped := UnescapeString(tt.html)
		93  		if unescaped != tt.unescaped {
		94  			t.Errorf("TestUnescape %s: want %q, got %q", tt.desc, tt.unescaped, unescaped)
		95  		}
		96  	}
		97  }
		98  
		99  func TestUnescapeEscape(t *testing.T) {
	 100  	ss := []string{
	 101  		``,
	 102  		`abc def`,
	 103  		`a & b`,
	 104  		`a&amp;b`,
	 105  		`a &amp b`,
	 106  		`&quot;`,
	 107  		`"`,
	 108  		`"<&>"`,
	 109  		`&quot;&lt;&amp;&gt;&quot;`,
	 110  		`3&5==1 && 0<1, "0&lt;1", a+acute=&aacute;`,
	 111  		`The special characters are: <, >, &, ' and "`,
	 112  	}
	 113  	for _, s := range ss {
	 114  		if got := UnescapeString(EscapeString(s)); got != s {
	 115  			t.Errorf("got %q want %q", got, s)
	 116  		}
	 117  	}
	 118  }
	 119  
	 120  var (
	 121  	benchEscapeData		 = strings.Repeat("AAAAA < BBBBB > CCCCC & DDDDD ' EEEEE \" ", 100)
	 122  	benchEscapeNone		 = strings.Repeat("AAAAA x BBBBB x CCCCC x DDDDD x EEEEE x ", 100)
	 123  	benchUnescapeSparse = strings.Repeat(strings.Repeat("AAAAA x BBBBB x CCCCC x DDDDD x EEEEE x ", 10)+"&amp;", 10)
	 124  	benchUnescapeDense	= strings.Repeat("&amp;&lt; &amp; &lt;", 100)
	 125  )
	 126  
	 127  func BenchmarkEscape(b *testing.B) {
	 128  	n := 0
	 129  	for i := 0; i < b.N; i++ {
	 130  		n += len(EscapeString(benchEscapeData))
	 131  	}
	 132  }
	 133  
	 134  func BenchmarkEscapeNone(b *testing.B) {
	 135  	n := 0
	 136  	for i := 0; i < b.N; i++ {
	 137  		n += len(EscapeString(benchEscapeNone))
	 138  	}
	 139  }
	 140  
	 141  func BenchmarkUnescape(b *testing.B) {
	 142  	s := EscapeString(benchEscapeData)
	 143  	n := 0
	 144  	for i := 0; i < b.N; i++ {
	 145  		n += len(UnescapeString(s))
	 146  	}
	 147  }
	 148  
	 149  func BenchmarkUnescapeNone(b *testing.B) {
	 150  	s := EscapeString(benchEscapeNone)
	 151  	n := 0
	 152  	for i := 0; i < b.N; i++ {
	 153  		n += len(UnescapeString(s))
	 154  	}
	 155  }
	 156  
	 157  func BenchmarkUnescapeSparse(b *testing.B) {
	 158  	n := 0
	 159  	for i := 0; i < b.N; i++ {
	 160  		n += len(UnescapeString(benchUnescapeSparse))
	 161  	}
	 162  }
	 163  
	 164  func BenchmarkUnescapeDense(b *testing.B) {
	 165  	n := 0
	 166  	for i := 0; i < b.N; i++ {
	 167  		n += len(UnescapeString(benchUnescapeDense))
	 168  	}
	 169  }
	 170  

View as plain text