Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

147 linhas
4.4 KiB

  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. ].