add incomplete_handler and tests

This commit is contained in:
alisdair sullivan 2013-03-04 23:13:23 -08:00
parent ca89432e7a
commit 2d7b690a91
4 changed files with 86 additions and 38 deletions

View file

@ -9,5 +9,6 @@
ignored_bad_escapes = false,
explicit_end = false,
pre_encode = false,
error_handler = false
error_handler = false,
incomplete_handler = false
}).

View file

@ -105,21 +105,9 @@ decoder(Handler, State, Config) ->
-ifndef(incomplete).
-define(incomplete(State, Rest, Handler, Stack, Config),
{incomplete, fun(Stream) when is_binary(Stream) ->
State(<<Rest/binary, Stream/binary>>, Handler, Stack, Config)
; (end_stream) ->
case State(<<Rest/binary, <<" ">>/binary>>,
Handler,
Stack,
Config#config{explicit_end=false}) of
{incomplete, _} -> ?error(State, Rest, Handler, Stack, Config)
; Events -> Events
end
end
}
).
-define(incomplete(State, Rest, Handler, Acc, Stack, Config),
case Config#config.incomplete_handler of
false ->
{incomplete, fun(Stream) when is_binary(Stream) ->
State(<<Rest/binary, Stream/binary>>, Handler, Acc, Stack, Config)
; (end_stream) ->
@ -132,7 +120,27 @@ decoder(Handler, State, Config) ->
; Events -> Events
end
end
}
};
F -> F(Rest, {decoder, State, Handler, Acc, Stack}, Config)
end
).
-define(incomplete(State, Rest, Handler, Stack, Config),
case Config#config.incomplete_handler of
false ->
{incomplete, fun(Stream) when is_binary(Stream) ->
State(<<Rest/binary, Stream/binary>>, Handler, Stack, Config)
; (end_stream) ->
case State(<<Rest/binary, <<" ">>/binary>>,
Handler,
Stack,
Config#config{explicit_end=false}) of
{incomplete, _} -> ?error(State, Rest, Handler, Stack, Config)
; Events -> Events
end
end
};
F -> F(Rest, {decoder, State, Handler, null, Stack}, Config)
end
).
-endif.
@ -2041,5 +2049,15 @@ custom_error_handler_test_() ->
].
custom_incomplete_handler_test_() ->
Decode = fun(JSON, Config) -> start(JSON, {jsx, []}, [], jsx_utils:parse_config(Config)) end,
[
{"custom incomplete handler", ?_assertError(
badarg,
Decode(<<>>, [{incomplete_handler, fun(_, _, _) -> erlang:error(badarg) end}])
)}
].
-endif.

View file

@ -49,6 +49,8 @@ parser(Handler, State, Config) ->
-ifndef(incomplete).
-define(incomplete(State, Handler, Stack, Config),
case Config#config.incomplete_handler of
false ->
{incomplete, fun(end_stream) ->
case State([end_json],
Handler,
@ -60,7 +62,9 @@ parser(Handler, State, Config) ->
; (Tokens) ->
State(Tokens, Handler, Stack, Config)
end
}
};
F -> F([], {parser, State, Handler, Stack}, Config)
end
).
-endif.
@ -236,4 +240,13 @@ custom_error_handler_test_() ->
].
custom_incomplete_handler_test_() ->
[
{"custom incomplete handler", ?_assertError(
badarg,
parse([], [{incomplete_handler, fun(_, _, _) -> erlang:error(badarg) end}])
)}
].
-endif.

View file

@ -76,6 +76,11 @@ parse_config([{error_handler, ErrorHandler}|Rest] = Options, Config) when is_fun
false -> parse_config(Rest, Config#config{error_handler=ErrorHandler})
; _ -> erlang:error(badarg, [Options, Config])
end;
parse_config([{incomplete_handler, IncompleteHandler}|Rest] = Options, Config) when is_function(IncompleteHandler, 3) ->
case Config#config.incomplete_handler of
false -> parse_config(Rest, Config#config{incomplete_handler=IncompleteHandler})
; _ -> erlang:error(badarg, [Options, Config])
end;
%% deprecated flags
parse_config([{pre_encoder, Encoder}|Rest] = Options, Config) when is_function(Encoder, 1) ->
case Config#config.pre_encode of
@ -631,6 +636,17 @@ config_test_() ->
{error_handler, fun(_) -> false end}
])
)},
{"incomplete_handler flag", ?_assertEqual(
#config{incomplete_handler=fun ?MODULE:fake_error_handler/3},
parse_config([{incomplete_handler, fun ?MODULE:fake_error_handler/3}])
)},
{"two incomplete_handlers defined", ?_assertError(
badarg,
parse_config([
{incomplete_handler, fun(_) -> true end},
{incomplete_handler, fun(_) -> false end}
])
)},
{"bad option flag", ?_assertError(badarg, parse_config([error]))}
].