...

Source file src/gopkg.in/alexcesaro/quotedprintable.v3/writer_test.go

Documentation: gopkg.in/alexcesaro/quotedprintable.v3

     1  package quotedprintable
     2  
     3  import (
     4  	"bytes"
     5  	"io/ioutil"
     6  	"strings"
     7  	"testing"
     8  )
     9  
    10  func TestWriter(t *testing.T) {
    11  	testWriter(t, false)
    12  }
    13  
    14  func TestWriterBinary(t *testing.T) {
    15  	testWriter(t, true)
    16  }
    17  
    18  func testWriter(t *testing.T, binary bool) {
    19  	tests := []struct {
    20  		in, want, wantB string
    21  	}{
    22  		{in: "", want: ""},
    23  		{in: "foo bar", want: "foo bar"},
    24  		{in: "foo bar=", want: "foo bar=3D"},
    25  		{in: "foo bar\r", want: "foo bar\r\n", wantB: "foo bar=0D"},
    26  		{in: "foo bar\r\r", want: "foo bar\r\n\r\n", wantB: "foo bar=0D=0D"},
    27  		{in: "foo bar\n", want: "foo bar\r\n", wantB: "foo bar=0A"},
    28  		{in: "foo bar\r\n", want: "foo bar\r\n", wantB: "foo bar=0D=0A"},
    29  		{in: "foo bar\r\r\n", want: "foo bar\r\n\r\n", wantB: "foo bar=0D=0D=0A"},
    30  		{in: "foo bar ", want: "foo bar=20"},
    31  		{in: "foo bar\t", want: "foo bar=09"},
    32  		{in: "foo bar  ", want: "foo bar =20"},
    33  		{in: "foo bar \n", want: "foo bar=20\r\n", wantB: "foo bar =0A"},
    34  		{in: "foo bar \r", want: "foo bar=20\r\n", wantB: "foo bar =0D"},
    35  		{in: "foo bar \r\n", want: "foo bar=20\r\n", wantB: "foo bar =0D=0A"},
    36  		{in: "foo bar  \n", want: "foo bar =20\r\n", wantB: "foo bar  =0A"},
    37  		{in: "foo bar  \n ", want: "foo bar =20\r\n=20", wantB: "foo bar  =0A=20"},
    38  		{in: "¡Hola Señor!", want: "=C2=A1Hola Se=C3=B1or!"},
    39  		{
    40  			in:   "\t !\"#$%&'()*+,-./ :;<>?@[\\]^_`{|}~",
    41  			want: "\t !\"#$%&'()*+,-./ :;<>?@[\\]^_`{|}~",
    42  		},
    43  		{
    44  			in:   strings.Repeat("a", 75),
    45  			want: strings.Repeat("a", 75),
    46  		},
    47  		{
    48  			in:   strings.Repeat("a", 76),
    49  			want: strings.Repeat("a", 75) + "=\r\na",
    50  		},
    51  		{
    52  			in:   strings.Repeat("a", 72) + "=",
    53  			want: strings.Repeat("a", 72) + "=3D",
    54  		},
    55  		{
    56  			in:   strings.Repeat("a", 73) + "=",
    57  			want: strings.Repeat("a", 73) + "=\r\n=3D",
    58  		},
    59  		{
    60  			in:   strings.Repeat("a", 74) + "=",
    61  			want: strings.Repeat("a", 74) + "=\r\n=3D",
    62  		},
    63  		{
    64  			in:   strings.Repeat("a", 75) + "=",
    65  			want: strings.Repeat("a", 75) + "=\r\n=3D",
    66  		},
    67  		{
    68  			in:   strings.Repeat(" ", 73),
    69  			want: strings.Repeat(" ", 72) + "=20",
    70  		},
    71  		{
    72  			in:   strings.Repeat(" ", 74),
    73  			want: strings.Repeat(" ", 73) + "=\r\n=20",
    74  		},
    75  		{
    76  			in:   strings.Repeat(" ", 75),
    77  			want: strings.Repeat(" ", 74) + "=\r\n=20",
    78  		},
    79  		{
    80  			in:   strings.Repeat(" ", 76),
    81  			want: strings.Repeat(" ", 75) + "=\r\n=20",
    82  		},
    83  		{
    84  			in:   strings.Repeat(" ", 77),
    85  			want: strings.Repeat(" ", 75) + "=\r\n =20",
    86  		},
    87  	}
    88  
    89  	for _, tt := range tests {
    90  		buf := new(bytes.Buffer)
    91  		w := NewWriter(buf)
    92  
    93  		want := tt.want
    94  		if binary {
    95  			w.Binary = true
    96  			if tt.wantB != "" {
    97  				want = tt.wantB
    98  			}
    99  		}
   100  
   101  		if _, err := w.Write([]byte(tt.in)); err != nil {
   102  			t.Errorf("Write(%q): %v", tt.in, err)
   103  			continue
   104  		}
   105  		if err := w.Close(); err != nil {
   106  			t.Errorf("Close(): %v", err)
   107  			continue
   108  		}
   109  		got := buf.String()
   110  		if got != want {
   111  			t.Errorf("Write(%q), got:\n%q\nwant:\n%q", tt.in, got, want)
   112  		}
   113  	}
   114  }
   115  
   116  func TestRoundTrip(t *testing.T) {
   117  	buf := new(bytes.Buffer)
   118  	w := NewWriter(buf)
   119  	if _, err := w.Write(testMsg); err != nil {
   120  		t.Fatalf("Write: %v", err)
   121  	}
   122  	if err := w.Close(); err != nil {
   123  		t.Fatalf("Close: %v", err)
   124  	}
   125  
   126  	r := NewReader(buf)
   127  	gotBytes, err := ioutil.ReadAll(r)
   128  	if err != nil {
   129  		t.Fatalf("Error while reading from Reader: %v", err)
   130  	}
   131  	got := string(gotBytes)
   132  	if got != string(testMsg) {
   133  		t.Errorf("Encoding and decoding changed the message, got:\n%s", got)
   134  	}
   135  }
   136  
   137  // From http://fr.wikipedia.org/wiki/Quoted-Printable
   138  var testMsg = []byte("Quoted-Printable (QP) est un format d'encodage de données codées sur 8 bits, qui utilise exclusivement les caractères alphanumériques imprimables du code ASCII (7 bits).\r\n" +
   139  	"\r\n" +
   140  	"En effet, les différents codages comprennent de nombreux caractères qui ne sont pas représentables en ASCII (par exemple les caractères accentués), ainsi que des caractères dits « non-imprimables ».\r\n" +
   141  	"\r\n" +
   142  	"L'encodage Quoted-Printable permet de remédier à ce problème, en procédant de la manière suivante :\r\n" +
   143  	"\r\n" +
   144  	"Un octet correspondant à un caractère imprimable de l'ASCII sauf le signe égal (donc un caractère de code ASCII entre 33 et 60 ou entre 62 et 126) ou aux caractères de saut de ligne (codes ASCII 13 et 10) ou une suite de tabulations et espaces non situées en fin de ligne (de codes ASCII respectifs 9 et 32) est représenté tel quel.\r\n" +
   145  	"Un octet qui ne correspond pas à la définition ci-dessus (caractère non imprimable de l'ASCII, tabulation ou espaces non suivies d'un caractère imprimable avant la fin de la ligne ou signe égal) est représenté par un signe égal, suivi de son numéro, exprimé en hexadécimal.\r\n" +
   146  	"Enfin, un signe égal suivi par un saut de ligne (donc la suite des trois caractères de codes ASCII 61, 13 et 10) peut être inséré n'importe où, afin de limiter la taille des lignes produites si nécessaire. Une limite de 76 caractères par ligne est généralement respectée.\r\n")
   147  
   148  func BenchmarkWriter(b *testing.B) {
   149  	for i := 0; i < b.N; i++ {
   150  		w := NewWriter(ioutil.Discard)
   151  		w.Write(testMsg)
   152  		w.Close()
   153  	}
   154  }
   155  

View as plain text