|  | // Copyright 2013 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package html | 
|  |  | 
|  | import ( | 
|  | "strings" | 
|  | "testing" | 
|  | ) | 
|  |  | 
|  | type unescapeTest struct { | 
|  | // A short description of the test case. | 
|  | desc string | 
|  | // The HTML text. | 
|  | html string | 
|  | // The unescaped text. | 
|  | unescaped string | 
|  | } | 
|  |  | 
|  | var unescapeTests = []unescapeTest{ | 
|  | // Handle no entities. | 
|  | { | 
|  | "copy", | 
|  | "A\ttext\nstring", | 
|  | "A\ttext\nstring", | 
|  | }, | 
|  | // Handle simple named entities. | 
|  | { | 
|  | "simple", | 
|  | "& > <", | 
|  | "& > <", | 
|  | }, | 
|  | // Handle hitting the end of the string. | 
|  | { | 
|  | "stringEnd", | 
|  | "& &", | 
|  | "& &", | 
|  | }, | 
|  | // Handle entities with two codepoints. | 
|  | { | 
|  | "multiCodepoint", | 
|  | "text ⋛︀ blah", | 
|  | "text \u22db\ufe00 blah", | 
|  | }, | 
|  | // Handle decimal numeric entities. | 
|  | { | 
|  | "decimalEntity", | 
|  | "Delta = Δ ", | 
|  | "Delta = Δ ", | 
|  | }, | 
|  | // Handle hexadecimal numeric entities. | 
|  | { | 
|  | "hexadecimalEntity", | 
|  | "Lambda = λ = λ ", | 
|  | "Lambda = λ = λ ", | 
|  | }, | 
|  | // Handle numeric early termination. | 
|  | { | 
|  | "numericEnds", | 
|  | "&# &#x €43 © = ©f = ©", | 
|  | "&# &#x €43 © = ©f = ©", | 
|  | }, | 
|  | // Handle numeric ISO-8859-1 entity replacements. | 
|  | { | 
|  | "numericReplacements", | 
|  | "Footnote‡", | 
|  | "Footnote‡", | 
|  | }, | 
|  | // Handle single ampersand. | 
|  | { | 
|  | "copySingleAmpersand", | 
|  | "&", | 
|  | "&", | 
|  | }, | 
|  | // Handle ampersand followed by non-entity. | 
|  | { | 
|  | "copyAmpersandNonEntity", | 
|  | "text &test", | 
|  | "text &test", | 
|  | }, | 
|  | // Handle "&#". | 
|  | { | 
|  | "copyAmpersandHash", | 
|  | "text &#", | 
|  | "text &#", | 
|  | }, | 
|  | } | 
|  |  | 
|  | func TestUnescape(t *testing.T) { | 
|  | for _, tt := range unescapeTests { | 
|  | unescaped := UnescapeString(tt.html) | 
|  | if unescaped != tt.unescaped { | 
|  | t.Errorf("TestUnescape %s: want %q, got %q", tt.desc, tt.unescaped, unescaped) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestUnescapeEscape(t *testing.T) { | 
|  | ss := []string{ | 
|  | ``, | 
|  | `abc def`, | 
|  | `a & b`, | 
|  | `a&b`, | 
|  | `a & b`, | 
|  | `"`, | 
|  | `"`, | 
|  | `"<&>"`, | 
|  | `"<&>"`, | 
|  | `3&5==1 && 0<1, "0<1", a+acute=á`, | 
|  | `The special characters are: <, >, &, ' and "`, | 
|  | } | 
|  | for _, s := range ss { | 
|  | if got := UnescapeString(EscapeString(s)); got != s { | 
|  | t.Errorf("got %q want %q", got, s) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | var ( | 
|  | benchEscapeData     = strings.Repeat("AAAAA < BBBBB > CCCCC & DDDDD ' EEEEE \" ", 100) | 
|  | benchEscapeNone     = strings.Repeat("AAAAA x BBBBB x CCCCC x DDDDD x EEEEE x ", 100) | 
|  | benchUnescapeSparse = strings.Repeat(strings.Repeat("AAAAA x BBBBB x CCCCC x DDDDD x EEEEE x ", 10)+"&", 10) | 
|  | benchUnescapeDense  = strings.Repeat("&< & <", 100) | 
|  | ) | 
|  |  | 
|  | func BenchmarkEscape(b *testing.B) { | 
|  | n := 0 | 
|  | for i := 0; i < b.N; i++ { | 
|  | n += len(EscapeString(benchEscapeData)) | 
|  | } | 
|  | } | 
|  |  | 
|  | func BenchmarkEscapeNone(b *testing.B) { | 
|  | n := 0 | 
|  | for i := 0; i < b.N; i++ { | 
|  | n += len(EscapeString(benchEscapeNone)) | 
|  | } | 
|  | } | 
|  |  | 
|  | func BenchmarkUnescape(b *testing.B) { | 
|  | s := EscapeString(benchEscapeData) | 
|  | n := 0 | 
|  | for i := 0; i < b.N; i++ { | 
|  | n += len(UnescapeString(s)) | 
|  | } | 
|  | } | 
|  |  | 
|  | func BenchmarkUnescapeNone(b *testing.B) { | 
|  | s := EscapeString(benchEscapeNone) | 
|  | n := 0 | 
|  | for i := 0; i < b.N; i++ { | 
|  | n += len(UnescapeString(s)) | 
|  | } | 
|  | } | 
|  |  | 
|  | func BenchmarkUnescapeSparse(b *testing.B) { | 
|  | n := 0 | 
|  | for i := 0; i < b.N; i++ { | 
|  | n += len(UnescapeString(benchUnescapeSparse)) | 
|  | } | 
|  | } | 
|  |  | 
|  | func BenchmarkUnescapeDense(b *testing.B) { | 
|  | n := 0 | 
|  | for i := 0; i < b.N; i++ { | 
|  | n += len(UnescapeString(benchUnescapeDense)) | 
|  | } | 
|  | } |