Browse Source

Apply efmt v0.3.0

Takeru Ohta 3 years ago
parent
commit
3f3b5b04a7
9 changed files with 306 additions and 229 deletions
  1. 13 15
      rebar.config
  2. 8 9
      src/jsone.app.src
  3. 18 11
      src/jsone.erl
  4. 34 7
      src/jsone_decode.erl
  5. 96 61
      src/jsone_encode.erl
  6. 4 0
      src/jsone_inet.erl
  7. 57 57
      test/jsone_decode_tests.erl
  8. 59 54
      test/jsone_encode_tests.erl
  9. 17 15
      test/jsone_inet_tests.erl

+ 13 - 15
rebar.config

@@ -1,11 +1,10 @@
 %% -*- erlang -*-
-{erl_opts,
- [warnings_as_errors,
-  warn_export_all,
-  warn_untyped_record,
-  inline,
-  {platform_define, "^R[01][0-9]", 'NO_MAP_TYPE'},
-  {platform_define, "^(R|17)", 'NO_DIALYZER_SPEC'}]}.
+{erl_opts, [warnings_as_errors,
+            warn_export_all,
+            warn_untyped_record,
+            inline,
+            {platform_define, "^R[01][0-9]", 'NO_MAP_TYPE'},
+            {platform_define, "^(R|17)", 'NO_DIALYZER_SPEC'}]}.
 
 {xref_checks, [fail_on_warning, undefined_function_calls]}.
 
@@ -13,20 +12,19 @@
 
 {cover_enabled, true}.
 
-{edoc_opts,
- [{dialyzer_specs, all},
-  {report_missing_type, true},
-  {report_type_mismatch, true},
-  {pretty_print, erl_pp},
-  {preprocess, true}]}.
+{edoc_opts, [{dialyzer_specs, all},
+             {report_missing_type, true},
+             {report_type_mismatch, true},
+             {pretty_print, erl_pp},
+             {preprocess, true}]}.
 {validate_app_modules, true}.
 
 {shell, [{apps, [jsone]}]}.
 
 {dialyzer, [{warnings, [error_handling, race_conditions, unmatched_returns, unknown, no_improper_lists]}]}.
 
-{profiles,
- [{native, [{erl_opts, [{d, 'ENABLE_HIPE'}]}]}, {edown, [{edoc_opts, [{doclet, edown_doclet}]}, {deps, [edown]}]}]}.
+{profiles, [{native, [{erl_opts, [{d, 'ENABLE_HIPE'}]}]},
+            {edown, [{edoc_opts, [{doclet, edown_doclet}]}, {deps, [edown]}]}]}.
 
 {project_plugins, [covertool]}.
 {cover_export_enabled, true}.

+ 8 - 9
src/jsone.app.src

@@ -1,9 +1,8 @@
-{application,
- jsone,
- [{description, "Erlang JSON Library"},
-  {vsn, "1.7.0"},
-  {registered, []},
-  {applications, [kernel, stdlib]},
-  {licenses, ["MIT"]},
-  {links, [{"GitHub", "https://github.com/sile/jsone"}]},
-  {env, []}]}.
+{application, jsone,
+              [{description, "Erlang JSON Library"},
+               {vsn, "1.7.0"},
+               {registered, []},
+               {applications, [kernel, stdlib]},
+               {licenses, ["MIT"]},
+               {links, [{"GitHub", "https://github.com/sile/jsone"}]},
+               {env, []}]}.

+ 18 - 11
src/jsone.erl

@@ -29,14 +29,10 @@
 %%--------------------------------------------------------------------------------
 %% Exported API
 %%--------------------------------------------------------------------------------
