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.

147 lines
4.4 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("proper/include/proper.hrl").
  5. -include_lib("eunit/include/eunit.hrl").
  6. -include("jiffy_util.hrl").
  7. string_success_test_() ->
  8. [gen(ok, Case) || Case <- cases(ok)].
  9. string_uescaped_test_() ->
  10. [gen(uescaped, Case) || Case <- cases(uescaped)].
  11. string_error_test_() ->
  12. [gen(error, Case) || Case <- cases(error)].
  13. string_utf8_test_() ->
  14. [gen(utf8, Case) || Case <- cases(utf8)].
  15. gen(ok, {J, E}) ->
  16. gen(ok, {J, E, J});
  17. gen(ok, {J1, E, J2}) ->
  18. {msg("ok - ~s", [J1]), [
  19. {"Decode", ?_assertEqual(E, dec(J1))},
  20. {"Encode", ?_assertEqual(J2, enc(E))}
  21. ]};
  22. gen(uescaped, {J, E}) ->
  23. {msg("uescape - ~s", [J]), [
  24. {"Decode", ?_assertEqual(E, dec(J))},
  25. {"Encode", ?_assertEqual(J, enc(E, [uescape]))}
  26. ]};
  27. gen(error, J) ->
  28. {msg("error - ~s", [J]), [
  29. ?_assertThrow({error, _}, dec(J))
  30. ]};
  31. gen(utf8, {Case, Fixed}) ->
  32. Case2 = <<34, Case/binary, 34>>,
  33. Fixed2 = <<34, Fixed/binary, 34>>,
  34. {msg("UTF-8: ~s", [hex(Case)]), [
  35. ?_assertThrow({error, {invalid_string, _}}, jiffy:encode(Case)),
  36. ?_assertEqual(Fixed2, jiffy:encode(Case, [force_utf8])),
  37. ?_assertThrow({error, {_, invalid_string}}, jiffy:decode(Case2))
  38. ]}.
  39. cases(ok) ->
  40. [
  41. {<<"\"\"">>, <<"">>},
  42. {<<"\"/\"">>, <<"/">>},
  43. {<<"\"0\"">>, <<"0">>},
  44. {<<"\"foo\"">>, <<"foo">>},
  45. {<<"\"\\\"foobar\\\"\"">>, <<"\"foobar\"">>},
  46. {<<"\"\\n\\n\\n\"">>, <<"\n\n\n">>},
  47. {<<"\"\\\" \\b\\f\\r\\n\\t\\\"\"">>, <<"\" \b\f\r\n\t\"">>},
  48. {<<"\"foo\\u0005bar\"">>, <<"foo", 5, "bar">>},
  49. {
  50. <<"\"\\uD834\\uDD1E\"">>,
  51. <<240, 157, 132, 158>>,
  52. <<34, 240, 157, 132, 158, 34>>
  53. },
  54. {<<"\"\\uFFFF\"">>, <<239,191,191>>, <<34,239,191,191,34>>},
  55. {<<"\"\\uFFFE\"">>, <<239,191,190>>, <<34,239,191,190,34>>}
  56. ];
  57. cases(uescaped) ->
  58. [
  59. {
  60. <<"\"\\u8CA8\\u5481\\u3002\\u0091\\u0091\"">>,
  61. <<232,178,168,229,146,129,227,128,130,194,145,194,145>>
  62. },
  63. {
  64. <<"\"\\uD834\\uDD1E\"">>,
  65. <<240, 157, 132, 158>>
  66. },
  67. {
  68. <<"\"\\uD83D\\uDE0A\"">>,
  69. <<240, 159, 152, 138>>
  70. }
  71. ];
  72. cases(error) ->
  73. [
  74. "\"",
  75. <<"\"foo">>,
  76. <<"\"", 0, "\"">>,
  77. <<"\"\\g\"">>,
  78. <<"\"\\uD834foo\\uDD1E\"">>,
  79. % CouchDB-345
  80. <<34,78,69,73,77,69,78,32,70,216,82,82,32,70,65,69,78,33,34>>
  81. ];
  82. cases(utf8) ->
  83. [
  84. % Stray continuation byte
  85. {<<16#C2, 16#81, 16#80>>, <<16#C2, 16#81, 16#EF, 16#BF, 16#BD>>},
  86. {<<"foo", 16#80, "bar">>, <<"foo", 16#EF, 16#BF, 16#BD, "bar">>},
  87. % Not enough extension bytes
  88. {<<16#C0>>, <<16#EF, 16#BF, 16#BD>>},
  89. {<<16#E0>>, <<16#EF, 16#BF, 16#BD>>},
  90. {<<16#E0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  91. {<<16#F0>>, <<16#EF, 16#BF, 16#BD>>},
  92. {<<16#F0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  93. {<<16#F0, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  94. {<<16#F8>>, <<16#EF, 16#BF, 16#BD>>},
  95. {<<16#F8, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  96. {<<16#F8, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  97. {<<16#F8, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  98. {<<16#FC>>, <<16#EF, 16#BF, 16#BD>>},
  99. {<<16#FC, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  100. {<<16#FC, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  101. {<<16#FC, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  102. {<<16#FC, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  103. % No data in high bits.
  104. {<<16#C0, 16#80>>, <<"\\u0000">>},
  105. {<<16#C1, 16#80>>, <<"@">>},
  106. {<<16#E0, 16#80, 16#80>>, <<"\\u0000">>},
  107. {<<16#E0, 16#90, 16#80>>, <<16#D0, 16#80>>},
  108. {<<16#F0, 16#80, 16#80, 16#80>>, <<"\\u0000">>},
  109. {<<16#F0, 16#88, 16#80, 16#80>>, <<16#E8, 16#80, 16#80>>},
  110. % UTF-8-like sequenecs of greater than 4 bytes
  111. % aren't valid and are replaced with a single
  112. % replacement 0xFFFD character.
  113. {<<16#F8, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  114. {<<16#F8, 16#84, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  115. {<<16#FC, 16#80, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
  116. {<<16#FC, 16#82, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>}
  117. ].