jsone_encode_tests.erl 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. %% Copyright (c) 2013, Takeru Ohta <phjgt308@gmail.com>
  2. -module(jsone_encode_tests).
  3. -include_lib("eunit/include/eunit.hrl").
  4. encode_test_() ->
  5. [
  6. %% シンボル系
  7. {"false がエンコード可能",
  8. fun () ->
  9. ?assertEqual(<<"false">>, iolist_to_binary(jsone_encode:encode(false)))
  10. end},
  11. {"true がエンコード可能",
  12. fun () ->
  13. ?assertEqual(<<"true">>, iolist_to_binary(jsone_encode:encode(true)))
  14. end},
  15. {"null がエンコード可能",
  16. fun () ->
  17. ?assertEqual(<<"null">>, iolist_to_binary(jsone_encode:encode(null)))
  18. end},
  19. %% 数値系: 整数
  20. {"0がエンコード可能",
  21. fun () ->
  22. ?assertEqual(<<"0">>, iolist_to_binary(jsone_encode:encode(0)))
  23. end},
  24. {"正の整数がエンコード可能",
  25. fun () ->
  26. ?assertEqual(<<"1">>, iolist_to_binary(jsone_encode:encode(1)))
  27. end},
  28. {"負の整数がエンコード可能",
  29. fun () ->
  30. ?assertEqual(<<"-1">>, iolist_to_binary(jsone_encode:encode(-1)))
  31. end},
  32. {"巨大な整数がエンコード可能",
  33. fun () ->
  34. ?assertEqual(<<"11111111111111111111111111111111111111111111111111111111111111111111111">>,
  35. iolist_to_binary(jsone_encode:encode(11111111111111111111111111111111111111111111111111111111111111111111111)))
  36. end},
  37. %% 数値系: 小数
  38. {"小数がエンコード可能",
  39. fun () ->
  40. Input = 1.234,
  41. Encoded = iolist_to_binary(jsone_encode:encode(Input)),
  42. ?assertEqual(Input, binary_to_float(Encoded))
  43. end},
  44. %% 文字列系
  45. {"文字列がエンコード可能",
  46. fun () ->
  47. ?assertEqual(<<"\"abc\"">>, iolist_to_binary(jsone_encode:encode(<<"abc">>)))
  48. end},
  49. {"各種エスケープ文字を含む文字列をエンコード可能",
  50. fun () ->
  51. Input = <<"\"\/\\\b\f\n\r\t">>,
  52. Expected = list_to_binary([$", [[$\\, C] || C <- [$", $/, $\\, $b, $f, $n, $r, $t]], $"]),
  53. ?assertEqual(Expected, iolist_to_binary(jsone_encode:encode(Input)))
  54. end},
  55. {"UTF-8形式のマルチバイト文字列がエンコード可能",
  56. fun () ->
  57. %% 日本語
  58. Input1 = <<"あいうえお">>, % このファイルの文字エンコーディングがUTF-8であることが前提
  59. Expected1 = <<"\"\\u3042\\u3044\\u3046\\u3048\\u304a\"">>,
  60. ?assertEqual(Expected1, iolist_to_binary(jsone_encode:encode(Input1))),
  61. %% 日本語以外のマルチバイト文字
  62. Input2 = <<"۝۞ႮႯ">>,
  63. Expected2 = <<"\"\\u06dd\\u06de\\u10ae\\u10af\"">>,
  64. ?assertEqual(Expected2, iolist_to_binary(jsone_encode:encode(Input2)))
  65. end},
  66. {"サロゲートペアを含む文字列がエンコード可能",
  67. fun () ->
  68. Input = <<"𢁉𢂚𢃼">>,
  69. Expected = <<"\"\\ud848\\udc49\\ud848\\udc9a\\ud848\\udcfc\"">>,
  70. ?assertEqual(Expected, iolist_to_binary(jsone_encode:encode(Input)))
  71. end},
  72. %% 配列系
  73. {"配列(リスト)がエンコード可能",
  74. fun () ->
  75. Input = [1, 2, 3],
  76. Expected = <<"[1,2,3]">>,
  77. ?assertEqual(Expected, iolist_to_binary(jsone_encode:encode(Input)))
  78. end},
  79. {"空配列がエンコード可能",
  80. fun () ->
  81. Input = [],
  82. Expected = <<"[]">>,
  83. ?assertEqual(Expected, iolist_to_binary(jsone_encode:encode(Input)))
  84. end},
  85. %% オブジェクト系
  86. {"オブジェクトがエンコード可能",
  87. fun () ->
  88. Input = {object, [{<<"key">>, <<"value">>}, {<<"1">>, 2}]},
  89. Expected = <<"{\"key\":\"value\",\"1\":2}">>,
  90. ?assertEqual(Expected, iolist_to_binary(jsone_encode:encode(Input)))
  91. end},
  92. {"空オブジェクトがエンコード可能",
  93. fun () ->
  94. Input = {object, []},
  95. Expected = <<"{}">>,
  96. ?assertEqual(Expected, iolist_to_binary(jsone_encode:encode(Input)))
  97. end},
  98. {"オブジェクトのメンバのキーにはバイナリのみが使用可能",
  99. fun () ->
  100. ?assertError({invalid_json_value, _}, jsone_encode:encode({object, [{1, 2}]})),
  101. ?assertError({invalid_json_value, _}, jsone_encode:encode({object, [{"1", 2}]})),
  102. ?assertError({invalid_json_value, _}, jsone_encode:encode({object, [{true, 2}]}))
  103. end},
  104. %% その他
  105. {"複雑なデータがエンコード可能",
  106. fun () ->
  107. Input = [true, {object, [{<<"1">>, 2}, {<<"array">>, [[[[1]]], {object, [{<<"ab">>, <<"cd">>}]}, false]}]}, null],
  108. Expected = <<"[true,{\"1\":2,\"array\":[[[[1]]],{\"ab\":\"cd\"},false]},null]">>,
  109. ?assertEqual(Expected, iolist_to_binary(jsone_encode:encode(Input)))
  110. end},
  111. {"不正な値",
  112. fun () ->
  113. ?assertError({invalid_json_value, _}, jsone_encode:encode(self()))
  114. end}
  115. ].