--export([decode/1,
-         decode/2,
-         try_decode/1,
-         try_decode/2,
-         encode/1,
-         encode/2,
-         try_encode/1,
-         try_encode/2,
+-export([decode/1, decode/2,
+         try_decode/1, try_decode/2,
+         encode/1, encode/2,
+         try_encode/1, try_encode/2,
          term_to_json_string/1,
          ip_address_to_json_string/1]).
 
@@ -203,7 +199,7 @@
                          {object_key_type, string | scalar | value} |
                          {space, non_neg_integer()} |
                          {indent, non_neg_integer()} |
-                         {map_unknown_value, undefined | fun ((term()) -> {ok, json_value()} | error)} |
+                         {map_unknown_value, undefined | fun((term()) -> {ok, json_value()} | error)} |
                          skip_undefined |
                          common_option().
 %% `native_utf8': <br />
@@ -307,12 +303,13 @@
 %% The 'OTP_RELEASE' macro introduced at OTP-21,
 %% so we can use it for detecting whether the Erlang compiler supports new try/catch syntax or not.
 -define(CAPTURE_STACKTRACE, :__StackTrace).
--define(GET_STACKTRACE, __StackTrace).
+-define(GET_STACKTRACE,     __StackTrace).
 -else.
 -define(CAPTURE_STACKTRACE, ).
--define(GET_STACKTRACE, erlang:get_stacktrace()).
+-define(GET_STACKTRACE,     erlang:get_stacktrace()).
 -endif.
 
+
 %%--------------------------------------------------------------------------------
 %% Exported Functions
 %%--------------------------------------------------------------------------------
@@ -321,6 +318,7 @@
 decode(Json) ->
     decode(Json, []).
 
+
 %% @doc Decodes an erlang term from json text (a utf8 encoded binary)
 %%
 %% Raises an error exception if input is not valid json
@@ -346,11 +344,13 @@ decode(Json, Options) ->
             erlang:raise(error, Reason, [StackItem | ?GET_STACKTRACE])
     end.
 
+
 %% @equiv try_decode(Json, [])
 -spec try_decode(binary()) -> {ok, json_value(), Remainings :: binary()} | {error, {Reason :: term(), [stack_item()]}}.
 try_decode(Json) ->
     try_decode(Json, []).
 
+
 %% @doc Decodes an erlang term from json text (a utf8 encoded binary)
 %%
 %% ```
@@ -367,11 +367,13 @@ try_decode(Json) ->
 try_decode(Json, Options) ->
     jsone_decode:decode(Json, Options).
 
+
 %% @equiv encode(JsonValue, [])
 -spec encode(json_value()) -> binary().
 encode(JsonValue) ->
     encode(JsonValue, []).
 
+
 %% @doc Encodes an erlang term into json text (a utf8 encoded binary)
 %%
 %% Raises an error exception if input is not an instance of type `json_value()'
@@ -396,11 +398,13 @@ encode(JsonValue, Options) ->
             erlang:raise(error, Reason, [StackItem | ?GET_STACKTRACE])
     end.
 
+
 %% @equiv try_encode(JsonValue, [])
 -spec try_encode(json_value()) -> {ok, binary()} | {error, {Reason :: term(), [stack_item()]}}.
 try_encode(JsonValue) ->
     try_encode(JsonValue, []).
 
+
 %% @doc Encodes an erlang term into json text (a utf8 encoded binary)
 %%
 %% ```
@@ -416,11 +420,13 @@ try_encode(JsonValue) ->
 try_encode(JsonValue, Options) ->
     jsone_encode:encode(JsonValue, Options).
 
+
 %% @doc Converts the given term `X' to its string representation (i.e., the result of `io_lib:format("~p", [X])').
 -spec term_to_json_string(term()) -> {ok, json_string()} | error.
 term_to_json_string(X) ->
     {ok, list_to_binary(io_lib:format("~p", [X]))}.
 
+
 %% @doc Convert an IP address into a text representation.
 %%
 %% This function can be specified as the value of the `map_unknown_value' encoding option.
@@ -448,6 +454,7 @@ term_to_json_string(X) ->
 ip_address_to_json_string(X) ->
     jsone_inet:ip_address_to_json_string(X).
 
+
 %%--------------------------------------------------------------------------------
 %% Internal Functions
 %%--------------------------------------------------------------------------------

+ 34 - 7
src/jsone_decode.erl

@@ -63,16 +63,18 @@
 
 -type decode_result() :: {ok, jsone:json_value(), Rest :: binary()} | {error, {Reason :: term(), [jsone:stack_item()]}}.
 
--record(decode_opt_v2,
-        {object_format = ?DEFAULT_OBJECT_FORMAT :: tuple | proplist | map,
-         allow_ctrl_chars = false :: boolean(),
-         reject_invalid_utf8 = false :: boolean(),
-         keys = binary :: 'binary' | 'atom' | 'existing_atom' | 'attempt_atom',
-         undefined_as_null = false :: boolean(),
-         duplicate_map_keys = first :: first | last}).
+-record(decode_opt_v2, {
+          object_format = ?DEFAULT_OBJECT_FORMAT :: tuple | proplist | map,
+          allow_ctrl_chars = false :: boolean(),
+          reject_invalid_utf8 = false :: boolean(),
+          keys = binary :: 'binary' | 'atom' | 'existing_atom' | 'attempt_atom',
+          undefined_as_null = false :: boolean(),
+          duplicate_map_keys = first :: first | last
+         }).
 -define(OPT, #decode_opt_v2).
 -type opt() :: #decode_opt_v2{}.
 
+
 %%--------------------------------------------------------------------------------
 %% Exported Functions
 %%--------------------------------------------------------------------------------
@@ -80,11 +82,13 @@
 decode(Json) ->
     decode(Json, []).
 
+
 -spec decode(binary(), [jsone:decode_option()]) -> decode_result().
 decode(<<Json/binary>>, Options) ->
     Opt = parse_options(Options),
     whitespace(Json, value, [], <<"">>, Opt).
 
+
 %%--------------------------------------------------------------------------------
 %% Internal Functions
 %%--------------------------------------------------------------------------------
@@ -101,6 +105,7 @@ next(<<Bin/binary>>, Value, [Next | Nexts], Buf, Opt) ->
             whitespace(Bin, {object_next, [{Key, Value} | Members]}, Nexts, Buf, Opt)
     end.
 
+
 -spec whitespace(binary(), whitespace_next(), [next()], binary(), opt()) -> decode_result().
 whitespace(<<$ , Bin/binary>>, Next, Nexts, Buf, Opt) ->
     whitespace(Bin, Next, Nexts, Buf, Opt);
@@ -128,6 +133,7 @@ whitespace(<<Bin/binary>>, Next, Nexts, Buf, Opt) ->
             object_next(Bin, Members, Nexts, Buf, Opt)
     end.
 
+
 -spec value(binary(), [next()], binary(), opt()) -> decode_result().
 value(<<"false", Bin/binary>>, Nexts, Buf, Opt) ->
     next(Bin, false, Nexts, Buf, Opt);
@@ -146,12 +152,14 @@ value(<<$", Bin/binary>>, Nexts, Buf, Opt) ->
 value(<<Bin/binary>>, Nexts, Buf, Opt) ->
     number(Bin, Nexts, Buf, Opt).
 
+
 -spec array(binary(), [next()], binary(), opt()) -> decode_result().
 array(<<$], Bin/binary>>, Nexts, Buf, Opt) ->
     next(Bin, [], Nexts, Buf, Opt);
 array(<<Bin/binary>>, Nexts, Buf, Opt) ->
     value(Bin, [{array_next, []} | Nexts], Buf, Opt).
 
+
 -spec array_next(binary(), [jsone:json_value()], [next()], binary(), opt()) -> decode_result().
 array_next(<<$], Bin/binary>>, Values, Nexts, Buf, Opt) ->
     next(Bin, lists:reverse(Values), Nexts, Buf, Opt);
@@ -160,18 +168,21 @@ array_next(<<$,, Bin/binary>>, Values, Nexts, Buf, Opt) ->
 array_next(Bin, Values, Nexts, Buf, Opt) ->
     ?ERROR(array_next, [Bin, Values, Nexts, Buf, Opt]).
 
+
 -spec object(binary(), [next()], binary(), opt()) -> decode_result().
 object(<<$}, Bin/binary>>, Nexts, Buf, Opt) ->
     next(Bin, make_object([], Opt), Nexts, Buf, Opt);
 object(<<Bin/binary>>, Nexts, Buf, Opt) ->
     object_key(Bin, [], Nexts, Buf, Opt).
 
+
 -spec object_key(binary(), jsone:json_object_members(), [next()], binary(), opt()) -> decode_result().
 object_key(<<$", Bin/binary>>, Members, Nexts, Buf, Opt) ->
     string(Bin, byte_size(Buf), [{object_value, Members} | Nexts], Buf, Opt);
 object_key(<<Bin/binary>>, Members, Nexts, Buf, Opt) ->
     ?ERROR(object_key, [Bin, Members, Nexts, Buf, Opt]).
 
+
 -spec object_value(binary(), jsone:json_string(), jsone:json_object_members(), [next()], binary(), opt()) ->
           decode_result().
 object_value(<<$:, Bin/binary>>, Key, Members, Nexts, Buf, Opt) ->
@@ -180,6 +191,8 @@ object_value(Bin, Key, Members, Nexts, Buf, Opt) ->
     ?ERROR(object_value, [Bin, Key, Members, Nexts, Buf, Opt]).
 
 -compile({inline, [object_key/2]}).
+
+
 object_key(Key, ?OPT{keys = binary}) ->
     Key;
 object_key(Key, ?OPT{keys = atom}) ->
@@ -194,6 +207,7 @@ object_key(Key, ?OPT{keys = attempt_atom}) ->
             Key
     end.
 
+
 -spec object_next(binary(), jsone:json_object_members(), [next()], binary(), opt()) -> decode_result().
 object_next(<<$}, Bin/binary>>, Members, Nexts, Buf, Opt) ->
     next(Bin, make_object(Members, Opt), Nexts, Buf, Opt);
@@ -202,10 +216,12 @@ object_next(<<$,, Bin/binary>>, Members, Nexts, Buf, Opt) ->
 object_next(Bin, Members, Nexts, Buf, Opt) ->
     ?ERROR(object_next, [Bin, Members, Nexts, Buf, Opt]).
 
+
 -spec string(binary(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
 string(<<Bin/binary>>, Start, Nexts, Buf, Opt) ->
     string(Bin, Bin, Start, Nexts, Buf, Opt).
 
+
 -spec string(binary(), binary(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
 string(<<$", Bin/binary>>, Base, Start, Nexts, Buf, Opt) ->
     Prefix = binary:part(Base, 0, byte_size(Base) - byte_size(Bin) - 1),
@@ -252,6 +268,7 @@ string(<<C/utf8, Bin/binary>>, Base, Start, Nexts, Buf, Opt) when 16#20 =< C ->
 string(Bin, Base, Start, Nexts, Buf, Opt) ->
     ?ERROR(string, [Bin, Base, Start, Nexts, Buf, Opt]).
 
+
 -spec unicode_string(binary(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
 unicode_string(<<N:4/binary, Bin/binary>>, Start, Nexts, Buf, Opt) ->
     try
@@ -290,12 +307,14 @@ unicode_string(<<N:4/binary, Bin/binary>>, Start, Nexts, Buf, Opt) ->
 unicode_string(Bin, Start, Nexts, Buf, Opt) ->
     ?ERROR(unicode_string, [Bin, Start, Nexts, Buf, Opt]).
 
+
 -spec number(binary(), [next()], binary(), opt()) -> decode_result().
 number(<<$-, Bin/binary>>, Nexts, Buf, Opt) ->
     number_integer_part(Bin, -1, Nexts, Buf, Opt);
 number(<<Bin/binary>>, Nexts, Buf, Opt) ->
     number_integer_part(Bin, 1, Nexts, Buf, Opt).
 
+
 -spec number_integer_part(binary(), 1 | -1, [next()], binary(), opt()) -> decode_result().
 number_integer_part(<<$0, Bin/binary>>, Sign, Nexts, Buf, Opt) ->
     number_fraction_part(Bin, Sign, 0, Nexts, Buf, Opt);
@@ -304,18 +323,21 @@ number_integer_part(<<C, Bin/binary>>, Sign, Nexts, Buf, Opt) when $1 =< C, C =<
 number_integer_part(Bin, Sign, Nexts, Buf, Opt) ->
     ?ERROR(number_integer_part, [Bin, Sign, Nexts, Buf, Opt]).
 
+
 -spec number_integer_part_rest(binary(), non_neg_integer(), 1 | -1, [next()], binary(), opt()) -> decode_result().
 number_integer_part_rest(<<C, Bin/binary>>, N, Sign, Nexts, Buf, Opt) when $0 =< C, C =< $9 ->
     number_integer_part_rest(Bin, N * 10 + C - $0, Sign, Nexts, Buf, Opt);
 number_integer_part_rest(<<Bin/binary>>, N, Sign, Nexts, Buf, Opt) ->
     number_fraction_part(Bin, Sign, N, Nexts, Buf, Opt).
 
+
 -spec number_fraction_part(binary(), 1 | -1, non_neg_integer(), [next()], binary(), opt()) -> decode_result().
 number_fraction_part(<<$., Bin/binary>>, Sign, Int, Nexts, Buf, Opt) ->
     number_fraction_part_rest(Bin, Sign, Int, 0, Nexts, Buf, Opt);
 number_fraction_part(<<Bin/binary>>, Sign, Int, Nexts, Buf, Opt) ->
     number_exponation_part(Bin, Sign * Int, 0, Nexts, Buf, Opt).
 
+
 -spec number_fraction_part_rest(binary(), 1 | -1, non_neg_integer(), non_neg_integer(), [next()], binary(), opt()) ->
           decode_result().
 number_fraction_part_rest(<<C, Bin/binary>>, Sign, N, DecimalOffset, Nexts, Buf, Opt) when $0 =< C, C =< $9 ->
@@ -325,6 +347,7 @@ number_fraction_part_rest(<<Bin/binary>>, Sign, N, DecimalOffset, Nexts, Buf, Op
 number_fraction_part_rest(Bin, Sign, N, DecimalOffset, Nexts, Buf, Opt) ->
     ?ERROR(number_fraction_part_rest, [Bin, Sign, N, DecimalOffset, Nexts, Buf, Opt]).
 
+
 -spec number_exponation_part(binary(), integer(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
 number_exponation_part(<<$e, $+, Bin/binary>>, N, DecimalOffset, Nexts, Buf, Opt) ->
     number_exponation_part(Bin, N, DecimalOffset, 1, 0, true, Nexts, Buf, Opt);
@@ -346,6 +369,7 @@ number_exponation_part(<<Bin/binary>>, N, DecimalOffset, Nexts, Buf, Opt) ->
             next(Bin, N / math:pow(10, DecimalOffset), Nexts, Buf, Opt)
     end.
 
+
 -spec number_exponation_part(binary(),
                              integer(),
                              non_neg_integer(),
@@ -376,6 +400,7 @@ number_exponation_part(<<Bin/binary>>, N, DecimalOffset, ExpSign, Exp, false, Ne
 number_exponation_part(Bin, N, DecimalOffset, ExpSign, Exp, IsFirst, Nexts, Buf, Opt) ->
     ?ERROR(number_exponation_part, [Bin, N, DecimalOffset, ExpSign, Exp, IsFirst, Nexts, Buf, Opt]).
 
+
 -spec make_object(jsone:json_object_members(), opt()) -> jsone:json_object().
 make_object(Members, ?OPT{object_format = tuple}) ->
     {lists:reverse(Members)};
@@ -388,10 +413,12 @@ make_object([], _) ->
 make_object(Members, _) ->
     lists:reverse(Members).
 
+
 -spec parse_options([jsone:decode_option()]) -> opt().
 parse_options(Options) ->
     parse_option(Options, ?OPT{}).
 
+
 -spec parse_option([jsone:decode_option()], opt()) -> opt().
 parse_option([], Opt) ->
     Opt;

+ 96 - 61
src/jsone_encode.erl

@@ -61,22 +61,24 @@
                 {object_members, jsone:json_object_members()} |
                 {char, binary()}.
 
--record(encode_opt_v2,
-        {native_utf8 = false :: boolean(),
-         native_forward_slash = false :: boolean(),
-         canonical_form = false :: boolean(),
-         float_format = [{scientific, 20}] :: [jsone:float_format_option()],
-         datetime_format = {iso8601, 0} :: {jsone:datetime_format(), jsone:utc_offset_seconds()},
-         object_key_type = string :: string | scalar | value,
-         space = 0 :: non_neg_integer(),
-         indent = 0 :: non_neg_integer(),
-         undefined_as_null = false :: boolean(),
-         skip_undefined = false :: boolean(),
-         map_unknown_value = fun jsone:term_to_json_string/1 :: undefined |
-                                                                fun ((term()) -> {ok, jsone:json_value()} | error)}).
+-record(encode_opt_v2, {
+          native_utf8 = false :: boolean(),
+          native_forward_slash = false :: boolean(),
+          canonical_form = false :: boolean(),
+          float_format = [{scientific, 20}] :: [jsone:float_format_option()],
+          datetime_format = {iso8601, 0} :: {jsone:datetime_format(), jsone:utc_offset_seconds()},
+          object_key_type = string :: string | scalar | value,
+          space = 0 :: non_neg_integer(),
+          indent = 0 :: non_neg_integer(),
+          undefined_as_null = false :: boolean(),
+          skip_undefined = false :: boolean(),
+          map_unknown_value = fun jsone:term_to_json_string/1 :: undefined |
+                                                                 fun((term()) -> {ok, jsone:json_value()} | error)
+         }).
 -define(OPT, #encode_opt_v2).
 -type opt() :: #encode_opt_v2{}.
 
+
 %%--------------------------------------------------------------------------------
 %% Exported Functions
 %%--------------------------------------------------------------------------------
@@ -84,11 +86,13 @@
 encode(Value) ->
     encode(Value, []).
 
+
 -spec encode(jsone:json_value(), [jsone:encode_option()]) -> encode_result().
 encode(Value, Options) ->
     Opt = parse_options(Options),
     value(Value, [], <<"">>, Opt).
 
+
 %%--------------------------------------------------------------------------------
 %% Internal Functions
 %%--------------------------------------------------------------------------------
@@ -117,6 +121,7 @@ next(Level = [Next | Nexts], Buf, Opt) ->
             next(Nexts, <<Buf/binary, C>>, Opt)
     end.
 
+
 -spec value(jsone:json_value(), [next()], binary(), opt()) -> encode_result().
 value(null, Nexts, Buf, Opt) ->
     next(Nexts, <<Buf/binary, "null">>, Opt);
@@ -138,9 +143,8 @@ value({{json_utf8, T}}, Nexts, Buf, Opt) ->
         unicode:characters_to_binary(T)
     of
         {error, OK, Invalid} ->
-            {error,
-             {{invalid_json_utf8, OK, Invalid},
-              [{?MODULE, value, [{json_utf8, T}, Nexts, Buf, Opt], [{line, ?LINE}]}]}};
+            {error, {{invalid_json_utf8, OK, Invalid},
+                     [{?MODULE, value, [{json_utf8, T}, Nexts, Buf, Opt], [{line, ?LINE}]}]}};
         B when is_binary(B) ->
             next(Nexts, <<Buf/binary, B/binary>>, Opt)
     catch
@@ -180,6 +184,7 @@ value(Value, Nexts, Buf, Opt) ->
             end
     end.
 
+
 -spec string(jsone:json_string(), [next()], binary(), opt()) -> encode_result().
 string(<<Str/binary>>, Nexts, Buf, Opt) ->
     Len = unescaped_string_length(Str, Opt),
@@ -188,22 +193,22 @@ string(<<Str/binary>>, Nexts, Buf, Opt) ->
 string(Str, Nexts, Buf, Opt) ->
     string(atom_to_binary(Str, utf8), Nexts, Buf, Opt).
 
+
 -spec datetime(calendar:datetime(), [next()], binary(), opt()) -> encode_result().
 datetime({{Y, M, D}, {H, Mi, S}}, Nexts, Buf, Opt) when ?IS_DATETIME(Y, M, D, H, Mi, S) ->
     {iso8601, Tz} = Opt?OPT.datetime_format,
-    Str =
-        [format_year(Y),
-         $-,
-         format2digit(M),
-         $-,
-         format2digit(D),
-         $T,
-         format2digit(H),
-         $:,
-         format2digit(Mi),
-         $:,
-         format_seconds(S),
-         format_tz(Tz)],
+    Str = [format_year(Y),
+           $-,
+           format2digit(M),
+           $-,
+           format2digit(D),
+           $T,
+           format2digit(H),
+           $:,
+           format2digit(Mi),
+           $:,
+           format_seconds(S),
+           format_tz(Tz)],
     next(Nexts, <<Buf/binary, $", (list_to_binary(Str))/binary, $">>, Opt);
 datetime(Datetime, Nexts, Buf, Opt) ->
     ?ERROR(datetime, [Datetime, Nexts, Buf, Opt]).
@@ -211,6 +216,8 @@ datetime(Datetime, Nexts, Buf, Opt) ->
 -ifndef(NO_DIALYZER_SPEC).
 -dialyzer({no_improper_lists, [format_year/1]}).
 -endif.
+
+
 -spec format_year(non_neg_integer()) -> iodata().
 format_year(Y) when Y > 999 ->
     integer_to_binary(Y);
@@ -218,6 +225,7 @@ format_year(Y) ->
     B = integer_to_binary(Y),
     [lists:duplicate(4 - byte_size(B), $0) | B].
 
+
 -spec format2digit(non_neg_integer()) -> iolist().
 format2digit(0) ->
     "00";
@@ -242,12 +250,14 @@ format2digit(9) ->
 format2digit(X) ->
     integer_to_list(X).
 
+
 -spec format_seconds(non_neg_integer() | float()) -> iolist().
 format_seconds(S) when is_integer(S) ->
     format2digit(S);
 format_seconds(S) when is_float(S) ->
     io_lib:format("~6.3.0f", [S]).
 
+
 -spec format_tz(integer()) -> byte() | iolist().
 format_tz(0) ->
     $Z;
@@ -257,7 +267,9 @@ format_tz(Tz) ->
     [$- | format_tz_(-Tz)].
 
 -define(SECONDS_PER_MINUTE, 60).
--define(SECONDS_PER_HOUR, 3600).
+-define(SECONDS_PER_HOUR,   3600).
+
+
 -spec format_tz_(integer()) -> iolist().
 format_tz_(S) ->
     H = S div ?SECONDS_PER_HOUR,
@@ -265,6 +277,7 @@ format_tz_(S) ->
     M = S1 div ?SECONDS_PER_MINUTE,
     [format2digit(H), $:, format2digit(M)].
 
+
 -spec object_key(jsone:json_value(), [next()], binary(), opt()) -> encode_result().
 object_key(Key, Nexts, Buf, Opt) when ?IS_STR(Key) ->
     string(Key, Nexts, Buf, Opt);
@@ -300,6 +313,7 @@ escape_string(<<2#11110:5, C1:3, C2:24, Str/binary>>, Nexts, Buf, Opt) ->
     escape_string(Str, Nexts, <<Buf/binary, Ch/utf8>>, Opt)).
 -endif.
 
+
 -spec escape_string(binary(), [next()], binary(), opt()) -> encode_result().
 escape_string(<<"">>, Nexts, Buf, Opt) ->
     next(Nexts, <<Buf/binary, $">>, Opt);
@@ -343,47 +357,52 @@ escape_string(Str, Nexts, Buf, Opt) ->
 
 -define(UNESCAPED_CHARS_WITH_SLASH,
         {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
-         true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
-         true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
-         true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true,
-         true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
-         true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false}).
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true,
+                true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
+                true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
+                true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true,
+                true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
+                true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false}).
 
 -define(UNESCAPED_CHARS_WITHOUT_SLASH,
         {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true,
-         true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
-         true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
-         true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true,
-         true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
-         true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
-         false, false, false, false, false, false}).
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, false,
+                true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
+                true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
+                true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true,
+                true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
+                true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false}).
 
 -compile({inline, [unescaped_string_length/2]}).
+
+
 -spec unescaped_string_length(binary(), opt()) -> non_neg_integer().
 unescaped_string_length(Str, ?OPT{native_forward_slash = true}) ->
     unescaped_string_length(Str, 0, ?UNESCAPED_CHARS_WITH_SLASH);
 unescaped_string_length(Str, _) ->
     unescaped_string_length(Str, 0, ?UNESCAPED_CHARS_WITHOUT_SLASH).
 
+
 -spec unescaped_string_length(binary(), non_neg_integer(), tuple()) -> non_neg_integer().
 unescaped_string_length(<<C, Str/binary>>, N, Table) ->
     case element(C + 1, Table) of
@@ -396,6 +415,8 @@ unescaped_string_length(_, N, _) ->
     N.
 
 -compile({inline, [hex/1]}).
+
+
 -spec hex(byte()) -> 0 .. 16#FFFF.
 hex(X) ->
     element(X + 1,
@@ -422,24 +443,28 @@ hex(X) ->
              16#6630, 16#6631, 16#6632, 16#6633, 16#6634, 16#6635, 16#6636, 16#6637, 16#6638, 16#6639, 16#6661, 16#6662,
              16#6663, 16#6664, 16#6665, 16#6666}).
 
+
 -spec array(jsone:json_array(), [next()], binary(), opt()) -> encode_result().
 array([], Nexts, Buf, Opt) ->
     next(Nexts, <<Buf/binary, $[, $]>>, Opt);
 array(List, Nexts, Buf, Opt) ->
     array_values(List, Nexts, pp_newline(<<Buf/binary, $[>>, Nexts, 1, Opt), Opt).
 
+
 -spec array_values(jsone:json_array(), [next()], binary(), opt()) -> encode_result().
 array_values([], Nexts, Buf, Opt) ->
     next(Nexts, <<(pp_newline(Buf, Nexts, Opt))/binary, $]>>, Opt);
 array_values([X | Xs], Nexts, Buf, Opt) ->
     value(X, [{array_values, Xs} | Nexts], Buf, Opt).
 
+
 -spec object(jsone:json_object_members(), [next()], binary(), opt()) -> encode_result().
 object(Members, Nexts, Buf, ?OPT{skip_undefined = true} = Opt) ->
-    object1(lists:filter(fun ({_, V}) -> V =/= undefined end, Members), Nexts, Buf, Opt);
+    object1(lists:filter(fun({_, V}) -> V =/= undefined end, Members), Nexts, Buf, Opt);
 object(Members, Nexts, Buf, Opt) ->
     object1(Members, Nexts, Buf, Opt).
 
+
 -spec object1(jsone:json_object_members(), [next()], binary(), opt()) -> encode_result().
 object1([], Nexts, Buf, Opt) ->
     next(Nexts, <<Buf/binary, ${, $}>>, Opt);
@@ -448,6 +473,7 @@ object1(Members, Nexts, Buf, ?OPT{canonical_form = true} = Opt) ->
 object1(Members, Nexts, Buf, Opt) ->
     object_members(Members, Nexts, pp_newline(<<Buf/binary, ${>>, Nexts, 1, Opt), Opt).
 
+
 -spec object_members(jsone:json_object_members(), [next()], binary(), opt()) -> encode_result().
 object_members([], Nexts, Buf, Opt) ->
     next(Nexts, <<(pp_newline(Buf, Nexts, Opt))/binary, $}>>, Opt);
@@ -456,30 +482,36 @@ object_members([{Key, Value} | Xs], Nexts, Buf, Opt) ->
 object_members(Arg, Nexts, Buf, Opt) ->
     ?ERROR(object_members, [Arg, Nexts, Buf, Opt]).
 
+
 -spec object_value(jsone:json_value(), jsone:json_object_members(), [next()], binary(), opt()) -> encode_result().
 object_value(Value, Members, Nexts, Buf, Opt) ->
     value(Value, [{object_members, Members} | Nexts], Buf, Opt).
 
+
 -spec pp_space(binary(), opt()) -> binary().
 pp_space(Buf, Opt) ->
     padding(Buf, Opt?OPT.space).
 
+
 -spec pp_newline(binary(), list(), opt()) -> binary().
 pp_newline(Buf, Level, Opt) ->
     pp_newline(Buf, Level, 0, Opt).
 
+
 -spec pp_newline(binary(), list(), non_neg_integer(), opt()) -> binary().
 pp_newline(Buf, _, _, ?OPT{indent = 0}) ->
     Buf;
 pp_newline(Buf, L, Extra, ?OPT{indent = N}) ->
     padding(<<Buf/binary, $\n>>, Extra * N + length(L) * N).
 
+
 -spec pp_newline_or_space(binary(), list(), opt()) -> binary().
 pp_newline_or_space(Buf, _, Opt = ?OPT{indent = 0}) ->
     pp_space(Buf, Opt);
 pp_newline_or_space(Buf, L, Opt) ->
     pp_newline(Buf, L, Opt).
 
+
 -spec padding(binary(), non_neg_integer()) -> binary().
 padding(Buf, 0) ->
     Buf;
@@ -502,10 +534,12 @@ padding(Buf, 8) ->
 padding(Buf, N) ->
     padding(<<Buf/binary, "         ">>, N - 9).
 
+
 -spec parse_options([jsone:encode_option()]) -> opt().
 parse_options(Options) ->
     parse_option(Options, ?OPT{}).
 
+
 -spec parse_option([jsone:encode_option()], opt()) -> opt().
 parse_option([], Opt) ->
     Opt;
@@ -545,6 +579,7 @@ parse_option([{map_unknown_value, F} | T], Opt) when is_function(F, 1); F =:= un
 parse_option(List, Opt) ->
     error(badarg, [List, Opt]).
 
+
 -spec local_offset() -> jsone:utc_offset_seconds().
 local_offset() ->
     UTC = {{1970, 1, 2}, {0, 0, 0}},

+ 4 - 0
src/jsone_inet.erl

@@ -44,6 +44,7 @@
         ?IS_IPV6_RANGE(A) andalso ?IS_IPV6_RANGE(B) andalso ?IS_IPV6_RANGE(C) andalso ?IS_IPV6_RANGE(D) andalso
         ?IS_IPV6_RANGE(E) andalso ?IS_IPV6_RANGE(F) andalso ?IS_IPV6_RANGE(G) andalso ?IS_IPV6_RANGE(H)).
 
+
 %%--------------------------------------------------------------------------------
 %% Exported Functions
 %%--------------------------------------------------------------------------------
@@ -81,6 +82,7 @@ ip_address_to_json_string({A, B, C, D, E, F, G, H}) when ?IS_IPV6(A, B, C, D, E,
 ip_address_to_json_string(_) ->
     error.
 
+
 %%--------------------------------------------------------------------------------
 %% Internal Functions
 %%--------------------------------------------------------------------------------
@@ -99,6 +101,7 @@ format_ipv6(Xs) ->
             end
     end.
 
+
 -spec format_ipv6([0 .. 65535], non_neg_integer(), non_neg_integer()) ->
           {[string()], not_shortened | shortening | shortened}.
 format_ipv6([], _Zeros, _MaxZeros) ->
@@ -126,6 +129,7 @@ format_ipv6([X | Xs], Zeros0, MaxZeros) ->
             {[to_hex(X) | Ys], shortened}
     end.
 
+
 -spec to_hex(0 .. 65535) -> string().
 to_hex(N) ->
     string:lowercase(integer_to_list(N, 16)).

+ 57 - 57
test/jsone_decode_tests.erl

@@ -6,7 +6,7 @@
 
 -ifdef('NO_MAP_TYPE').
 -define(MAP_OBJECT_TYPE, tuple).
--define(OBJ0, {[]}).
+-define(OBJ0,            {[]}).
 -define(OBJ1(K, V), {[{K, V}]}).
 -define(OBJ2(K1, V1, K2, V2), {[{K1, V1}, {K2, V2}]}).
 -define(OBJ2_DUP_KEY(K1, V1, K2, V2), ?OBJ2(K1, V1, K2, V2)).
@@ -19,35 +19,36 @@
 -define(OBJ2_DUP_KEY_LAST(_K1, _V1, K2, V2), #{K2 => V2}).  % the last value is used
 -endif.
 
+
 decode_test_() ->
     [
      %% Symbols
-     {"false", fun () -> ?assertEqual({ok, false, <<"">>}, jsone_decode:decode(<<"false">>)) end},
-     {"true", fun () -> ?assertEqual({ok, true, <<"">>}, jsone_decode:decode(<<"true">>)) end},
-     {"null", fun () -> ?assertEqual({ok, null, <<"">>}, jsone_decode:decode(<<"null">>)) end},
+     {"false", fun() -> ?assertEqual({ok, false, <<"">>}, jsone_decode:decode(<<"false">>)) end},
+     {"true", fun() -> ?assertEqual({ok, true, <<"">>}, jsone_decode:decode(<<"true">>)) end},
+     {"null", fun() -> ?assertEqual({ok, null, <<"">>}, jsone_decode:decode(<<"null">>)) end},
 
      %% Numbers: Integer
-     {"positive integer", fun () -> ?assertEqual({ok, 1, <<"">>}, jsone_decode:decode(<<"1">>)) end},
-     {"zero", fun () -> ?assertEqual({ok, 0, <<"">>}, jsone_decode:decode(<<"0">>)) end},
-     {"negative integer", fun () -> ?assertEqual({ok, -1, <<"">>}, jsone_decode:decode(<<"-1">>)) end},
+     {"positive integer", fun() -> ?assertEqual({ok, 1, <<"">>}, jsone_decode:decode(<<"1">>)) end},
+     {"zero", fun() -> ?assertEqual({ok, 0, <<"">>}, jsone_decode:decode(<<"0">>)) end},
+     {"negative integer", fun() -> ?assertEqual({ok, -1, <<"">>}, jsone_decode:decode(<<"-1">>)) end},
      {"large integer (no limit on size)",
-      fun () ->
-              ?assertEqual({ok, 111111111111111111111111111111111111111111111111111111111111111111111111111111, <<"">>},
-                           jsone_decode:decode(<<"111111111111111111111111111111111111111111111111111111111111111111111111111111">>))
+      fun() ->
+             ?assertEqual({ok, 111111111111111111111111111111111111111111111111111111111111111111111111111111, <<"">>},
+                          jsone_decode:decode(<<"111111111111111111111111111111111111111111111111111111111111111111111111111111">>))
       end},
      {"integer with leading zero (interpreted as zero and remaining binary)",
-      fun () ->
+      fun() ->
               ?assertEqual({ok, 0, <<"0">>}, jsone_decode:decode(<<"00">>)),
               ?assertEqual({ok, 0, <<"1">>}, jsone_decode:decode(<<"01">>)),
               ?assertEqual({ok, 0, <<"1">>}, jsone_decode:decode(<<"-01">>))
       end},
      {"integer can't begin with an explicit plus sign",
-      fun () -> ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<"+1">>)) end},
+      fun() -> ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<"+1">>)) end},
 
      %% Numbers: Floats
-     {"float: decimal notation", fun () -> ?assertEqual({ok, 1.23, <<"">>}, jsone_decode:decode(<<"1.23">>)) end},
+     {"float: decimal notation", fun() -> ?assertEqual({ok, 1.23, <<"">>}, jsone_decode:decode(<<"1.23">>)) end},
      {"float: exponential notation",
-      fun () ->
+      fun() ->
               ?assertEqual({ok, 12.345, <<"">>}, jsone_decode:decode(<<"12345e-3">>)),  % lower case 'e'
               ?assertEqual({ok, 12.345, <<"">>}, jsone_decode:decode(<<"12345E-3">>)),  % upper case 'E'
               ?assertEqual({ok, 12.345, <<"">>}, jsone_decode:decode(<<"12345.0e-3">>)),
@@ -58,7 +59,7 @@ decode_test_() ->
               ?assertEqual({ok, 123.0, <<"">>}, jsone_decode:decode(<<"1.23000000000000000000e+02">>))
       end},
      {"float: invalid format",
-      fun () ->
+      fun() ->
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<".123">>)),  % omitted integer part
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<"0.">>)),  % omitted fraction part: EOS
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<"0.e+3">>)),  % omitted fraction part: with exponent part
@@ -73,15 +74,15 @@ decode_test_() ->
       end},
 
      %% Strings
-     {"simple string", fun () -> ?assertEqual({ok, <<"abc">>, <<"">>}, jsone_decode:decode(<<"\"abc\"">>)) end},
+     {"simple string", fun() -> ?assertEqual({ok, <<"abc">>, <<"">>}, jsone_decode:decode(<<"\"abc\"">>)) end},
      {"string: escaped characters",
-      fun () ->
+      fun() ->
               Input = list_to_binary([$", [[$\\, C] || C <- [$", $/, $\\, $b, $f, $n, $r, $t]], $"]),
               Expected = <<"\"\/\\\b\f\n\r\t">>,
               ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input))
       end},
      {"string: escaped Unicode characters",
-      fun () ->
+      fun() ->
               %% japanese
               Input1 = <<"\"\\u3042\\u3044\\u3046\\u3048\\u304A\"">>,
               Expected1 = <<"あいうえお">>,  % assumed that the encoding of this file is UTF-8
@@ -103,28 +104,28 @@ decode_test_() ->
               ?assertEqual({ok, Expected4, <<"">>}, jsone_decode:decode(Input4))
       end},
      {"string: surrogate pairs",
-      fun () ->
+      fun() ->
               Input = <<"\"\\ud848\\udc49\\ud848\\udc9a\\ud848\\udcfc\"">>,
               Expected = <<"𢁉𢂚𢃼">>,
               ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input))
       end},
      {"string: control characters",
-      fun () ->
+      fun() ->
               Ctrls = lists:seq(0, 16#1f),
-              lists:foreach(fun (C) ->
-                                    %% Control characters are unacceptable
-                                    ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<$", C, $">>))
+              lists:foreach(fun(C) ->
+                                   %% Control characters are unacceptable
+                                   ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<$", C, $">>))
                             end,
                             Ctrls),
-              lists:foreach(fun (C) ->
-                                    %% `allow_ctrl_chars' option allows strings which contain unescaped control characters
-                                    ?assertEqual({ok, <<C>>, <<"">>},
-                                                 jsone_decode:decode(<<$", C, $">>, [{allow_ctrl_chars, true}]))
+              lists:foreach(fun(C) ->
+                                   %% `allow_ctrl_chars' option allows strings which contain unescaped control characters
+                                   ?assertEqual({ok, <<C>>, <<"">>},
+                                                jsone_decode:decode(<<$", C, $">>, [{allow_ctrl_chars, true}]))
                             end,
                             Ctrls)
       end},
      {"string: invalid escape characters",
-      fun () ->
+      fun() ->
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<"\"\\z\"">>)),  % '\z' is undefined
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<"\"\\uab\"">>)),  % too few hex characters
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<"\"\\ud848\"">>)),  % high(first) surrogate only
@@ -137,117 +138,117 @@ decode_test_() ->
 
      %% Arrays
      {"simple array",
-      fun () ->
+      fun() ->
               Input = <<"[1,2,\"abc\",null]">>,
               Expected = [1, 2, <<"abc">>, null],
               ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input))
       end},
      {"array: contains whitespaces",
-      fun () ->
+      fun() ->
               Input = <<"[  1,\t2, \n \"abc\",\r null]">>,
               Expected = [1, 2, <<"abc">>, null],
               ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input))
       end},
      {"empty array",
-      fun () ->
+      fun() ->
               ?assertEqual({ok, [], <<"">>}, jsone_decode:decode(<<"[]">>)),
               ?assertEqual({ok, [], <<"">>}, jsone_decode:decode(<<"[ \t\r\n]">>))
       end},
      {"array: trailing comma is disallowed",
-      fun () ->
+      fun() ->
               Input = <<"[1, 2, \"abc\", null, ]">>,
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(Input))
       end},
      {"array: missing comma",
-      fun () ->
+      fun() ->
               Input = <<"[1 2, \"abc\", null]">>,  % a missing comma between '1' and '2'
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(Input))
       end},
      {"array: missing closing bracket",
-      fun () ->
+      fun() ->
               Input = <<"[1, 2, \"abc\", null">>,
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(Input))
       end},
 
      %% Objects
      {"simple object",
-      fun () ->
+      fun() ->
               Input = <<"{\"1\":2,\"key\":\"value\"}">>,
               Expected = ?OBJ2(<<"1">>, 2, <<"key">>, <<"value">>),
               ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input)),  % `map' is the default format
               ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input, [{object_format, ?MAP_OBJECT_TYPE}]))
       end},
      {"simple object: tuple or proplist",
-      fun () ->
+      fun() ->
               Input = <<"{\"1\":2,\"key\":\"value\"}">>,
               Expected = {[{<<"1">>, 2}, {<<"key">>, <<"value">>}]},
               ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input, [{object_format, tuple}])),
               ?assertEqual({ok, element(1, Expected), <<"">>}, jsone_decode:decode(Input, [{object_format, proplist}]))
       end},
      {"object: contains whitespaces",
-      fun () ->
+      fun() ->
               Input = <<"{  \"1\" :\t 2,\n\r\"key\" :   \n  \"value\"}">>,
               Expected = ?OBJ2(<<"1">>, 2, <<"key">>, <<"value">>),
               ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input))
       end},
      {"empty object",
-      fun () ->
+      fun() ->
               ?assertEqual({ok, ?OBJ0, <<"">>}, jsone_decode:decode(<<"{}">>)),
               ?assertEqual({ok, ?OBJ0, <<"">>}, jsone_decode:decode(<<"{ \t\r\n}">>)),
               ?assertEqual({ok, {[]}, <<"">>}, jsone_decode:decode(<<"{}">>, [{object_format, tuple}])),
               ?assertEqual({ok, [{}], <<"">>}, jsone_decode:decode(<<"{}">>, [{object_format, proplist}]))
       end},
      {"empty object: map",
-      fun () ->
-              ?assertEqual({ok, ?OBJ0, <<"">>}, jsone_decode:decode(<<"{}">>, [{object_format, ?MAP_OBJECT_TYPE}]))
+      fun() ->
+             ?assertEqual({ok, ?OBJ0, <<"">>}, jsone_decode:decode(<<"{}">>, [{object_format, ?MAP_OBJECT_TYPE}]))
       end},
      {"duplicated members: map",
-      fun () ->
+      fun() ->
               Input = <<"{\"1\":\"first\",\"1\":\"second\"}">>,
               Expected = ?OBJ2_DUP_KEY(<<"1">>, <<"first">>, <<"1">>, <<"second">>),
               ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input, [{object_format, ?MAP_OBJECT_TYPE}]))
       end},
      {"duplicated members last: map",
-      fun () ->
+      fun() ->
               Input = <<"{\"1\":\"first\",\"1\":\"second\"}">>,
               Expected = ?OBJ2_DUP_KEY_LAST(<<"1">>, <<"first">>, <<"1">>, <<"second">>),
               ?assertEqual({ok, Expected, <<"">>},
                            jsone_decode:decode(Input, [{object_format, ?MAP_OBJECT_TYPE}, {duplicate_map_keys, last}]))
       end},
      {"object: trailing comma is disallowed",
-      fun () ->
+      fun() ->
               Input = <<"{\"1\":2, \"key\":\"value\", }">>,
               io:format("~p\n", [catch jsone_decode:decode(Input)]),
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(Input, [{object_format, tuple}]))
       end},
      {"object: missing comma",
-      fun () ->
+      fun() ->
               Input = <<"{\"1\":2 \"key\":\"value\"}">>,
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(Input))
       end},
      {"object: missing field key",
-      fun () ->
+      fun() ->
               Input = <<"{:2, \"key\":\"value\"}">>,
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(Input))
       end},
      {"object: non string key",
-      fun () ->
+      fun() ->
               Input = <<"{1:2, \"key\":\"value\"}">>,
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(Input))
       end},
      {"object: missing field value",
-      fun () ->
+      fun() ->
               Input = <<"{\"1\", \"key\":\"value\"}">>,
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(Input))
       end},
      {"object: missing closing brace",
-      fun () ->
+      fun() ->
               Input = <<"{\"1\":2 \"key\":\"value\"">>,
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(Input))
       end},
      {"atom keys",
-      fun () ->
-              KeyOpt = fun (Keys) -> [{keys, Keys}, {object_format, proplist}] end,
+      fun() ->
+              KeyOpt = fun(Keys) -> [{keys, Keys}, {object_format, proplist}] end,
               Input = <<"{\"foo\":\"ok\"}">>,
               ?assertEqual([{<<"foo">>, <<"ok">>}], jsone:decode(Input, KeyOpt(binary))),
               ?assertEqual([{foo, <<"ok">>}], jsone:decode(Input, KeyOpt(atom))),
@@ -261,28 +262,27 @@ decode_test_() ->
               ?assertEqual(Value, atom_to_binary(Atom, latin1))
       end},
      {"garbage remainings chars",
-      fun () ->
+      fun() ->
               ?assertError(badarg, jsone:decode(<<"1@">>)),
               ?assertEqual(1, jsone:decode(<<"1 \n\t\r ">>))  % Whitespaces are OK
       end},
 
      %% Others
      {"compound data",
-      fun () ->
+      fun() ->
               Input = <<"  [true, {\"1\" : 2, \"array\":[[[[1]]], {\"ab\":\"cd\"}, false]}, null]   ">>,
               Expected = [true, ?OBJ2(<<"1">>, 2, <<"array">>, [[[[1]]], ?OBJ1(<<"ab">>, <<"cd">>), false]), null],
               ?assertEqual({ok, Expected, <<"   ">>}, jsone_decode:decode(Input))
       end},
      {"undefined_as_null option",
-      fun () ->
+      fun() ->
               ?assertEqual({ok, undefined, <<>>}, jsone_decode:decode(<<"null">>, [undefined_as_null])),  % OK
               ?assertEqual({ok, null, <<>>}, jsone_decode:decode(<<"null">>, []))  % OK
       end},
      {"Invalid UTF-8 characters",
-      fun () ->
-              Input =
-                  <<123, 34, 105, 100, 34, 58, 34, 190, 72, 94, 90, 253, 121, 94, 71, 73, 68, 91, 122, 211, 253, 32, 94,
-                    86, 67, 163, 253, 230, 34, 125>>,
+      fun() ->
+              Input = <<123, 34, 105, 100, 34, 58, 34, 190, 72, 94, 90, 253, 121, 94, 71, 73, 68, 91, 122, 211, 253, 32,
+                        94, 86, 67, 163, 253, 230, 34, 125>>,
               ?assertMatch({ok, _, _}, jsone:try_decode(Input)),
               ?assertMatch({error, {badarg, _}}, jsone:try_decode(Input, [reject_invalid_utf8]))
       end}].

