| // Copyright 2014 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 quotedprintable |
| |
| import ( |
| "fmt" |
| "strings" |
| "testing" |
| ) |
| |
| func ExampleEncodeHeader() { |
| enc := Q.NewHeaderEncoder("UTF-8") |
| fmt.Println(enc.Encode("Coffee")) |
| fmt.Println(enc.Encode("Café")) |
| // Output: |
| // =?UTF-8?Q?Coffee?= |
| // =?UTF-8?Q?Caf=C3=A9?= |
| } |
| |
| func ExampleNewHeaderEncoder() { |
| e := B.NewHeaderEncoder("UTF-8") |
| fmt.Printf(e.Encode("Caf\xc3")) |
| // Output: =?UTF-8?B?Q2Fmww==?= |
| } |
| |
| func ExampleDecodeHeader() { |
| // text is not encoded in UTF-8 but in ISO-8859-1 |
| text, charset, err := DecodeHeader("=?ISO-8859-1?Q?Caf=C3?=") |
| if err != nil { |
| panic(err) |
| } |
| fmt.Printf("Text: %q, charset: %q", text, charset) |
| // Output: Text: "Caf\xc3", charset: "ISO-8859-1" |
| } |
| |
| func TestEncodeHeader(t *testing.T) { |
| utf8, iso88591 := "UTF-8", "iso-8859-1" |
| tests := []struct { |
| charset string |
| encoding Encoding |
| src, exp string |
| }{ |
| {utf8, Q, "François-Jérôme", "=?UTF-8?Q?Fran=C3=A7ois-J=C3=A9r=C3=B4me?="}, |
| {utf8, B, "André", "=?UTF-8?B?QW5kcsOp?="}, |
| {iso88591, Q, "Rapha\xebl Dupont", "=?iso-8859-1?Q?Rapha=EBl_Dupont?="}, |
| {utf8, Q, "A", "=?UTF-8?Q?A?="}, |
| {utf8, Q, "An 'encoded-word' may not be more than 75 characters long, including 'charset', 'encoding', 'encoded-text', and delimiters. ©", "=?UTF-8?Q?An_'encoded-word'_may_not_be_more_than_75_characters_long,_incl?=\r\n =?UTF-8?Q?uding_'charset',_'encoding',_'encoded-text',_and_delimiters._?=\r\n =?UTF-8?Q?=C2=A9?="}, |
| {utf8, Q, strings.Repeat("0", 62) + "é", "=?UTF-8?Q?" + strings.Repeat("0", 62) + "?=\r\n =?UTF-8?Q?=C3=A9?="}, |
| {utf8, B, strings.Repeat("é", 23), "=?UTF-8?B?w6nDqcOpw6nDqcOpw6nDqcOpw6nDqcOpw6nDqcOpw6nDqcOpw6nDqcOpw6k=?=\r\n =?UTF-8?B?w6k=?="}, |
| } |
| |
| for _, test := range tests { |
| e := test.encoding.NewHeaderEncoder(test.charset) |
| if s := e.Encode(test.src); s != test.exp { |
| t.Errorf("Encode(%q) = %q, want %q", test.src, s, test.exp) |
| } |
| } |
| } |
| |
| func TestDecodeHeader(t *testing.T) { |
| tests := []struct { |
| src, exp, charset string |
| isError bool |
| }{ |
| {"=?UTF-8?Q?Fran=C3=A7ois-J=C3=A9r=C3=B4me?=", "François-Jérôme", "UTF-8", false}, |
| {"=?UTF-8?q?ascii?=", "ascii", "UTF-8", false}, |
| {"=?utf-8?B?QW5kcsOp?=", "André", "UTF-8", false}, |
| {"=?ISO-8859-1?Q?Rapha=EBl_Dupont?=", "Rapha\xebl Dupont", "ISO-8859-1", false}, |
| {"Jean", "Jean", "", false}, |
| {"=?UTF-8?A?Test?=", "=?UTF-8?A?Test?=", "", false}, |
| {"=?UTF-8?Q?A=B?=", "=?UTF-8?Q?A=B?=", "", false}, |
| {"=?UTF-8?Q?=A?=", "=?UTF-8?Q?=A?=", "", false}, |
| {"=?UTF-8?A?A?=", "=?UTF-8?A?A?=", "", false}, |
| // Tests from RFC 2047 |
| {"=?ISO-8859-1?Q?a?=", "a", "ISO-8859-1", false}, |
| {"=?ISO-8859-1?Q?a?= b", "a b", "ISO-8859-1", false}, |
| {"=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=", "ab", "ISO-8859-1", false}, |
| {"=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=", "ab", "ISO-8859-1", false}, |
| {"=?ISO-8859-1?Q?a?= \r\n\t =?ISO-8859-1?Q?b?=", "ab", "ISO-8859-1", false}, |
| {"=?ISO-8859-1?Q?a_b?=", "a b", "ISO-8859-1", false}, |
| {"=?ISO-8859-1?Q?a?= =?ISO-8859-2?Q?_b?=", "", "", true}, |
| } |
| |
| for _, test := range tests { |
| s, charset, err := DecodeHeader(test.src) |
| if test.isError && err == nil { |
| t.Errorf("DecodeHeader(%q) should return an error", test.src) |
| } |
| if !test.isError && err != nil { |
| t.Errorf("DecodeHeader(%q): %v", test.src, err) |
| } |
| if s != test.exp || charset != test.charset { |
| t.Errorf("DecodeHeader(%q) = %q (charset=%q), want %q (charset=%q)", test.src, s, charset, test.exp, test.charset) |
| } |
| } |
| } |
| |
| var testHeader = "¡Hola, señor!" |
| |
| func BenchmarkQEncode(b *testing.B) { |
| enc := Q.NewHeaderEncoder("UTF-8") |
| for i := 0; i < b.N; i++ { |
| enc.Encode(testHeader) |
| } |
| } |
| |
| func BenchmarkBEncode(b *testing.B) { |
| encoder := &HeaderEncoder{charset: "UTF-8", encoding: B, splitWords: true} |
| |
| for i := 0; i < b.N; i++ { |
| encoder.Encode(testHeader) |
| } |
| } |