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

187 строки
5.6 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. ?_assertError(_, 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. ?_assertError({invalid_string, _}, jiffy:encode(Case)),
  44. ?_assertEqual(Fixed2, jiffy:encode(Case, [force_utf8])),
  45. ?_assertError({_, 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. ?_assertError({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. <<"\"\\u", 200, 200, 200, 200, "\"">>,
  102. % CouchDB-345
  103. <<34,78,69,73,77,69,78,32,70,216,82,82,32,70,65,69,78,33,34>>
  104. ];
  105. cases(utf8) ->
  106. [
  107. % Stray continuation byte
  108. {<<16#C2, 16#81, 16#80>>, <<16#C2, 16#81, 16#EF, 16#BF, 16#BD>>},
  109. {<<"foo", 16#80, "bar">>, <<"foo", 16#EF, 16#BF, 16#BD, "bar">>},
  110. % Not enough extension bytes
  111. {<<16#C0>>, <<16#EF, 16#BF, 16#BD>>},
  112. {<<16#E0>>, <<16#EF, 16#BF, 16#BD>>},
  113. {<<16#E0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  114. {<<16#F0>>, <<16#EF, 16#BF, 16#BD>>},
  115. {<<16#F0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  116. {<<16#F0, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  117. {<<16#F8>>, <<16#EF, 16#BF, 16#BD>>},
  118. {<<16#F8, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  119. {<<16#F8, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  120. {<<16#F8, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  121. {<<16#FC>>, <<16#EF, 16#BF, 16#BD>>},
  122. {<<16#FC, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  123. {<<16#FC, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  124. {<<16#FC, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  125. {<<16#FC, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  126. % No data in high bits.
  127. {<<16#C0, 16#80>>, <<"\\u0000">>},
  128. {<<16#C1, 16#80>>, <<"@">>},
  129. {<<16#E0, 16#80, 16#80>>, <<"\\u0000">>},
  130. {<<16#E0, 16#90, 16#80>>, <<16#D0, 16#80>>},
  131. {<<16#F0, 16#80, 16#80, 16#80>>, <<"\\u0000">>},
  132. {<<16#F0, 16#88, 16#80, 16#80>>, <<16#E8, 16#80, 16#80>>},
  133. % UTF-8-like sequenecs of greater than 4 bytes
  134. % aren't valid and are replaced with a single
  135. % replacement 0xFFFD character.
  136. {<<16#F8, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  137. {<<16#F8, 16#84, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  138. {<<16#FC, 16#80, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  139. {<<16#FC, 16#82, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>}
  140. ];
  141. cases(bad_utf8_key) ->
  142. [
  143. {
  144. {[{<<"foo", 16#80, "bar">>, true}]},
  145. {[{<<"foo", 16#EF, 16#BF, 16#BD, "bar">>, true}]}
  146. }
  147. ];
  148. cases(escaped_slashes) ->
  149. [
  150. {<<"\"\\/\"">>, <<"/">>}
  151. ].