incremental test, fixed revealed bug in incomlete implementation
This commit is contained in:
parent
7e88a14525
commit
9e8361e10a
2 changed files with 23 additions and 16 deletions
|
@ -85,13 +85,13 @@
|
||||||
-ifndef(incomplete).
|
-ifndef(incomplete).
|
||||||
-define(incomplete(State, Rest, T, Stack, Opts),
|
-define(incomplete(State, Rest, T, Stack, Opts),
|
||||||
{ok, lists:reverse(T), fun(Stream) when is_binary(Stream) ->
|
{ok, lists:reverse(T), fun(Stream) when is_binary(Stream) ->
|
||||||
State(<<Stream/binary, Rest/binary>>, [], Stack, Opts)
|
State(<<Rest/binary, Stream/binary>>, [], Stack, Opts)
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
).
|
).
|
||||||
-define(incomplete(State, Rest, T, Stack, Opts, Acc),
|
-define(incomplete(State, Rest, T, Stack, Opts, Acc),
|
||||||
{ok, T, fun(Stream) when is_binary(Stream) ->
|
{ok, lists:reverse(T), fun(Stream) when is_binary(Stream) ->
|
||||||
State(<<Stream/binary, Rest/binary>>, [], Stack, Opts, Acc)
|
State(<<Rest/binary, Stream/binary>>, [], Stack, Opts, Acc)
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
).
|
).
|
||||||
|
@ -244,6 +244,7 @@ partial_utf(<<X, Rest/binary>>) when X >= 16#f0, X =< 16#f4 ->
|
||||||
end;
|
end;
|
||||||
partial_utf(_) -> false.
|
partial_utf(_) -> false.
|
||||||
|
|
||||||
|
|
||||||
string(<<?quote, Rest/binary>>, T, [key|_] = Stack, Opts, Acc) ->
|
string(<<?quote, Rest/binary>>, T, [key|_] = Stack, Opts, Acc) ->
|
||||||
?event([{key, lists:reverse(Acc)}], colon, Rest, T, Stack, Opts);
|
?event([{key, lists:reverse(Acc)}], colon, Rest, T, Stack, Opts);
|
||||||
string(<<?quote, Rest/binary>>, T, Stack, Opts, Acc) ->
|
string(<<?quote, Rest/binary>>, T, Stack, Opts, Acc) ->
|
||||||
|
|
32
src/jsx.erl
32
src/jsx.erl
|
@ -82,7 +82,12 @@ jsx_decoder_gen([Test|Rest]) ->
|
||||||
JSX = proplists:get_value(jsx, Test),
|
JSX = proplists:get_value(jsx, Test),
|
||||||
Flags = proplists:get_value(jsx_flags, Test, []),
|
Flags = proplists:get_value(jsx_flags, Test, []),
|
||||||
{generator, fun() ->
|
{generator, fun() ->
|
||||||
[{Name, ?_assertEqual(decode(JSON, Flags), JSX)} | jsx_decoder_gen(Rest)]
|
[{Name, ?_assertEqual(decode(JSON, Flags), JSX)},
|
||||||
|
{Name ++ " (incremental)",
|
||||||
|
?_assertEqual(incremental_decode(JSON, Flags), JSX)
|
||||||
|
}
|
||||||
|
| jsx_decoder_gen(Rest)
|
||||||
|
]
|
||||||
end}.
|
end}.
|
||||||
|
|
||||||
|
|
||||||
|
@ -133,19 +138,20 @@ decode(JSON, Flags) ->
|
||||||
|
|
||||||
|
|
||||||
incremental_decode(<<C:1/binary, Rest/binary>>, Flags) ->
|
incremental_decode(<<C:1/binary, Rest/binary>>, Flags) ->
|
||||||
P = jsx:scanner([iterate] ++ Flags),
|
P = jsx:scanner(Flags),
|
||||||
incremental_decode_loop(P(C), Rest, []).
|
try incremental_decode_loop(P(C), Rest, [])
|
||||||
|
catch error:badarg -> io:format("~p~n", [erlang:get_stacktrace()]), {error, badjson}
|
||||||
|
end.
|
||||||
|
|
||||||
incremental_decode_loop({jsx, incomplete, Next}, <<>>, Acc) ->
|
incremental_decode_loop({ok, X, More}, <<>>, Acc) ->
|
||||||
incremental_decode_loop(Next(end_stream), <<>>, Acc);
|
{ok, Y, _} = More(<<" ">>), %% clear any naked numbers
|
||||||
incremental_decode_loop({jsx, incomplete, Next}, <<C:1/binary, Rest/binary>>, Acc) ->
|
V = Acc ++ X ++ Y,
|
||||||
incremental_decode_loop(Next(C), Rest, Acc);
|
case lists:reverse(V) of
|
||||||
incremental_decode_loop({jsx, end_json, _Next}, _Rest, Acc) ->
|
[end_json|_] -> V
|
||||||
lists:reverse([end_json] ++ Acc);
|
; _ -> {error, badjson}
|
||||||
incremental_decode_loop({jsx, Event, Next}, Rest, Acc) ->
|
end;
|
||||||
incremental_decode_loop(Next(), Rest, [Event] ++ Acc);
|
incremental_decode_loop({ok, T, More}, <<C:1/binary, Rest/binary>>, Acc) ->
|
||||||
incremental_decode_loop({error, {badjson, _Error}}, _Rest, _Acc) ->
|
incremental_decode_loop(More(C), Rest, Acc ++ T).
|
||||||
{error, badjson}.
|
|
||||||
|
|
||||||
|
|
||||||
-endif.
|
-endif.
|
Loading…
Add table
Add a link
Reference in a new issue