new tests for edge cases, fixed bug in passing external option parsing
This commit is contained in:
parent
c4b5e7010c
commit
d5a91c0a06
1 changed files with 21 additions and 12 deletions
|
@ -27,7 +27,6 @@
|
||||||
|
|
||||||
|
|
||||||
-record(opts, {
|
-record(opts, {
|
||||||
output_encoding = utf8,
|
|
||||||
space = 0,
|
space = 0,
|
||||||
indent = 0,
|
indent = 0,
|
||||||
depth = 0
|
depth = 0
|
||||||
|
@ -49,8 +48,6 @@ format(Source, Opts) when (is_binary(Source) andalso is_list(Opts))
|
||||||
|
|
||||||
parse_opts(Opts) -> parse_opts(Opts, #opts{}).
|
parse_opts(Opts) -> parse_opts(Opts, #opts{}).
|
||||||
|
|
||||||
parse_opts([{output_encoding, Val}|Rest], Opts) when Val == utf8 ->
|
|
||||||
parse_opts(Rest, Opts#opts{output_encoding = Val});
|
|
||||||
parse_opts([{space, Val}|Rest], Opts) when is_integer(Val), Val > 0 ->
|
parse_opts([{space, Val}|Rest], Opts) when is_integer(Val), Val > 0 ->
|
||||||
parse_opts(Rest, Opts#opts{space = Val});
|
parse_opts(Rest, Opts#opts{space = Val});
|
||||||
parse_opts([space|Rest], Opts) ->
|
parse_opts([space|Rest], Opts) ->
|
||||||
|
@ -71,12 +68,12 @@ extract_opts(Opts) ->
|
||||||
extract_parser_opts([], Acc) -> Acc;
|
extract_parser_opts([], Acc) -> Acc;
|
||||||
extract_parser_opts([{K,V}|Rest], Acc) ->
|
extract_parser_opts([{K,V}|Rest], Acc) ->
|
||||||
case lists:member(K, [loose_unicode, escape_forward_slash, explicit_end]) of
|
case lists:member(K, [loose_unicode, escape_forward_slash, explicit_end]) of
|
||||||
true -> [{K,V}] ++ Acc
|
true -> extract_parser_opts(Rest, [{K,V}] ++ Acc)
|
||||||
; false -> extract_parser_opts(Rest, Acc)
|
; false -> extract_parser_opts(Rest, Acc)
|
||||||
end;
|
end;
|
||||||
extract_parser_opts([K|Rest], Acc) ->
|
extract_parser_opts([K|Rest], Acc) ->
|
||||||
case lists:member(K, [loose_unicode, escape_forward_slash, explicit_end]) of
|
case lists:member(K, [loose_unicode, escape_forward_slash, explicit_end]) of
|
||||||
true -> [K] ++ Acc
|
true -> extract_parser_opts(Rest, [K] ++ Acc)
|
||||||
; false -> extract_parser_opts(Rest, Acc)
|
; false -> extract_parser_opts(Rest, Acc)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -143,15 +140,9 @@ fold(Event, {[array|Stack], Acc, Opts = #opts{depth = Depth}}) ->
|
||||||
; start_object -> {[object_start, array|Stack], [Acc, ?comma, indent_or_space(Opts), ?start_object], Opts}
|
; start_object -> {[object_start, array|Stack], [Acc, ?comma, indent_or_space(Opts), ?start_object], Opts}
|
||||||
; start_array -> {[array_start, array|Stack], [Acc, ?comma, indent_or_space(Opts), ?start_array], Opts}
|
; start_array -> {[array_start, array|Stack], [Acc, ?comma, indent_or_space(Opts), ?start_array], Opts}
|
||||||
end;
|
end;
|
||||||
fold(end_json, {[], Acc, Opts}) -> encode(Acc, Opts).
|
fold(end_json, {[], Acc, _Opts}) -> unicode:characters_to_binary(Acc, utf8).
|
||||||
|
|
||||||
|
|
||||||
encode(Acc, Opts) when is_list(Acc) ->
|
|
||||||
case Opts#opts.output_encoding of
|
|
||||||
iolist -> Acc
|
|
||||||
; utf8 -> unicode:characters_to_binary(Acc, utf8)
|
|
||||||
; _ -> erlang:error(badarg)
|
|
||||||
end;
|
|
||||||
encode(string, String) ->
|
encode(string, String) ->
|
||||||
[?quote, String, ?quote];
|
[?quote, String, ?quote];
|
||||||
encode(literal, Literal) ->
|
encode(literal, Literal) ->
|
||||||
|
@ -210,6 +201,11 @@ basic_test_() ->
|
||||||
{"really simple object",
|
{"really simple object",
|
||||||
?_assert(format(<<"{\"k\":\"v\"}">>, []) =:= <<"{\"k\":\"v\"}">>)
|
?_assert(format(<<"{\"k\":\"v\"}">>, []) =:= <<"{\"k\":\"v\"}">>)
|
||||||
},
|
},
|
||||||
|
{"nested object",
|
||||||
|
?_assert(format(<<"{\"k\":{\"k\":\"v\"}, \"j\":{}}">>, []
|
||||||
|
) =:= <<"{\"k\":{\"k\":\"v\"},\"j\":{}}">>
|
||||||
|
)
|
||||||
|
},
|
||||||
{"simple array",
|
{"simple array",
|
||||||
?_assert(format(<<" [\n\ttrue,\n\tfalse , \n \tnull\n] ">>,
|
?_assert(format(<<" [\n\ttrue,\n\tfalse , \n \tnull\n] ">>,
|
||||||
[]
|
[]
|
||||||
|
@ -217,6 +213,7 @@ basic_test_() ->
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{"really simple array", ?_assert(format(<<"[1]">>, []) =:= <<"[1]">>)},
|
{"really simple array", ?_assert(format(<<"[1]">>, []) =:= <<"[1]">>)},
|
||||||
|
{"nested array", ?_assert(format(<<"[[[]]]">>, []) =:= <<"[[[]]]">>)},
|
||||||
{"nested structures",
|
{"nested structures",
|
||||||
?_assert(format(
|
?_assert(format(
|
||||||
<<"[{\"key\":\"value\",
|
<<"[{\"key\":\"value\",
|
||||||
|
@ -227,6 +224,11 @@ basic_test_() ->
|
||||||
]">>, []
|
]">>, []
|
||||||
) =:= <<"[{\"key\":\"value\",\"another key\":\"another value\",\"a list\":[true,false]},[[{}]]]">>
|
) =:= <<"[{\"key\":\"value\",\"another key\":\"another value\",\"a list\":[true,false]},[[{}]]]">>
|
||||||
)
|
)
|
||||||
|
},
|
||||||
|
{"simple nested structure",
|
||||||
|
?_assert(format(<<"[[],{\"k\":[[],{}],\"j\":{}},[]]">>, []
|
||||||
|
) =:= <<"[[],{\"k\":[[],{}],\"j\":{}},[]]">>
|
||||||
|
)
|
||||||
}
|
}
|
||||||
].
|
].
|
||||||
|
|
||||||
|
@ -282,6 +284,13 @@ opts_test_() ->
|
||||||
}
|
}
|
||||||
].
|
].
|
||||||
|
|
||||||
|
ext_opts_test_() ->
|
||||||
|
[{"extopts", ?_assert(format(<<"[]">>,
|
||||||
|
[loose_unicode, {escape_forward_slash, true}]
|
||||||
|
) =:= <<"[]">>
|
||||||
|
)}
|
||||||
|
].
|
||||||
|
|
||||||
terms_test_() ->
|
terms_test_() ->
|
||||||
[
|
[
|
||||||
{"terms",
|
{"terms",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue