Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

130 rader
4.0 KiB

  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(118),
  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. <<"\"foo">>,
  47. <<"\"", 0, "\"">>,
  48. <<"\"\\g\"">>,
  49. <<"\"\\uFFFF\"">>,
  50. <<"\"\\uFFFE\"">>,
  51. <<"\"\\uD834foo\\uDD1E\"">>,
  52. % CouchDB-345
  53. <<34,78,69,73,77,69,78,32,70,216,82,82,32,70,65,69,78,33,34>>
  54. ].
  55. test_utf8([]) ->
  56. ok;
  57. test_utf8([{Case, Fixed} | Rest]) ->
  58. etap:fun_is(
  59. fun({error, invalid_string}) -> true; (Else) -> Else end,
  60. (catch jiffy:encode(Case)),
  61. lists:flatten(io_lib:format("Invalid utf-8: ~p", [Case]))
  62. ),
  63. etap:fun_is(
  64. fun(Fixed) -> true; (Else) -> Else end,
  65. jiffy:encode(Case, [force_utf8]),
  66. lists:flatten(io_lib:format("Fixed correctly: ~p", [Fixed]))
  67. ),
  68. Case2 = <<34, Case/binary, 34>>,
  69. etap:fun_is(
  70. fun({error, {_, invalid_string}}) -> true; (Else) -> Else end,
  71. (catch jiffy:decode(Case2)),
  72. lists:flatten(io_lib:format("Invalid utf-8: ~p", [Case2]))
  73. ),
  74. test_utf8(Rest).
  75. utf8_cases() ->
  76. [
  77. % Stray continuation byte
  78. {<<16#C2, 16#81, 16#80>>, <<16#C2, 16#81, 16#EF, 16#BF, 16#BD>>},
  79. {<<"foo", 16#80, "bar">>, <<"foo", 16#EF, 16#BF, 16#BD, "bar">>},
  80. % Invalid Unicode code points
  81. {<<239, 191, 190>>, <<16#EF, 16#BF, 16#BD>>},
  82. {<<237, 160, 129>>, <<16#EF, 16#BF, 16#BD>>},
  83. % Not enough extension bytes
  84. {<<16#C0>>, <<16#EF, 16#BF, 16#BD>>},
  85. {<<16#E0>>, <<16#EF, 16#BF, 16#BD>>},
  86. {<<16#E0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  87. {<<16#F0>>, <<16#EF, 16#BF, 16#BD>>},
  88. {<<16#F0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  89. {<<16#F0, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  90. {<<16#F8>>, <<16#EF, 16#BF, 16#BD>>},
  91. {<<16#F8, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  92. {<<16#F8, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  93. {<<16#F8, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  94. {<<16#FC>>, <<16#EF, 16#BF, 16#BD>>},
  95. {<<16#FC, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  96. {<<16#FC, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  97. {<<16#FC, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  98. {<<16#FC, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  99. % No data in high bits.
  100. {<<16#C0, 16#80>>, <<"\"\\u0000\"">>},
  101. {<<16#C1, 16#80>>, <<"\"\\u0000\"">>},
  102. {<<16#E0, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  103. {<<16#E0, 16#90, 16#80>>, <<"\"\\u0000\"">>},
  104. {<<16#F0, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  105. {<<16#F0, 16#88, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  106. {<<16#F8, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  107. {<<16#F8, 16#84, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  108. {<<16#FC, 16#80, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  109. {<<16#FC, 16#82, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>}
  110. ].