further refactoring of test suite

This commit is contained in:
alisdair sullivan 2013-10-21 05:46:53 +00:00
parent 4f08d5355f
commit 96f76b6178

View file

@ -818,28 +818,11 @@ exp(Bin, Handler, Acc, Stack, Config) ->
finish_number(Rest, Handler, Acc, [], Config=#config{stream=false}) -> finish_number(Rest, Handler, Acc, [], Config=#config{stream=false}) ->
maybe_done(Rest, handle_event(format_number(Acc), Handler, Config), [], Config); maybe_done(Rest, handle_event(format_number(Acc), Handler, Config), [], Config);
finish_number(<<?end_object, Rest/binary>>, Handler, Acc, [object|Stack], Config) ->
maybe_done(Rest, handle_event([format_number(Acc), end_object], Handler, Config), Stack, Config);
finish_number(<<?end_array, Rest/binary>>, Handler, Acc, [array|Stack], Config) ->
maybe_done(Rest, handle_event([format_number(Acc), end_array], Handler, Config), Stack, Config);
finish_number(<<?comma, Rest/binary>>, Handler, Acc, [object|Stack], Config) ->
key(Rest, handle_event(format_number(Acc), Handler, Config), [key|Stack], Config);
finish_number(<<?comma, Rest/binary>>, Handler, Acc, [array|Stack], Config) ->
value(Rest, handle_event(format_number(Acc), Handler, Config), [array|Stack], Config);
finish_number(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when ?is_whitespace(S) ->
maybe_done(Rest, handle_event(format_number(Acc), Handler, Config), Stack, Config);
finish_number(<<?solidus, Rest/binary>>, Handler, {NumType, Acc}, Stack, Config=#config{strict_comments=true}) ->
?error(NumType, <<?solidus, Rest/binary>>, Handler, Acc, Stack, Config);
finish_number(<<?solidus, ?solidus, Rest/binary>>, Handler, Acc, Stack, Config) ->
comment(Rest, handle_event(format_number(Acc), Handler, Config), maybe_done, [comment|Stack], Config);
finish_number(<<?solidus, ?star, Rest/binary>>, Handler, Acc, Stack, Config) ->
comment(Rest, handle_event(format_number(Acc), Handler, Config), maybe_done, [multicomment|Stack], Config);
finish_number(<<?solidus>>, Handler, Acc, Stack, Config) ->
incomplete(maybe_done, <<?solidus>>, handle_event(format_number(Acc), Handler, Config), Stack, Config);
finish_number(<<>>, Handler, {NumType, Acc}, Stack, Config) -> finish_number(<<>>, Handler, {NumType, Acc}, Stack, Config) ->
incomplete(NumType, <<>>, Handler, Acc, Stack, Config); incomplete(NumType, <<>>, Handler, Acc, Stack, Config);
finish_number(Bin, Handler, {NumType, Acc}, Stack, Config) -> finish_number(Rest, Handler, Acc, Stack, Config) ->
?error(NumType, Bin, Handler, Acc, Stack, Config). maybe_done(Rest, handle_event(format_number(Acc), Handler, Config), Stack, Config).
format_number({zero, Acc}) -> {integer, list_to_integer(lists:reverse(Acc))}; format_number({zero, Acc}) -> {integer, list_to_integer(lists:reverse(Acc))};
format_number({integer, Acc}) -> {integer, list_to_integer(lists:reverse(Acc))}; format_number({integer, Acc}) -> {integer, list_to_integer(lists:reverse(Acc))};
@ -1576,60 +1559,58 @@ escape_test_() ->
special_escape_test_() -> special_escape_test_() ->
[ Cases = [
{"escape forward slash", ?_assertEqual( {"escape forward slash", <<"\\/">>, <<"/"/utf8>>, [escaped_forward_slashes]},
[{string, <<"\\/">>}, end_json], {"do not escape forward slash", <<"/">>, <<"/"/utf8>>, []},
decode(<<34, "/"/utf8, 34>>, [escaped_strings, escaped_forward_slashes]) {"escape jsonp", <<"\\u2028">>, <<16#2028/utf8>>, []},
)}, {"do not escape jsonp", <<16#2028/utf8>>, <<16#2028/utf8>>, [unescaped_jsonp]}
{"do not escape forward slash", ?_assertEqual( ],
[{string, <<"/">>}, end_json], [{Title, ?_assertEqual(
decode(<<34, "/"/utf8, 34>>, [escaped_strings]) [{string, Expect}, end_json],
)}, decode(<<34, Raw/binary, 34>>, [escaped_strings] ++ Config)
{"escape jsonp", ?_assertEqual( )} || {Title, Expect, Raw, Config} <- Cases
[{string, <<"\\u2028">>}, end_json],
decode(<<34, 16#2028/utf8, 34>>, [escaped_strings])
)},
{"do not escape jsonp", ?_assertEqual(
[{string, <<16#2028/utf8>>}, end_json],
decode(<<34, 16#2028/utf8, 34>>, [escaped_strings, unescaped_jsonp])
)}
]. ].
single_quoted_string_test_() -> single_quoted_string_test_() ->
[ Cases = [
{"single quoted string", ?_assertEqual( {"single quoted string", [{string, <<"hello world">>}, end_json], <<39, "hello world", 39>>},
[{string, <<"hello world">>}, end_json], {"single quoted string with embedded double quotes",
decode(<<39, "hello world", 39>>, [])
)},
{"single quoted string error", ?_assertError(
badarg,
decode(<<39, "hello world", 39>>, [{strict, [single_quotes]}])
)},
{"single quoted string with embedded double quotes", ?_assertEqual(
[{string, <<"quoth the raven, \"nevermore\"">>}, end_json], [{string, <<"quoth the raven, \"nevermore\"">>}, end_json],
decode(<<39, "quoth the raven, \"nevermore\"", 39>>, []) <<39, "quoth the raven, \"nevermore\"", 39>>
)}, },
{"string with embedded single quotes", ?_assertEqual( {"escaped single quote",
[{string, <<"quoth the raven, 'nevermore'">>}, end_json], [{string, <<"quoth the raven, 'nevermore'">>}, end_json],
decode(<<34, "quoth the raven, 'nevermore'", 34>>, []) <<39, "quoth the raven, \\'nevermore\\'", 39>>
)}, },
{"escaped single quote", ?_assertEqual( {"single quoted key",
[{string, <<"quoth the raven, 'nevermore'">>}, end_json],
decode(<<39, "quoth the raven, \\'nevermore\\'", 39>>, [])
)},
{"single quoted key", ?_assertEqual(
[start_object, [start_object,
{key, <<"key">>}, {string, <<"value">>}, {key, <<"key">>}, {string, <<"value">>},
{key, <<"another key">>}, {string, <<"another value">>}, {key, <<"another key">>}, {string, <<"another value">>},
end_object, end_json], end_object, end_json],
decode(<<"{'key':'value','another key':'another value'}">>, []) <<"{'key':'value','another key':'another value'}">>
)}, }
{"single quoted key error", ?_assertError( ],
[{Title, ?_assertEqual(Expect, decode(Raw, []))} || {Title, Expect, Raw} <- Cases] ++
[{Title, ?_assertError(
badarg, badarg,
decode(<<"{'key':'value','another key':'another value'}">>, [{strict, [single_quotes]}]) decode(Raw, [{strict, [single_quotes]}])
)} || {Title, _Expect, Raw} <- Cases
].
embedded_single_quoted_string_test_() ->
[
{"string with embedded single quotes", ?_assertEqual(
[{string, <<"quoth the raven, 'nevermore'">>}, end_json],
decode(<<34, "quoth the raven, 'nevermore'", 34>>, [])
)},
{"string with embedded single quotes", ?_assertEqual(
[{string, <<"quoth the raven, 'nevermore'">>}, end_json],
decode(<<34, "quoth the raven, 'nevermore'", 34>>, [{strict, [single_quotes]}])
)} )}
]. ].
ignored_bad_escapes_test_() -> ignored_bad_escapes_test_() ->
@ -1672,200 +1653,41 @@ incomplete_test_() ->
error_test_() -> error_test_() ->
Decode = fun(JSON, Config) -> start(JSON, {jsx, []}, [], jsx_config:parse_config(Config)) end,
[
{"maybe_bom error", ?_assertError(
badarg,
Decode(<<16#ef, 0>>, [])
)},
{"definitely_bom error", ?_assertError(
badarg,
Decode(<<16#ef, 16#bb, 0>>, [])
)},
{"value error", ?_assertError(
badarg,
Decode(<<0>>, [])
)},
{"object error", ?_assertError(
badarg,
Decode(<<"{"/utf8, 0>>, [])
)},
{"colon error", ?_assertError(
badarg,
Decode(<<"{\"\""/utf8, 0>>, [])
)},
{"key error", ?_assertError(
badarg,
Decode(<<"{\"\":1,"/utf8, 0>>, [])
)},
{"negative error", ?_assertError(
badarg,
Decode(<<"-"/utf8, 0>>, [])
)},
{"zero error", ?_assertError(
badarg,
Decode(<<"0"/utf8, 0>>, [stream])
)},
{"integer error", ?_assertError(
badarg,
Decode(<<"1"/utf8, 0>>, [stream])
)},
{"decimal error", ?_assertError(
badarg,
Decode(<<"1.0"/utf8, 0>>, [stream])
)},
{"exp error", ?_assertError(
badarg,
Decode(<<"1.0e1"/utf8, 0>>, [stream])
)},
{"e error", ?_assertError(
badarg,
Decode(<<"1e"/utf8, 0>>, [])
)},
{"ex error", ?_assertError(
badarg,
Decode(<<"1e+"/utf8, 0>>, [])
)},
{"exp error", ?_assertError(
badarg,
Decode(<<"1.e"/utf8>>, [])
)},
{"true error", ?_assertError(
badarg,
Decode(<<"tru"/utf8, 0>>, [])
)},
{"false error", ?_assertError(
badarg,
Decode(<<"fals"/utf8, 0>>, [])
)},
{"null error", ?_assertError(
badarg,
Decode(<<"nul"/utf8, 0>>, [])
)},
{"maybe_done error", ?_assertError(
badarg,
Decode(<<"[[]"/utf8, 0>>, [])
)},
{"done error", ?_assertError(
badarg,
Decode(<<"[]"/utf8, 0>>, [])
)},
{"comment error", ?_assertError(
badarg,
Decode(<<"[ / ]">>, [])
)},
{"single_comment error", ?_assertError(
badarg,
Decode(<<"[ //"/utf8, 192>>, [])
)},
{"multi_comment error", ?_assertError(
badarg,
Decode(<<"[ /*"/utf8, 192>>, [])
)}
].
custom_error_handler_test_() ->
Decode = fun(JSON, Config) -> start(JSON, {jsx, []}, [], jsx_config:parse_config(Config)) end,
Error = fun(Rest, {_, State, _, _, _}, _) -> {State, Rest} end, Error = fun(Rest, {_, State, _, _, _}, _) -> {State, Rest} end,
[ Cases = [
{"maybe_bom error", ?_assertEqual( {"maybe_bom error", <<16#ef, 0>>, {value, <<16#ef, 0>>}},
{value, <<16#ef, 0>>}, {"definitely_bom error", <<16#ef, 16#bb, 0>>, {value, <<16#ef, 16#bb, 0>>}},
Decode(<<16#ef, 0>>, [{error_handler, Error}]) {"value error", <<0>>, {value, <<0>>}},
)}, {"object error", <<"{"/utf8, 0>>, {object, <<0>>}},
{"definitely_bom error", ?_assertEqual( {"colon error", <<"{\"\""/utf8, 0>>, {colon, <<0>>}},
{value, <<16#ef, 16#bb, 0>>}, {"key error", <<"{\"\":1,"/utf8, 0>>, {key, <<0>>}},
Decode(<<16#ef, 16#bb, 0>>, [{error_handler, Error}]) {"negative error", <<"-"/utf8, 0>>, {value, <<"-"/utf8, 0>>}},
)}, {"zero error", <<"0"/utf8, 0>>, {done, <<0>>}},
{"value error", ?_assertEqual( {"integer error", <<"1"/utf8, 0>>, {done, <<0>>}},
{value, <<0>>}, {"decimal error", <<"1.0"/utf8, 0>>, {done, <<0>>}},
Decode(<<0>>, [{error_handler, Error}]) {"exp error", <<"1.0e1"/utf8, 0>>, {done, <<0>>}},
)}, {"e error", <<"1e"/utf8, 0>>, {decimal, <<$e, 0>>}},
{"object error", ?_assertEqual( {"ex error", <<"1e+"/utf8, 0>>, {decimal, <<$e, ?positive, 0>>}},
{object, <<0>>}, {"exp error", <<"1.e"/utf8>>, {decimal, <<$e>>}},
Decode(<<"{"/utf8, 0>>, [{error_handler, Error}]) {"true error", <<"tru"/utf8, 0>>, {true, <<"ru"/utf8, 0>>}},
)}, {"false error", <<"fals"/utf8, 0>>, {false, <<"als"/utf8, 0>>}},
{"colon error", ?_assertEqual( {"null error", <<"nul"/utf8, 0>>, {null, <<"ul"/utf8, 0>>}},
{colon, <<0>>}, {"maybe_done error", <<"[[]"/utf8, 0>>, {maybe_done, <<0>>}},
Decode(<<"{\"\""/utf8, 0>>, [{error_handler, Error}]) {"done error", <<"[]"/utf8, 0>>, {done, <<0>>}}
)}, ],
{"key error", ?_assertEqual( [{Title, ?_assertError(badarg, decode(State))} || {Title, State, _} <- Cases] ++
{key, <<0>>}, [{Title ++ " (custom handler)", ?_assertEqual(
Decode(<<"{\"\":1,"/utf8, 0>>, [{error_handler, Error}]) Err,
)}, decode(State, [{error_handler, Error}])
{"negative error", ?_assertEqual( )} || {Title, State, Err} <- Cases
{value, <<"-"/utf8, 0>>},
Decode(<<"-"/utf8, 0>>, [{error_handler, Error}])
)},
{"zero error", ?_assertEqual(
{zero, <<0>>},
Decode(<<"0"/utf8, 0>>, [stream, {error_handler, Error}])
)},
{"integer error", ?_assertEqual(
{integer, <<0>>},
Decode(<<"1"/utf8, 0>>, [stream, {error_handler, Error}])
)},
{"decimal error", ?_assertEqual(
{decimal, <<0>>},
Decode(<<"1.0"/utf8, 0>>, [stream, {error_handler, Error}])
)},
{"exp error", ?_assertEqual(
{exp, <<0>>},
Decode(<<"1.0e1"/utf8, 0>>, [stream, {error_handler, Error}])
)},
{"e error", ?_assertEqual(
{decimal, <<$e, 0>>},
Decode(<<"1e"/utf8, 0>>, [{error_handler, Error}])
)},
{"ex error", ?_assertEqual(
{decimal, <<$e, ?positive, 0>>},
Decode(<<"1e+"/utf8, 0>>, [{error_handler, Error}])
)},
{"exp error", ?_assertEqual(
{decimal, <<$e>>},
Decode(<<"1.e"/utf8>>, [{error_handler, Error}])
)},
{"true error", ?_assertEqual(
{true, <<"ru"/utf8, 0>>},
Decode(<<"tru"/utf8, 0>>, [{error_handler, Error}])
)},
{"false error", ?_assertEqual(
{false, <<"als"/utf8, 0>>},
Decode(<<"fals"/utf8, 0>>, [{error_handler, Error}])
)},
{"null error", ?_assertEqual(
{null, <<"ul"/utf8, 0>>},
Decode(<<"nul"/utf8, 0>>, [{error_handler, Error}])
)},
{"maybe_done error", ?_assertEqual(
{maybe_done, <<0>>},
Decode(<<"[[]"/utf8, 0>>, [{error_handler, Error}])
)},
{"done error", ?_assertEqual(
{done, <<0>>},
Decode(<<"[]"/utf8, 0>>, [{error_handler, Error}])
)},
{"comment error", ?_assertEqual(
{value, <<"/ ]"/utf8>>},
Decode(<<"[ / ]">>, [{error_handler, Error}])
)},
{"single_comment error", ?_assertEqual(
{comment, <<192>>},
Decode(<<"[ //"/utf8, 192>>, [{error_handler, Error}, {strict, [utf8]}])
)},
{"multi_comment error", ?_assertEqual(
{comment, <<192>>},
Decode(<<"[ /*"/utf8, 192>>, [{error_handler, Error}, {strict, [utf8]}])
)}
]. ].
custom_incomplete_handler_test_() -> custom_incomplete_handler_test_() ->
Decode = fun(JSON, Config) -> start(JSON, {jsx, []}, [], jsx_config:parse_config(Config)) end,
[ [
{"custom incomplete handler", ?_assertError( {"custom incomplete handler", ?_assertError(
badarg, incomplete,
Decode(<<>>, [{incomplete_handler, fun(_, _, _) -> erlang:error(badarg) end}]) decode(<<>>, [{incomplete_handler, fun(_, _, _) -> erlang:error(incomplete) end}, stream])
)} )}
]. ].