better tests for encoder, still needs more cases tho
This commit is contained in:
parent
e7025efe50
commit
c743debc6d
1 changed files with 42 additions and 18 deletions
|
@ -125,17 +125,41 @@ maybe_done(Forms, _) -> {error, {badjson, Forms}}.
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
|
||||||
|
|
||||||
encode(Term) ->
|
|
||||||
case loop((encoder())(Term), []) of
|
encode(Terms) -> encode_whole(Terms) andalso encode_incremental(Terms).
|
||||||
|
|
||||||
|
|
||||||
|
encode_whole(Terms) ->
|
||||||
|
case loop((encoder())(Terms), []) of
|
||||||
%% unwrap naked values
|
%% unwrap naked values
|
||||||
{ok, [Term]} -> true
|
{ok, [Terms]} -> true
|
||||||
; {ok, Term} -> true
|
; {ok, Terms} -> true
|
||||||
; {error, badjson} -> false
|
; _ -> false
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
||||||
loop({error, _}, _Acc) ->
|
encode_incremental(Terms) when is_list(Terms) ->
|
||||||
{error, badjson};
|
encode_incremental(Terms, encoder(), Terms, []);
|
||||||
|
%% we could feed naked terms to the regular encoder, but we already do that, so
|
||||||
|
%% cheat instead
|
||||||
|
encode_incremental(_) -> true.
|
||||||
|
|
||||||
|
encode_incremental([Term], F, Expected, Acc) ->
|
||||||
|
case loop(F([Term]), []) of
|
||||||
|
{ok, R} -> Expected =:= Acc ++ R
|
||||||
|
; _ -> false
|
||||||
|
end;
|
||||||
|
encode_incremental([Term|Terms], F, Expected, Acc) ->
|
||||||
|
case loop(F([Term]), []) of
|
||||||
|
{incomplete, Next, R} ->
|
||||||
|
encode_incremental(Terms, Next, Expected, Acc ++ R)
|
||||||
|
; _ ->
|
||||||
|
false
|
||||||
|
end.
|
||||||
|
|
||||||
|
|
||||||
|
loop({error, _}, _) -> error;
|
||||||
|
loop({incomplete, Next}, Acc) -> {incomplete, Next, lists:reverse(Acc)};
|
||||||
loop({event, end_json, Next}, Acc) ->
|
loop({event, end_json, Next}, Acc) ->
|
||||||
{incomplete, F} = Next(),
|
{incomplete, F} = Next(),
|
||||||
{error, {badjson, []}} = F([]),
|
{error, {badjson, []}} = F([]),
|
||||||
|
@ -145,7 +169,7 @@ loop({event, Event, Next}, Acc) -> loop(Next(), [Event] ++ Acc).
|
||||||
|
|
||||||
encode_test_() ->
|
encode_test_() ->
|
||||||
[
|
[
|
||||||
{"empty object", ?_assert(encode([start_object, end_object]) =:= true)},
|
{"empty object", ?_assert(encode([start_object, end_object]))},
|
||||||
{"empty array", ?_assert(encode([start_array, end_array]) =:= true)},
|
{"empty array", ?_assert(encode([start_array, end_array]) =:= true)},
|
||||||
{"nested empty objects", ?_assert(encode([start_object,
|
{"nested empty objects", ?_assert(encode([start_object,
|
||||||
{key, "empty object"},
|
{key, "empty object"},
|
||||||
|
@ -155,14 +179,14 @@ encode_test_() ->
|
||||||
end_object,
|
end_object,
|
||||||
end_object,
|
end_object,
|
||||||
end_object
|
end_object
|
||||||
]) =:= true)},
|
]))},
|
||||||
{"nested empty arrays", ?_assert(encode([start_array,
|
{"nested empty arrays", ?_assert(encode([start_array,
|
||||||
start_array,
|
start_array,
|
||||||
start_array,
|
start_array,
|
||||||
end_array,
|
end_array,
|
||||||
end_array,
|
end_array,
|
||||||
end_array
|
end_array
|
||||||
]) =:= true)},
|
]))},
|
||||||
{"simple object", ?_assert(encode([start_object,
|
{"simple object", ?_assert(encode([start_object,
|
||||||
{key, "a"},
|
{key, "a"},
|
||||||
{string, "hello"},
|
{string, "hello"},
|
||||||
|
@ -173,22 +197,22 @@ encode_test_() ->
|
||||||
{key, "d"},
|
{key, "d"},
|
||||||
{literal, true},
|
{literal, true},
|
||||||
end_object
|
end_object
|
||||||
]) =:= true)},
|
]))},
|
||||||
{"simple array", ?_assert(encode([start_array,
|
{"simple array", ?_assert(encode([start_array,
|
||||||
{string, "hello"},
|
{string, "hello"},
|
||||||
{integer, "1"},
|
{integer, "1"},
|
||||||
{float, "1.0"},
|
{float, "1.0"},
|
||||||
{literal, true},
|
{literal, true},
|
||||||
end_array
|
end_array
|
||||||
]) =:= true)},
|
]))},
|
||||||
{"unbalanced array", ?_assert(encode([start_array,
|
{"unbalanced array", ?_assertNot(encode([start_array,
|
||||||
end_array,
|
end_array,
|
||||||
end_array
|
end_array
|
||||||
]) =:= false)},
|
]))},
|
||||||
{"naked string", ?_assert(encode({string, "hello"}) =:= true)},
|
{"naked string", ?_assert(encode({string, "hello"}))},
|
||||||
{"naked literal", ?_assert(encode({literal, true}) =:= true)},
|
{"naked literal", ?_assert(encode({literal, true}))},
|
||||||
{"naked integer", ?_assert(encode({integer, "1"}) =:= true)},
|
{"naked integer", ?_assert(encode({integer, "1"}))},
|
||||||
{"naked float", ?_assert(encode({float, "1.0"}) =:= true)}
|
{"naked float", ?_assert(encode({float, "1.0"}))}
|
||||||
].
|
].
|
||||||
|
|
||||||
-endif.
|
-endif.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue