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

186 рядки
5.5 KiB

13 роки тому
13 роки тому
13 роки тому
14 роки тому
14 роки тому
14 роки тому
14 роки тому
13 роки тому
13 роки тому
14 роки тому
13 роки тому
14 роки тому
  1. % This file is part of Jiffy released under the MIT license.
  2. % See the LICENSE file for more information.
  3. -module(jiffy_04_string_tests).
  4. -include_lib("eunit/include/eunit.hrl").
  5. -include("jiffy_util.hrl").
  6. string_success_test_() ->
  7. [gen(ok, Case) || Case <- cases(ok)].
  8. string_uescaped_test_() ->
  9. [gen(uescaped, Case) || Case <- cases(uescaped)].
  10. string_error_test_() ->
  11. [gen(error, Case) || Case <- cases(error)].
  12. string_utf8_test_() ->
  13. [gen(utf8, Case) || Case <- cases(utf8)].
  14. string_bad_utf8_key_test_() ->
  15. Cases = cases(bad_utf8_key),
  16. {{J}, {E}} = hd(Cases),
  17. ExtraProps = [{<<"abcdeefeadasffasdfa">>, I} || I <- lists:seq(1, 10000)],
  18. Big = {{ExtraProps ++ J}, {ExtraProps ++ E}},
  19. AllCases = [Big | Cases],
  20. [gen(bad_utf8_key, Case) || Case <- AllCases].
  21. string_escaped_slashes_test_() ->
  22. [gen(escaped_slashes, Case) || Case <- cases(escaped_slashes)].
  23. gen(ok, {J, E}) ->
  24. gen(ok, {J, E, J});
  25. gen(ok, {J1, E, J2}) ->
  26. {msg("ok - ~s", [J1]), [
  27. {"Decode", ?_assertEqual(E, dec(J1))},
  28. {"Encode", ?_assertEqual(J2, enc(E))}
  29. ]};
  30. gen(uescaped, {J, E}) ->
  31. {msg("uescape - ~s", [J]), [
  32. {"Decode", ?_assertEqual(E, dec(J))},
  33. {"Encode", ?_assertEqual(J, enc(E, [uescape]))}
  34. ]};
  35. gen(error, J) ->
  36. {msg("error - ~s", [J]), [
  37. ?_assertThrow({error, _}, dec(J))
  38. ]};
  39. gen(utf8, {Case, Fixed}) ->
  40. Case2 = <<34, Case/binary, 34>>,
  41. Fixed2 = <<34, Fixed/binary, 34>>,
  42. {msg("UTF-8: ~s", [hex(Case)]), [
  43. ?_assertThrow({error, {invalid_string, _}}, jiffy:encode(Case)),
  44. ?_assertEqual(Fixed2, jiffy:encode(Case, [force_utf8])),
  45. ?_assertThrow({error, {_, invalid_string}}, jiffy:decode(Case2))
  46. ]};
  47. gen(bad_utf8_key, {J, E}) ->
  48. {msg("Bad UTF-8 key: - ~p", [size(term_to_binary(J))]), [
  49. ?_assertThrow({error, {invalid_object_member_key, _}}, jiffy:encode(J)),
  50. ?_assertEqual(E, jiffy:decode(jiffy:encode(J, [force_utf8])))
  51. ]};
  52. gen(escaped_slashes, {J, E}) ->
  53. {msg("escaped_slashes - ~s", [J]), [
  54. {"Decode", ?_assertEqual(E, dec(J))},
  55. {"Encode", ?_assertEqual(J, enc(E, [escape_forward_slashes]))}
  56. ]}.
  57. cases(ok) ->
  58. [
  59. {<<"\"\"">>, <<"">>},
  60. {<<"\"/\"">>, <<"/">>},
  61. {<<"\"0\"">>, <<"0">>},
  62. {<<"\"foo\"">>, <<"foo">>},
  63. {<<"\"\\\"foobar\\\"\"">>, <<"\"foobar\"">>},
  64. {<<"\"\\n\\n\\n\"">>, <<"\n\n\n">>},
  65. {<<"\"\\\" \\b\\f\\r\\n\\t\\\"\"">>, <<"\" \b\f\r\n\t\"">>},
  66. {<<"\"foo\\u0005bar\"">>, <<"foo", 5, "bar">>},
  67. {
  68. <<"\"\\uD834\\uDD1E\"">>,
  69. <<240, 157, 132, 158>>,
  70. <<34, 240, 157, 132, 158, 34>>
  71. },
  72. {<<"\"\\uFFFF\"">>, <<239,191,191>>, <<34,239,191,191,34>>},
  73. {<<"\"\\uFFFE\"">>, <<239,191,190>>, <<34,239,191,190,34>>}
  74. ];
  75. cases(uescaped) ->
  76. [
  77. {
  78. <<"\"\\u8CA8\\u5481\\u3002\\u0091\\u0091\"">>,
  79. <<232,178,168,229,146,129,227,128,130,194,145,194,145>>
  80. },
  81. {
  82. <<"\"\\uD834\\uDD1E\"">>,
  83. <<240, 157, 132, 158>>
  84. },
  85. {
  86. <<"\"\\uD83D\\uDE0A\"">>,
  87. <<240, 159, 152, 138>>
  88. },
  89. {
  90. <<"\"\\uDBFF\\uDFFF\"">>,
  91. <<244, 143, 191, 191>>
  92. }
  93. ];
  94. cases(error) ->
  95. [
  96. "\"",
  97. <<"\"foo">>,
  98. <<"\"", 0, "\"">>,
  99. <<"\"\\g\"">>,
  100. <<"\"\\uD834foo\\uDD1E\"">>,
  101. % CouchDB-345
  102. <<34,78,69,73,77,69,78,32,70,216,82,82,32,70,65,69,78,33,34>>
  103. ];
  104. cases(utf8) ->
  105. [
  106. % Stray continuation byte
  107. {<<16#C2, 16#81, 16#80>>, <<16#C2, 16#81, 16#EF, 16#BF, 16#BD>>},
  108. {<<"foo", 16#80, "bar">>, <<"foo", 16#EF, 16#BF, 16#BD, "bar">>},
  109. % Not enough extension bytes
  110. {<<16#C0>>, <<16#EF, 16#BF, 16#BD>>},
  111. {<<16#E0>>, <<16#EF, 16#BF, 16#BD>>},
  112. {<<16#E0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  113. {<<16#F0>>, <<16#EF, 16#BF, 16#BD>>},
  114. {<<16#F0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  115. {<<16#F0, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  116. {<<16#F8>>, <<16#EF, 16#BF, 16#BD>>},
  117. {<<16#F8, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  118. {<<16#F8, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  119. {<<16#F8, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  120. {<<16#FC>>, <<16#EF, 16#BF, 16#BD>>},
  121. {<<16#FC, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  122. {<<16#FC, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  123. {<<16#FC, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  124. {<<16#FC, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  125. % No data in high bits.
  126. {<<16#C0, 16#80>>, <<"\\u0000">>},
  127. {<<16#C1, 16#80>>, <<"@">>},
  128. {<<16#E0, 16#80, 16#80>>, <<"\\u0000">>},
  129. {<<16#E0, 16#90, 16#80>>, <<16#D0, 16#80>>},
  130. {<<16#F0, 16#80, 16#80, 16#80>>, <<"\\u0000">>},
  131. {<<16#F0, 16#88, 16#80, 16#80>>, <<16#E8, 16#80, 16#80>>},
  132. % UTF-8-like sequenecs of greater than 4 bytes
  133. % aren't valid and are replaced with a single
  134. % replacement 0xFFFD character.
  135. {<<16#F8, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  136. {<<16#F8, 16#84, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  137. {<<16#FC, 16#80, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  138. {<<16#FC, 16#82, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>}
  139. ];
  140. cases(bad_utf8_key) ->
  141. [
  142. {
  143. {[{<<"foo", 16#80, "bar">>, true}]},
  144. {[{<<"foo", 16#EF, 16#BF, 16#BD, "bar">>, true}]}
  145. }
  146. ];
  147. cases(escaped_slashes) ->
  148. [
  149. {<<"\"\\/\"">>, <<"/">>}
  150. ].