test for streaming eep0018 parser

This commit is contained in:
alisdair sullivan 2011-02-28 12:44:21 -08:00
parent 7e8e5a9a48
commit 91f503fc07
2 changed files with 26 additions and 8 deletions

View file

@ -79,8 +79,12 @@ extract_parser_opts(Opts) ->
collect_strict({event, Start, Next}, Acc, Opts) collect_strict({event, Start, Next}, Acc, Opts)
when Start =:= start_object; Start =:= start_array -> when Start =:= start_object; Start =:= start_array ->
collect(Next(), [[]|Acc], Opts); collect(Next(), [[]|Acc], Opts);
collect_strict(_, _, _) -> collect_strict({incomplete, More}, Acc, Opts) ->
erlang:error(badarg). case proplists:get_value(stream, Opts, false) of
true -> {incomplete, fun(JSON) -> collect(More(JSON), Acc, Opts) end}
; false -> erlang:error(badarg)
end;
collect_strict(_, _, _) -> erlang:error(badarg).
%% collect decoder events and convert to eep0018 format %% collect decoder events and convert to eep0018 format
@ -123,19 +127,23 @@ collect({event, Event, Next}, [Current|Rest], Opts) when is_list(Current) ->
collect(Next(), [[event(Event, Opts)] ++ Current] ++ Rest, Opts); collect(Next(), [[event(Event, Opts)] ++ Current] ++ Rest, Opts);
collect({event, Event, Next}, [Key, Current|Rest], Opts) -> collect({event, Event, Next}, [Key, Current|Rest], Opts) ->
collect(Next(), [[{Key, event(Event, Opts)}] ++ Current] ++ Rest, Opts); collect(Next(), [[{Key, event(Event, Opts)}] ++ Current] ++ Rest, Opts);
%% if our first returned event is {incomplete, ...} try to force end and return %% if our returned event is {incomplete, ...} try to force end and return
%% the Event if one is returned %% the Event if one is returned
collect({incomplete, More}, [[]], Opts) -> collect({incomplete, More}, Acc, Opts) ->
case More(end_stream) of case More(end_stream) of
{event, Event, _Next} -> event(Event, Opts) {event, Event, _Next} -> event(Event, Opts)
; _ -> ; _ ->
io:format("hi"),
case proplists:get_value(stream, Opts, false) of case proplists:get_value(stream, Opts, false) of
true -> {incomplete, More} true ->
; false -> erlang:error(badarg) {incomplete,
fun(JSON) -> collect(More(JSON), Acc, Opts) end
}
; false -> erlang:error(badarg), io:format("hello!")
end end
end; end;
%% any other event is an error %% any other event is an error
collect(_, _, _) -> erlang:error(badarg). collect(_, _, _) -> io:format(":("), erlang:error(badarg).
%% helper functions for converting jsx events to eep0018 formats %% helper functions for converting jsx events to eep0018 formats
@ -452,5 +460,15 @@ escape_test_() ->
) )
} }
]. ].
stream_test_() ->
[
{"streaming mode",
?_assert(begin
{incomplete, F} = json_to_term(<<"{">>, [{stream, true}]),
F(<<"}">>)
end =:= [{}])
}
].
-endif. -endif.