Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

129 рядки
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(116),
  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. {<<"\"0\"">>, <<"0">>},
  17. {<<"\"foo\"">>, <<"foo">>},
  18. {<<"\"\\\"foobar\\\"\"">>, <<"\"foobar\"">>},
  19. {<<"\"\\n\\n\\n\"">>, <<"\n\n\n">>},
  20. {<<"\"\\\" \\b\\f\\r\\n\\t\\\"\"">>, <<"\" \b\f\r\n\t\"">>},
  21. {<<"\"foo\\u0005bar\"">>, <<"foo", 5, "bar">>},
  22. {
  23. <<"\"\\uD834\\uDD1E\"">>,
  24. <<240, 157, 132, 158>>,
  25. <<34, 240, 157, 132, 158, 34>>
  26. }
  27. ].
  28. uescaped() ->
  29. [
  30. {
  31. <<"\"\\u8CA8\\u5481\\u3002\\u0091\\u0091\"">>,
  32. <<232,178,168,229,146,129,227,128,130,194,145,194,145>>
  33. },
  34. {
  35. <<"\"\\uD834\\uDD1E\"">>,
  36. <<240, 157, 132, 158>>
  37. },
  38. {
  39. <<"\"\\uD83D\\uDE0A\"">>,
  40. <<240, 159, 152, 138>>
  41. }
  42. ].
  43. errors() ->
  44. [
  45. <<"\"foo">>,
  46. <<"\"", 0, "\"">>,
  47. <<"\"\\g\"">>,
  48. <<"\"\\uFFFF\"">>,
  49. <<"\"\\uFFFE\"">>,
  50. <<"\"\\uD834foo\\uDD1E\"">>,
  51. % CouchDB-345
  52. <<34,78,69,73,77,69,78,32,70,216,82,82,32,70,65,69,78,33,34>>
  53. ].
  54. test_utf8([]) ->
  55. ok;
  56. test_utf8([{Case, Fixed} | Rest]) ->
  57. etap:fun_is(
  58. fun({error, invalid_string}) -> true; (Else) -> Else end,
  59. (catch jiffy:encode(Case)),
  60. lists:flatten(io_lib:format("Invalid utf-8: ~p", [Case]))
  61. ),
  62. etap:fun_is(
  63. fun(Fixed) -> true; (Else) -> Else end,
  64. jiffy:encode(Case, [force_utf8]),
  65. lists:flatten(io_lib:format("Fixed correctly: ~p", [Fixed]))
  66. ),
  67. Case2 = <<34, Case/binary, 34>>,
  68. etap:fun_is(
  69. fun({error, {_, invalid_string}}) -> true; (Else) -> Else end,
  70. (catch jiffy:decode(Case2)),
  71. lists:flatten(io_lib:format("Invalid utf-8: ~p", [Case2]))
  72. ),
  73. test_utf8(Rest).
  74. utf8_cases() ->
  75. [
  76. % Stray continuation byte
  77. {<<16#C2, 16#81, 16#80>>, <<16#C2, 16#81, 16#EF, 16#BF, 16#BD>>},
  78. {<<"foo", 16#80, "bar">>, <<"foo", 16#EF, 16#BF, 16#BD, "bar">>},
  79. % Invalid Unicode code points
  80. {<<239, 191, 190>>, <<16#EF, 16#BF, 16#BD>>},
  81. {<<237, 160, 129>>, <<16#EF, 16#BF, 16#BD>>},
  82. % Not enough extension bytes
  83. {<<16#C0>>, <<16#EF, 16#BF, 16#BD>>},
  84. {<<16#E0>>, <<16#EF, 16#BF, 16#BD>>},
  85. {<<16#E0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  86. {<<16#F0>>, <<16#EF, 16#BF, 16#BD>>},
  87. {<<16#F0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  88. {<<16#F0, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  89. {<<16#F8>>, <<16#EF, 16#BF, 16#BD>>},
  90. {<<16#F8, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  91. {<<16#F8, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  92. {<<16#F8, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  93. {<<16#FC>>, <<16#EF, 16#BF, 16#BD>>},
  94. {<<16#FC, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  95. {<<16#FC, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  96. {<<16#FC, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  97. {<<16#FC, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  98. % No data in high bits.
  99. {<<16#C0, 16#80>>, <<"\"\\u0000\"">>},
  100. {<<16#C1, 16#80>>, <<"\"\\u0000\"">>},
  101. {<<16#E0, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  102. {<<16#E0, 16#90, 16#80>>, <<"\"\\u0000\"">>},
  103. {<<16#F0, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  104. {<<16#F0, 16#88, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  105. {<<16#F8, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  106. {<<16#F8, 16#84, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  107. {<<16#FC, 16#80, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  108. {<<16#FC, 16#82, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>}
  109. ].