You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
4.0 KiB

пре 13 година
пре 13 година
пре 13 година
пре 14 година
пре 13 година
пре 14 година
пре 14 година
пре 14 година
пре 14 година
пре 14 година
пре 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(115),
  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. {<<"\"\\uFFFF\"">>, <<239,191,191>>, <<34,239,191,191,34>>},
  29. {<<"\"\\uFFFE\"">>, <<239,191,190>>, <<34,239,191,190,34>>}
  30. ].
  31. uescaped() ->
  32. [
  33. {
  34. <<"\"\\u8CA8\\u5481\\u3002\\u0091\\u0091\"">>,
  35. <<232,178,168,229,146,129,227,128,130,194,145,194,145>>
  36. },
  37. {
  38. <<"\"\\uD834\\uDD1E\"">>,
  39. <<240, 157, 132, 158>>
  40. },
  41. {
  42. <<"\"\\uD83D\\uDE0A\"">>,
  43. <<240, 159, 152, 138>>
  44. }
  45. ].
  46. errors() ->
  47. [
  48. "\"",
  49. <<"\"foo">>,
  50. <<"\"", 0, "\"">>,
  51. <<"\"\\g\"">>,
  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. % Not enough extension bytes
  82. {<<16#C0>>, <<16#EF, 16#BF, 16#BD>>},
  83. {<<16#E0>>, <<16#EF, 16#BF, 16#BD>>},
  84. {<<16#E0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  85. {<<16#F0>>, <<16#EF, 16#BF, 16#BD>>},
  86. {<<16#F0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  87. {<<16#F0, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  88. {<<16#F8>>, <<16#EF, 16#BF, 16#BD>>},
  89. {<<16#F8, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  90. {<<16#F8, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  91. {<<16#F8, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  92. {<<16#FC>>, <<16#EF, 16#BF, 16#BD>>},
  93. {<<16#FC, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  94. {<<16#FC, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  95. {<<16#FC, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  96. {<<16#FC, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  97. % No data in high bits.
  98. {<<16#C0, 16#80>>, <<"\"\\u0000\"">>},
  99. {<<16#C1, 16#80>>, <<"\"\\u0000\"">>},
  100. {<<16#E0, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  101. {<<16#E0, 16#90, 16#80>>, <<"\"\\u0000\"">>},
  102. {<<16#F0, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  103. {<<16#F0, 16#88, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  104. {<<16#F8, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  105. {<<16#F8, 16#84, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  106. {<<16#FC, 16#80, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
  107. {<<16#FC, 16#82, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>}
  108. ].