+ 59 - 54
test/jsone_encode_tests.erl

@@ -16,16 +16,17 @@
 -define(OBJECT_FROM_LIST(List), maps:from_list(List)).
 -endif.
 
+
 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},
+     {"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: Inline json term
      {"json",
-      fun () ->
+      fun() ->
               ?assertEqual({ok, <<"{\"foo\":[1,2,3],\"bar\":\"", 195, 169, "ok\"}">>},
                            jsone_encode:encode(?OBJ2(foo,
                                                      {{json, ["[" | [$1, ",2", <<",3]">>]]}},
@@ -40,24 +41,24 @@ encode_test_() ->
               ?assertEqual({ok, <<"[[1,2,3]]">>}, jsone_encode:encode([{{json, <<"[1,2,3]">>}}]))
       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},
+     {"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))
+      fun() ->
+             ?assertEqual({ok, <<"11111111111111111111111111111111111111111111111111111111111111111111111">>},
+                          jsone_encode:encode(11111111111111111111111111111111111111111111111111111111111111111111111))
       end},
 
      %% Numbers: Float",
      {"float",
-      fun () ->
+      fun() ->
               Input = 1.234,
               ?assertMatch({ok, _}, jsone_encode:encode(Input)),
               ?assertEqual(Input, binary_to_float(element(2, jsone_encode:encode(Input))))
       end},
      {"float_format option",
-      fun () ->
+      fun() ->
               Input = 1.23,
               ?assertEqual({ok, <<"1.22999999999999998224e+00">>}, jsone_encode:encode(Input)),
               ?assertEqual({ok, <<"1.2300e+00">>}, jsone_encode:encode(Input, [{float_format, [{scientific, 4}]}])),
@@ -67,23 +68,23 @@ encode_test_() ->
       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},
+     {"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 () ->
+      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)),
               ?assertEqual({ok, Expected}, jsone_encode:encode(Input, [native_utf8]))
       end},
      {"string: contains forward slashes",
-      fun () ->
+      fun() ->
               Input = <<"1/2">>,
               ?assertEqual({ok, <<"\"1\\/2\"">>}, jsone_encode:encode(Input)),
               ?assertEqual({ok, <<"\"1/2\"">>}, jsone_encode:encode(Input, [native_forward_slash]))
       end},
      {"string: contains control characters",
-      fun () ->
+      fun() ->
               Ctrls = lists:seq(16#00, 16#1F) -- [$\b, $\f, $\n, $\r, $\t],
               Input = list_to_binary(Ctrls),
               Expected = list_to_binary([$", [io_lib:format("\\u00~2.16.0b", [C]) || C <- Ctrls], $"]),
@@ -91,7 +92,7 @@ encode_test_() ->
               ?assertEqual({ok, Expected}, jsone_encode:encode(Input, [native_utf8]))
       end},
      {"string: contains multi-byte (UTF-8 encoded) characters",
-      fun () ->
+      fun() ->
               %% japanese
               Input1 = <<"あいうえお">>,  % assumed that the encoding of this file is UTF-8
               Expected1 = <<"\"\\u3042\\u3044\\u3046\\u3048\\u304a\"">>,
@@ -107,7 +108,7 @@ encode_test_() ->
               ?assertEqual({ok, Expected22}, jsone_encode:encode(Input2, [native_utf8]))
       end},
      {"string: contains surrogate pairs",
-      fun () ->
+      fun() ->
               Input = <<"𢁉𢂚𢃼">>,
               Expected = <<"\"\\ud848\\udc49\\ud848\\udc9a\\ud848\\udcfc\"">>,
               ?assertEqual({ok, Expected}, jsone_encode:encode(Input))
@@ -115,7 +116,7 @@ encode_test_() ->
 
      %% Strings variant: Datetimes
      {"datetime: iso8601: utc",
-      fun () ->
+      fun() ->
               ?assertEqual({ok, <<"\"2015-06-25T14:57:25Z\"">>}, jsone_encode:encode({{2015, 6, 25}, {14, 57, 25}})),
               ?assertEqual({ok, <<"\"2015-06-25T14:57:25Z\"">>},
                            jsone_encode:encode({{2015, 6, 25}, {14, 57, 25}}, [{datetime_format, iso8601}])),
@@ -123,7 +124,7 @@ encode_test_() ->
                            jsone_encode:encode({{2015, 6, 25}, {14, 57, 25}}, [{datetime_format, {iso8601, utc}}]))
       end},
      {"datetime: iso8601: local",
-      fun () ->
+      fun() ->
               {ok, Json} = jsone_encode:encode({{2015, 6, 25}, {14, 57, 25}}, [{datetime_format, {iso8601, local}}]),
 
               UTC = {{1970, 1, 2}, {0, 0, 0}},
@@ -136,7 +137,7 @@ encode_test_() ->
               end
       end},
      {"datetime: iso8601: timezone",
-      fun () ->
+      fun() ->
               ?assertEqual({ok, <<"\"2015-06-25T14:57:25Z\"">>},
                            jsone_encode:encode({{2015, 6, 25}, {14, 57, 25}}, [{datetime_format, {iso8601, 0}}])),
               ?assertEqual({ok, <<"\"2015-06-25T14:57:25+00:01\"">>},
@@ -148,7 +149,7 @@ encode_test_() ->
       ?_assertEqual({ok, <<"[\"2015-06-25T14:57:25Z\"]">>}, jsone_encode:encode([{{2015, 6, 25}, {14, 57, 25}}]))},
 
      {"datetime: iso8601: with fractions of seconds",
-      fun () ->
+      fun() ->
               ?assertEqual({ok, <<"\"2015-06-25T14:57:25.325Z\"">>},
                            jsone_encode:encode({{2015, 6, 25}, {14, 57, 25.3245}})),
               ?assertEqual({ok, <<"\"2015-06-25T14:57:05.320Z\"">>},
@@ -157,13 +158,13 @@ encode_test_() ->
 
      %% Arrays
      {"simple array",
-      fun () ->
+      fun() ->
               Input = [1, 2, 3],
               Expected = <<"[1,2,3]">>,
               ?assertEqual({ok, Expected}, jsone_encode:encode(Input))
       end},
      {"empty array",
-      fun () ->
+      fun() ->
               Input = [],
               Expected = <<"[]">>,
               ?assertEqual({ok, Expected}, jsone_encode:encode(Input))
@@ -171,7 +172,7 @@ encode_test_() ->
 
      %% Objects
      {"simple object",
-      fun () ->
+      fun() ->
               Input1 = {[{<<"key">>, <<"value">>}, {<<"1">>, 2}]},
               Input2 = [{<<"key">>, <<"value">>}, {<<"1">>, 2}],
               Expected = <<"{\"key\":\"value\",\"1\":2}">>,
@@ -179,7 +180,7 @@ encode_test_() ->
               ?assertEqual({ok, Expected}, jsone_encode:encode(Input2))
       end},
      {"empty object",
-      fun () ->
+      fun() ->
               Input1 = {[]},
               Input2 = [{}],
               Expected = <<"{}">>,
@@ -187,24 +188,24 @@ encode_test_() ->
               ?assertEqual({ok, Expected}, jsone_encode:encode(Input2))
       end},
      {"simple object: map",
-      fun () ->
+      fun() ->
               Input = ?OBJ2(<<"1">>, 2, <<"key">>, <<"value">>),
               Expected = <<"{\"1\":2,\"key\":\"value\"}">>,
               ?assertEqual({ok, Expected}, jsone_encode:encode(Input))
       end},
      {"empty object: map",
-      fun () ->
+      fun() ->
               Input = ?OBJ0,
               Expected = <<"{}">>,
               ?assertEqual({ok, Expected}, jsone_encode:encode(Input))
       end},
      {"atom key is allowed",
-      fun () ->
+      fun() ->
               Expected = <<"{\"key\":2}">>,
               ?assertEqual({ok, Expected}, jsone_encode:encode({[{key, 2}]}))
       end},
      {"object_key_type option",
-      fun () ->
+      fun() ->
               %% key: atom
               ?assertEqual({ok, <<"{\"a\":2}">>}, jsone_encode:encode(?OBJ1(a, 2), [{object_key_type, string}])),  % OK
               ?assertEqual({ok, <<"{\"a\":2}">>}, jsone_encode:encode(?OBJ1(a, 2), [{object_key_type, scalar}])),  % OK
@@ -234,18 +235,22 @@ encode_test_() ->
               ?assertEqual({ok, <<"{\"{}\":2}">>}, jsone_encode:encode(?OBJ1(?OBJ0, 2), [{object_key_type, value}]))  % OK
       end},
      {"non binary object member key is disallowed",
-      fun () ->
+      fun() ->
               ?assertMatch({error, {badarg, _}}, jsone_encode:encode({[{1, 2}]})),
               ?assertMatch({error, {badarg, _}}, jsone_encode:encode({[{"1", 2}]}))
       end},
      {"undefined_as_null option",
-      fun () ->
+      fun() ->
               ?assertEqual({ok, <<"null">>}, jsone_encode:encode(undefined, [undefined_as_null])),  % OK
               ?assertEqual({ok, <<"\"undefined\"">>}, jsone_encode:encode(undefined, []))  % OK
       end},
      {"skip_undefined option",
-      fun () ->
-              Object = #{<<"1">> => undefined, <<"2">> => 3, <<"3">> => undefined},
+      fun() ->
+              Object = #{
+                         <<"1">> => undefined,
+                         <<"2">> => 3,
+                         <<"3">> => undefined
+                        },
               ?assertEqual({ok, <<"{\"1\":null,\"2\":3,\"3\":null}">>},
                            jsone_encode:encode(Object, [undefined_as_null])),
               ?assertEqual({ok, <<"{\"2\":3}">>}, jsone_encode:encode(Object, [skip_undefined]))
@@ -253,7 +258,7 @@ encode_test_() ->
 
      %% Pretty Print
      {"space",
-      fun () ->
+      fun() ->
               ?assertEqual({ok, <<"[]">>}, jsone_encode:encode([], [{space, 1}])),
               ?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}])),
@@ -262,7 +267,7 @@ encode_test_() ->
               ?assertEqual({ok, <<"{\"a\":  1,  \"b\":  2}">>}, jsone_encode:encode(?OBJ2(a, 1, b, 2), [{space, 2}]))
       end},
      {"indent",
-      fun () ->
+      fun() ->
               ?assertEqual({ok, <<"[]">>}, jsone_encode:encode([], [{indent, 1}])),
               ?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}])),
