123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- %% Copyright (c) 2013-2014, Takeru Ohta <phjgt308@gmail.com>
- %% coding: latin-1
- -module(jsone_encode_tests).
- -include_lib("eunit/include/eunit.hrl").
- encode_test_() ->
- [
- %% Symbols
- {"false",
- fun () ->
- ?assertEqual({ok, <<"false">>}, jsone_encode:encode(false))
- end},
- {"true",
- fun () ->
- ?assertEqual({ok, <<"true">>}, jsone_encode:encode(true))
- end},
- {"null",
- fun () ->
- ?assertEqual({ok, <<"null">>}, jsone_encode:encode(null))
- end},
- %% Numbers: Integer
- {"zero",
- fun () ->
- ?assertEqual({ok, <<"0">>}, jsone_encode:encode(0))
- end},
- {"positive integer",
- fun () ->
- ?assertEqual({ok, <<"1">>}, jsone_encode:encode(1))
- end},
- {"negative integer",
- fun () ->
- ?assertEqual({ok, <<"-1">>}, jsone_encode:encode(-1))
- end},
- {"large number",
- fun () ->
- ?assertEqual({ok, <<"11111111111111111111111111111111111111111111111111111111111111111111111">>},
- jsone_encode:encode(11111111111111111111111111111111111111111111111111111111111111111111111))
- end},
- %% Numbers: Float",
- {"float",
- fun () ->
- Input = 1.234,
- ?assertMatch({ok, _}, jsone_encode:encode(Input)),
- ?assertEqual(Input, binary_to_float(element(2, jsone_encode:encode(Input))))
- end},
- %% Strings
- {"simple string",
- fun () ->
- ?assertEqual({ok, <<"\"abc\"">>}, jsone_encode:encode(<<"abc">>))
- end},
- {"atom is regarded as string",
- fun () ->
- ?assertEqual({ok, <<"\"abc\"">>}, jsone_encode:encode(abc))
- end},
- {"string: contains escaped characters",
- fun () ->
- Input = <<"\"\/\\\b\f\n\r\t">>,
- Expected = list_to_binary([$", [[$\\, C] || C <- [$", $/, $\\, $b, $f, $n, $r, $t]], $"]),
- ?assertEqual({ok, Expected}, jsone_encode:encode(Input))
- end},
- {"string: contains multi-byte (UTF-8 encoded) characters",
- fun () ->
- %% japanese
- Input1 = <<"あいうえお">>, % assumed that the encoding of this file is UTF-8
- Expected1 = <<"\"\\u3042\\u3044\\u3046\\u3048\\u304a\"">>,
- ?assertEqual({ok, Expected1}, jsone_encode:encode(Input1)),
- Expected12 = <<$", Input1/binary, $">>,
- ?assertEqual({ok, Expected12}, jsone_encode:encode(Input1, [native_utf8])),
- %% other multi-byte characters
- Input2 = <<"۞ႮႯ">>,
- Expected2 = <<"\"\\u06dd\\u06de\\u10ae\\u10af\"">>,
- ?assertEqual({ok, Expected2}, jsone_encode:encode(Input2)),
- Expected22 = <<$", Input2/binary, $">>,
- ?assertEqual({ok, Expected22}, jsone_encode:encode(Input2, [native_utf8]))
- end},
- {"string: containts surrogate pairs",
- fun () ->
- Input = <<"𢁉𢂚𢃼">>,
- Expected = <<"\"\\ud848\\udc49\\ud848\\udc9a\\ud848\\udcfc\"">>,
- ?assertEqual({ok, Expected}, jsone_encode:encode(Input))
- end},
- %% Arrays
- {"simple array",
- fun () ->
- Input = [1, 2, 3],
- Expected = <<"[1,2,3]">>,
- ?assertEqual({ok, Expected}, jsone_encode:encode(Input))
- end},
- {"empty array",
- fun () ->
- Input = [],
- Expected = <<"[]">>,
- ?assertEqual({ok, Expected}, jsone_encode:encode(Input))
- end},
- %% Objects
- {"simple object",
- fun () ->
- Input1 = {[{<<"key">>, <<"value">>}, {<<"1">>, 2}]},
- Input2 = [{<<"key">>, <<"value">>}, {<<"1">>, 2}],
- Expected = <<"{\"key\":\"value\",\"1\":2}">>,
- ?assertEqual({ok, Expected}, jsone_encode:encode(Input1)),
- ?assertEqual({ok, Expected}, jsone_encode:encode(Input2))
- end},
- {"empty object",
- fun () ->
- Input1 = {[]},
- Input2 = [{}],
- Expected = <<"{}">>,
- ?assertEqual({ok, Expected}, jsone_encode:encode(Input1)),
- ?assertEqual({ok, Expected}, jsone_encode:encode(Input2))
- end},
- {"simple object: map",
- fun () ->
- Input = #{<<"key">> => <<"value">>, <<"1">> => 2},
- Expected = <<"{\"1\":2,\"key\":\"value\"}">>,
- ?assertEqual({ok, Expected}, jsone_encode:encode(Input))
- end},
- {"empty object: map",
- fun () ->
- Input = #{},
- Expected = <<"{}">>,
- ?assertEqual({ok, Expected}, jsone_encode:encode(Input))
- end},
- {"atom key is allowed",
- fun () ->
- Expected = <<"{\"key\":2}">>,
- ?assertEqual({ok, Expected}, jsone_encode:encode({[{key, 2}]}))
- end},
- {"non binary object member key is disallowed",
- fun () ->
- ?assertMatch({error, {badarg, _}}, jsone_encode:encode({[{1, 2}]})),
- ?assertMatch({error, {badarg, _}}, jsone_encode:encode({[{"1", 2}]}))
- end},
- %% Pretty Print
- {"space",
- fun () ->
- ?assertEqual({ok, <<"[1, 2, 3]">>}, jsone_encode:encode([1,2,3], [{space, 1}])),
- ?assertEqual({ok, <<"[1, 2, 3]">>}, jsone_encode:encode([1,2,3], [{space, 2}])),
- ?assertEqual({ok, <<"{\"a\": 1, \"b\": 2}">>}, jsone_encode:encode(#{a=>1, b=>2}, [{space, 1}])),
- ?assertEqual({ok, <<"{\"a\": 1, \"b\": 2}">>}, jsone_encode:encode(#{a=>1, b=>2}, [{space, 2}]))
- end},
- {"indent",
- fun () ->
- ?assertEqual({ok, <<"[\n 1,\n 2,\n 3\n]">>}, jsone_encode:encode([1,2,3], [{indent, 1}])),
- ?assertEqual({ok, <<"[\n 1,\n 2,\n 3\n]">>}, jsone_encode:encode([1,2,3], [{indent, 2}])),
- ?assertEqual({ok, <<"{\n \"a\":1,\n \"b\":2\n}">>}, jsone_encode:encode(#{a=>1, b=>2}, [{indent, 1}])),
- ?assertEqual({ok, <<"{\n \"a\":1,\n \"b\":2\n}">>}, jsone_encode:encode(#{a=>1, b=>2}, [{indent, 2}]))
- end},
- {"indent+space",
- fun () ->
- ?assertEqual({ok, <<"[\n 1,\n 2,\n 3\n]">>}, jsone_encode:encode([1,2,3], [{indent, 1}, {space, 1}])),
- ?assertEqual({ok, <<"[\n 1,\n 2,\n 3\n]">>}, jsone_encode:encode([1,2,3], [{indent, 2}, {space, 2}])),
- ?assertEqual({ok, <<"{\n \"a\": 1,\n \"b\": 2\n}">>}, jsone_encode:encode(#{a=>1, b=>2}, [{indent, 1}, {space, 1}])),
- ?assertEqual({ok, <<"{\n \"a\": 1,\n \"b\": 2\n}">>}, jsone_encode:encode(#{a=>1, b=>2}, [{indent, 2}, {space, 2}]))
- end},
- %% Others
- {"compound data",
- fun () ->
- Input = [true, {[{<<"1">>, 2}, {<<"array">>, [[[[1]]], {[{<<"ab">>, <<"cd">>}]}, false]}]}, null],
- Expected = <<"[true,{\"1\":2,\"array\":[[[[1]]],{\"ab\":\"cd\"},false]},null]">>,
- ?assertEqual({ok, Expected}, jsone_encode:encode(Input)),
- PpExpected = <<"[\n true,\n {\n \"1\": 2,\n \"array\": [\n [\n [\n [\n 1\n ]\n ]\n ],\n {\n \"ab\": \"cd\"\n },\n false\n ]\n },\n null\n]">>,
- ?assertEqual({ok, PpExpected}, jsone_encode:encode(Input, [{indent, 1}, {space, 1}]))
- end},
- {"invalid value",
- fun () ->
- ?assertMatch({error, {badarg, _}}, jsone_encode:encode(self()))
- end},
- {"wrong option",
- fun () ->
- ?assertError(badarg, jsone_encode:encode(1, [{no_such_option, hoge}]))
- end}
- ].
|