Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

131 строка
4.0 KiB

13 лет назад
13 лет назад
13 лет назад
14 лет назад
13 лет назад
14 лет назад
14 лет назад
14 лет назад
14 лет назад
14 лет назад
13 лет назад
14 лет назад
13 лет назад
13 лет назад
14 лет назад
13 лет назад
14 лет назад
13 лет назад
13 лет назад
14 лет назад
13 лет назад
  1. #! /usr/bin/env escript
  2. % This file is part of Jiffy released under the MIT license.
  3. % See the LICENSE file for more information.
  4. main([]) ->
  5. code:add_pathz("ebin"),
  6. code:add_pathz("test"),
  7. etap:plan(119),
  8. util:test_good(good()),
  9. util:test_good(uescaped(), [uescape]),
  10. util:test_errors(errors()),
  11. test_utf8(utf8_cases()),
  12. etap:end_tests().
  13. good() ->
  14. [
  15. {<<"\"\"">>, <<"">>},
  16. {<<"\"/\"">>, <<"/">>},
  17. {<<"\"0\"">>, <<"0">>},
  18. {<<"\"foo\"">>, <<"foo">>},
  19. {<<"\"\\\"foobar\\\"\"">>, <<"\"foobar\"">>},
  20. {<<"\"\\n\\n\\n\"">>, <<"\n\n\n">>},
  21. {<<"\"\\\" \\b\\f\\r\\n\\t\\\"\"">>, <<"\" \b\f\r\n\t\"">>},
  22. {<<"\"foo\\u0005bar\"">>, <<"foo", 5, "bar">>},
  23. {
  24. <<"\"\\uD834\\uDD1E\"">>,
  25. <<240, 157, 132, 158>>,
  26. <<34, 240, 157, 132, 158, 34>>
  27. }
  28. ].
  29. uescaped() ->
  30. [
  31. {
  32. <<"\"\\u8CA8\\u5481\\u3002\\u0091\\u0091\"">>,
  33. <<232,178,168,229,146,129,227,128,130,194,145,194,145>>
  34. },
  35. {
  36. <<"\"\\uD834\\uDD1E\"">>,
  37. <<240, 157, 132, 158>>
  38. },
  39. {
  40. <<"\"\\uD83D\\uDE0A\"">>,
  41. <<240, 159, 152, 138>>
  42. }
  43. ].
  44. errors() ->
  45. [
  46. "\"",
  47. <<"\"foo">>,
  48. <<"\"", 0, "\"">>,
  49. <<"\"\\g\"">>,
  50. <<"\"\\uFFFF\"">>,
  51. <<"\"\\uFFFE\"">>,
  52. <<"\"\\uD834foo\\uDD1E\"">>,
  53. % CouchDB-345
  54. <<34,78,69,73,77,69,78,32,70,216,82,82,32,70,65,69,78,33,34>>
  55. ].
  56. test_utf8([]) ->
  57. ok;
  58. test_utf8([{Case, Fixed} | Rest]) ->
  59. etap:fun_is(
  60. fun({error, invalid_string}) -> true; (Else) -> Else end,
  61. (catch jiffy:encode(Case)),
  62. lists:flatten(io_lib:format("Invalid utf-8: ~p", [Case]))
  63. ),
  64. etap:fun_is(
  65. fun(Fixed) -> true; (Else) -> Else end,
  66. jiffy:encode(Case, [force_utf8]),
  67. lists:flatten(io_lib:format("Fixed correctly: ~p", [Fixed]))
  68. ),
  69. Case2 = <<34, Case/binary, 34>>,
  70. etap:fun_is(
  71. fun({error, {_, invalid_string}}) -> true; (Else) -> Else end,
  72. (catch jiffy:decode(Case2)),
  73. lists:flatten(io_lib:format("Invalid utf-8: ~p", [Case2]))
  74. ),
  75. test_utf8(Rest).
  76. utf8_cases() ->
  77. [
  78. % Stray continuation byte
  79. {<<16#C2, 16#81, 16#80>>, <<16#C2, 16#81, 16#EF, 16#BF, 16#BD>>},
  80. {<<"foo", 16#80, "bar">>, <<"foo", 16#EF, 16#BF, 16#BD, "bar">>},
  81. % Invalid Unicode code points
  82. {<<239, 191, 190>>, <<16#EF, 16#BF, 16#BD>>},
  83. {<<237, 160, 129>>, <<16#EF, 16#BF, 16#BD>>},
  84. % Not enough extension bytes
  85. {<<16#C0>>, <<16#EF, 16#BF, 16#BD>>},
  86. {<<16#E0>>, <<16#EF, 16#BF, 16#BD>>},
  87. {<<16#E0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  88. {<<16#F0>>, <<16#EF, 16#BF, 16#BD>>},
  89. {<<16#F0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  90. {<<16#F0, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  91. {<<16#F8>>, <<16#EF, 16#BF, 16#BD>>},
  92. {<<16#F8, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  93. {<<16#F8, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  94. {<<16#F8, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  95. {<<16#FC>>, <<16#EF, 16#BF, 16#BD>>},
  96. {<<16#FC, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  97. {<<16#FC, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  98. {<<16#FC, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  99. {<<16#FC, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  100. % No data in high bits.
  101. {<<16#C0, 16#80>>, <<"\"\\u0000\"">>},
  102. {<<16#C1, 16#80>>, <<"\"\\u0000\"">>},
  103. {<<16#E0, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  104. {<<16#E0, 16#90, 16#80>>, <<"\"\\u0000\"">>},
  105. {<<16#F0, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  106. {<<16#F0, 16#88, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  107. {<<16#F8, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  108. {<<16#F8, 16#84, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  109. {<<16#FC, 16#80, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  110. {<<16#FC, 16#82, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>}
  111. ].