@@ -273,7 +278,7 @@ encode_test_() ->
                            jsone_encode:encode(?OBJ2(a, 1, b, 2), [{indent, 2}]))
       end},
      {"indent+space",
-      fun () ->
+      fun() ->
               ?assertEqual({ok, <<"[]">>}, jsone_encode:encode([], [{indent, 1}, {space, 1}])),
               ?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]">>},
@@ -287,26 +292,25 @@ encode_test_() ->
 
      %% `map_unknown_value` option
      {"`map_unknown_value` option",
-      fun () ->
+      fun() ->
               Input = [{1, 2, 3, 4}],
-              MapFun =
-                  fun ({_, _, _, _} = Ip4) ->
-                          {ok, list_to_binary(inet:ntoa(Ip4))};
-                      (_) ->
-                          error
-                  end,
+              MapFun = fun({_, _, _, _} = Ip4) ->
+                               {ok, list_to_binary(inet:ntoa(Ip4))};
+                          (_) ->
+                               error
+                       end,
               Expected = <<"[\"1.2.3.4\"]">>,
               ?assertEqual(Expected, jsone:encode(Input, [{map_unknown_value, MapFun}]))
       end},
      {"`map_unknown_value` option with singleton tuple",
-      fun () ->
+      fun() ->
               Input = [{foo}],
-              MapFun = fun (Value) -> {ok, unicode:characters_to_binary(io_lib:format("~p~n", [Value]))} end,
+              MapFun = fun(Value) -> {ok, unicode:characters_to_binary(io_lib:format("~p~n", [Value]))} end,
               Expected = <<"[\"{foo}\\n\"]">>,
               ?assertEqual(Expected, jsone:encode(Input, [{map_unknown_value, MapFun}]))
       end},
      {"IP address",
-      fun () ->
+      fun() ->
               Input = #{ip => {127, 0, 0, 1}},
               Expected = <<"{\"ip\":\"127.0.0.1\"}">>,
               ?assertEqual(Expected, jsone:encode(Input, [{map_unknown_value, fun jsone:ip_address_to_json_string/1}])),
@@ -317,9 +321,10 @@ encode_test_() ->
 
      %% Others
      {"compound data",
-      fun () ->
-              Input =
-                  [true, {[{<<"1">>, 2}, {<<"array">>, [[[[1]]], {[{<<"ab">>, <<"cd">>}]}, [], ?OBJ0, false]}]}, null],
+      fun() ->
+              Input = [true,
+                       {[{<<"1">>, 2}, {<<"array">>, [[[[1]]], {[{<<"ab">>, <<"cd">>}]}, [], ?OBJ0, false]}]},
+                       null],
               Expected = <<"[true,{\"1\":2,\"array\":[[[[1]]],{\"ab\":\"cd\"},[],{},false]},null]">>,
               ?assertEqual({ok, Expected}, jsone_encode:encode(Input)),
 
@@ -328,15 +333,15 @@ encode_test_() ->
               ?assertEqual({ok, PpExpected}, jsone_encode:encode(Input, [{indent, 1}, {space, 1}]))
       end},
      {"invalid value",
-      fun () ->
+      fun() ->
               Pid = self(),
               PidString = list_to_binary(io_lib:format("~p", [Pid])),
               ?assertEqual({ok, <<$", PidString/binary, $">>}, jsone_encode:encode(Pid)),
               ?assertMatch({error, {badarg, _}}, jsone_encode:encode(Pid, [{map_unknown_value, undefined}]))
       end},
-     {"wrong option", fun () -> ?assertError(badarg, jsone_encode:encode(1, [{no_such_option, hoge}])) end},
+     {"wrong option", fun() -> ?assertError(badarg, jsone_encode:encode(1, [{no_such_option, hoge}])) end},
      {"canonical_form",
-      fun () ->
+      fun() ->
               Obj1 = ?OBJECT_FROM_LIST([{<<"key", (integer_to_binary(I))/binary>>, I} || I <- lists:seq(1000, 0, -1)]),
               Obj2 = ?OBJECT_FROM_LIST([{<<"key", (integer_to_binary(I))/binary>>, I} || I <- lists:seq(0, 1000, 1)]),
               ?assertEqual(jsone_encode:encode(Obj1, [canonical_form]), jsone_encode:encode(Obj2, [canonical_form]))

+ 17 - 15
test/jsone_inet_tests.erl

@@ -3,34 +3,36 @@
 
 -include_lib("eunit/include/eunit.hrl").
 
+
 format_ipv4_test() ->
     Expected = <<"127.0.0.1">>,
     {ok, Addr} = inet:parse_ipv4_address(binary_to_list(Expected)),
     {ok, Actual} = jsone_inet:ip_address_to_json_string(Addr),
     ?assertEqual(Actual, Expected).
 
+
 format_ipv6_test() ->
-    Addresses =
-        [<<"::127.0.0.1">>,
-         <<"::ffff:192.0.2.1">>,
-         <<"::ffff:0:255.255.255.255">>,
-         <<"64:ff9b::0.0.0.0">>,
-         <<"64:ff9b:1::192.168.1.1">>,
-         <<"64:ff9b:1::1:192.168.1.1">>,
-         <<"::1:2:3:2001:db8">>,
-         <<"2001:db8::">>,
-         <<"2001:db8::1">>,
-         <<"2001:db8::1:0:0:1">>,
-         <<"2001:db8:0:1:1:1:1:1">>,
-         <<"2001:0:0:1::1">>,
-         <<"2001:db8:85a3::8a2e:370:7334">>],
-    lists:foreach(fun (Expected) ->
+    Addresses = [<<"::127.0.0.1">>,
+                 <<"::ffff:192.0.2.1">>,
+                 <<"::ffff:0:255.255.255.255">>,
+                 <<"64:ff9b::0.0.0.0">>,
+                 <<"64:ff9b:1::192.168.1.1">>,
+                 <<"64:ff9b:1::1:192.168.1.1">>,
+                 <<"::1:2:3:2001:db8">>,
+                 <<"2001:db8::">>,
+                 <<"2001:db8::1">>,
+                 <<"2001:db8::1:0:0:1">>,
+                 <<"2001:db8:0:1:1:1:1:1">>,
+                 <<"2001:0:0:1::1">>,
+                 <<"2001:db8:85a3::8a2e:370:7334">>],
+    lists:foreach(fun(Expected) ->
                           {ok, Addr} = inet:parse_ipv6_address(binary_to_list(Expected)),
                           {ok, Bin} = jsone_inet:ip_address_to_json_string(Addr),
                           ?assertEqual(Expected, Bin)
                   end,
                   Addresses).
 
+
 invalid_ip_addr_test() ->
     ?assertEqual(jsone_inet:ip_address_to_json_string(foo), error),
     ?assertEqual(jsone_inet:ip_address_to_json_string({1, 2, 3}), error),