encoder_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package utf7_test
  2. import (
  3. "github.com/Jinnrry/pmail/utils/utf7"
  4. "testing"
  5. )
  6. var encode = []struct {
  7. in string
  8. out string
  9. ok bool
  10. }{
  11. // Printable ASCII
  12. {"", "", true},
  13. {"a", "a", true},
  14. {"ab", "ab", true},
  15. {"-", "-", true},
  16. {"&", "&-", true},
  17. {"&&", "&-&-", true},
  18. {"&&&-&", "&-&-&--&-", true},
  19. {"-&*&-", "-&-*&--", true},
  20. {"a&b", "a&-b", true},
  21. {"a&", "a&-", true},
  22. {"&b", "&-b", true},
  23. {"-a&", "-a&-", true},
  24. {"&b-", "&-b-", true},
  25. // Unicode range
  26. {"\u0000", "&AAA-", true},
  27. {"\n", "&AAo-", true},
  28. {"\r", "&AA0-", true},
  29. {"\u001F", "&AB8-", true},
  30. {"\u0020", " ", true},
  31. {"\u0025", "%", true},
  32. {"\u0026", "&-", true},
  33. {"\u0027", "'", true},
  34. {"\u007E", "~", true},
  35. {"\u007F", "&AH8-", true},
  36. {"\u0080", "&AIA-", true},
  37. {"\u00FF", "&AP8-", true},
  38. {"\u07FF", "&B,8-", true},
  39. {"\u0800", "&CAA-", true},
  40. {"\uFFEF", "&,+8-", true},
  41. {"\uFFFF", "&,,8-", true},
  42. {"\U00010000", "&2ADcAA-", true},
  43. {"\U0010FFFF", "&2,,f,w-", true},
  44. // Padding
  45. {"\x00\x1F", "&AAAAHw-", true}, // 2
  46. {"\x00\x1F\x7F", "&AAAAHwB,-", true}, // 0
  47. {"\x00\x1F\x7F\u0080", "&AAAAHwB,AIA-", true}, // 1
  48. {"\x00\x1F\x7F\u0080\u00FF", "&AAAAHwB,AIAA,w-", true}, // 2
  49. // Mix
  50. {"a\x00", "a&AAA-", true},
  51. {"\x00a", "&AAA-a", true},
  52. {"&\x00", "&-&AAA-", true},
  53. {"\x00&", "&AAA-&-", true},
  54. {"a\x00&", "a&AAA-&-", true},
  55. {"a&\x00", "a&-&AAA-", true},
  56. {"&a\x00", "&-a&AAA-", true},
  57. {"&\x00a", "&-&AAA-a", true},
  58. {"\x00&a", "&AAA-&-a", true},
  59. {"\x00a&", "&AAA-a&-", true},
  60. {"ab&\uFFFF", "ab&-&,,8-", true},
  61. {"a&b\uFFFF", "a&-b&,,8-", true},
  62. {"&ab\uFFFF", "&-ab&,,8-", true},
  63. {"ab\uFFFF&", "ab&,,8-&-", true},
  64. {"a\uFFFFb&", "a&,,8-b&-", true},
  65. {"\uFFFFab&", "&,,8-ab&-", true},
  66. {"\x20\x25&\x27\x7E", " %&-'~", true},
  67. {"\x1F\x20&\x7E\x7F", "&AB8- &-~&AH8-", true},
  68. {"&\x00\x19\x7F\u0080", "&-&AAAAGQB,AIA-", true},
  69. {"\x00&\x19\x7F\u0080", "&AAA-&-&ABkAfwCA-", true},
  70. {"\x00\x19&\x7F\u0080", "&AAAAGQ-&-&AH8AgA-", true},
  71. {"\x00\x19\x7F&\u0080", "&AAAAGQB,-&-&AIA-", true},
  72. {"\x00\x19\x7F\u0080&", "&AAAAGQB,AIA-&-", true},
  73. {"&\x00\x1F\x7F\u0080", "&-&AAAAHwB,AIA-", true},
  74. {"\x00&\x1F\x7F\u0080", "&AAA-&-&AB8AfwCA-", true},
  75. {"\x00\x1F&\x7F\u0080", "&AAAAHw-&-&AH8AgA-", true},
  76. {"\x00\x1F\x7F&\u0080", "&AAAAHwB,-&-&AIA-", true},
  77. {"\x00\x1F\x7F\u0080&", "&AAAAHwB,AIA-&-", true},
  78. // Russian
  79. {"\u041C\u0430\u043A\u0441\u0438\u043C \u0425\u0438\u0442\u0440\u043E\u0432",
  80. "&BBwEMAQ6BEEEOAQ8- &BCUEOARCBEAEPgQy-", true},
  81. // RFC 3501
  82. {"~peter/mail/\u53F0\u5317/\u65E5\u672C\u8A9E", "~peter/mail/&U,BTFw-/&ZeVnLIqe-", true},
  83. {"~peter/mail/\u53F0\u5317/\u65E5\u672C\u8A9E", "~peter/mail/&U,BTFw-/&ZeVnLIqe-", true},
  84. {"\u263A!", "&Jjo-!", true},
  85. {"\u53F0\u5317\u65E5\u672C\u8A9E", "&U,BTF2XlZyyKng-", true},
  86. // RFC 2152 (modified)
  87. {"\u0041\u2262\u0391\u002E", "A&ImIDkQ-.", true},
  88. {"Hi Mom -\u263A-!", "Hi Mom -&Jjo--!", true},
  89. {"\u65E5\u672C\u8A9E", "&ZeVnLIqe-", true},
  90. // 8->16 and 24->16 byte UTF-8 to UTF-16 conversion
  91. {"\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007", "&AAAAAQACAAMABAAFAAYABw-", true},
  92. {"\u0800\u0801\u0802\u0803\u0804\u0805\u0806\u0807", "&CAAIAQgCCAMIBAgFCAYIBw-", true},
  93. // Invalid UTF-8 (bad bytes are converted to U+FFFD)
  94. {"\xC0\x80", "&,,3,,Q-", false}, // U+0000
  95. {"\xF4\x90\x80\x80", "&,,3,,f,9,,0-", false}, // U+110000
  96. {"\xF7\xBF\xBF\xBF", "&,,3,,f,9,,0-", false}, // U+1FFFFF
  97. {"\xF8\x88\x80\x80\x80", "&,,3,,f,9,,3,,Q-", false}, // U+200000
  98. {"\xF4\x8F\xBF\x3F", "&,,3,,f,9-?", false}, // U+10FFFF (bad byte)
  99. {"\xF4\x8F\xBF", "&,,3,,f,9-", false}, // U+10FFFF (short)
  100. {"\xF4\x8F", "&,,3,,Q-", false},
  101. {"\xF4", "&,,0-", false},
  102. {"\x00\xF4\x00", "&AAD,,QAA-", false},
  103. }
  104. func TestEncoder(t *testing.T) {
  105. for _, test := range encode {
  106. out := utf7.Encode(test.in)
  107. if out != test.out {
  108. t.Errorf("UTF7Encode(%+q) expected %+q; got %+q", test.in, test.out, out)
  109. }
  110. }
  111. }