added first (primitive) tests, fixed a few bugs in decoder
This commit is contained in:
parent
baf8561780
commit
1753512b10
2 changed files with 56 additions and 0 deletions
|
@ -242,6 +242,8 @@ zero(<<S/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S
|
||||||
maybe_done(Rest, Stack, callback({number, lists:reverse(Acc)}, Callbacks), Opts);
|
maybe_done(Rest, Stack, callback({number, lists:reverse(Acc)}, Callbacks), Opts);
|
||||||
zero(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts.comments == true ->
|
zero(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts.comments == true ->
|
||||||
maybe_comment(Rest, fun(Resume) -> zero(Resume, Stack, Callbacks, Opts, Acc) end);
|
maybe_comment(Rest, fun(Resume) -> zero(Resume, Stack, Callbacks, Opts, Acc) end);
|
||||||
|
zero(<<>>, [], Callbacks, _Opts, Acc) ->
|
||||||
|
callback(eof, callback({number, lists:reverse(Acc)}, Callbacks));
|
||||||
zero(<<>>, Stack, Callbacks, Opts, Acc) ->
|
zero(<<>>, Stack, Callbacks, Opts, Acc) ->
|
||||||
fun(Stream) -> zero(Stream, Stack, Callbacks, Opts, Acc) end.
|
fun(Stream) -> zero(Stream, Stack, Callbacks, Opts, Acc) end.
|
||||||
|
|
||||||
|
@ -268,6 +270,8 @@ integer(<<S/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when ?is_whitespac
|
||||||
maybe_done(Rest, Stack, callback({number, lists:reverse(Acc)}, Callbacks), Opts);
|
maybe_done(Rest, Stack, callback({number, lists:reverse(Acc)}, Callbacks), Opts);
|
||||||
integer(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts.comments == true ->
|
integer(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts.comments == true ->
|
||||||
maybe_comment(Rest, fun(Resume) -> integer(Resume, Stack, Callbacks, Opts, Acc) end);
|
maybe_comment(Rest, fun(Resume) -> integer(Resume, Stack, Callbacks, Opts, Acc) end);
|
||||||
|
integer(<<>>, [], Callbacks, _Opts, Acc) ->
|
||||||
|
callback(eof, callback({number, lists:reverse(Acc)}, Callbacks));
|
||||||
integer(<<>>, Stack, Callbacks, Opts, Acc) ->
|
integer(<<>>, Stack, Callbacks, Opts, Acc) ->
|
||||||
fun(Stream) -> integer(Stream, Stack, Callbacks, Opts, Acc) end.
|
fun(Stream) -> integer(Stream, Stack, Callbacks, Opts, Acc) end.
|
||||||
|
|
||||||
|
@ -292,6 +296,8 @@ fraction(<<S/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when ?is_whitespa
|
||||||
maybe_done(Rest, Stack, callback({number, lists:reverse(Acc)}, Callbacks), Opts);
|
maybe_done(Rest, Stack, callback({number, lists:reverse(Acc)}, Callbacks), Opts);
|
||||||
fraction(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts.comments == true ->
|
fraction(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts.comments == true ->
|
||||||
maybe_comment(Rest, fun(Resume) -> fraction(Resume, Stack, Callbacks, Opts, Acc) end);
|
maybe_comment(Rest, fun(Resume) -> fraction(Resume, Stack, Callbacks, Opts, Acc) end);
|
||||||
|
fraction(<<>>, [], Callbacks, _Opts, Acc) ->
|
||||||
|
callback(eof, callback({number, lists:reverse(Acc)}, Callbacks));
|
||||||
fraction(<<>>, Stack, Callbacks, Opts, Acc) ->
|
fraction(<<>>, Stack, Callbacks, Opts, Acc) ->
|
||||||
fun(Stream) -> fraction(Stream, Stack, Callbacks, Opts, Acc) end.
|
fun(Stream) -> fraction(Stream, Stack, Callbacks, Opts, Acc) end.
|
||||||
|
|
||||||
|
@ -326,6 +332,8 @@ exp(<<S/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S)
|
||||||
maybe_done(Rest, Stack, callback({number, lists:reverse(Acc)}, Callbacks), Opts);
|
maybe_done(Rest, Stack, callback({number, lists:reverse(Acc)}, Callbacks), Opts);
|
||||||
exp(<<?rsolidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts.comments == true ->
|
exp(<<?rsolidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts.comments == true ->
|
||||||
maybe_comment(Rest, fun(Resume) -> exp(Resume, Stack, Callbacks, Opts, Acc) end);
|
maybe_comment(Rest, fun(Resume) -> exp(Resume, Stack, Callbacks, Opts, Acc) end);
|
||||||
|
exp(<<>>, [], Callbacks, _Opts, Acc) ->
|
||||||
|
callback(eof, callback({number, lists:reverse(Acc)}, Callbacks));
|
||||||
exp(<<>>, Stack, Callbacks, Opts, Acc) ->
|
exp(<<>>, Stack, Callbacks, Opts, Acc) ->
|
||||||
fun(Stream) -> exp(Stream, Stack, Callbacks, Opts, Acc) end.
|
fun(Stream) -> exp(Stream, Stack, Callbacks, Opts, Acc) end.
|
||||||
|
|
||||||
|
|
48
test/jsx_test.erl
Normal file
48
test/jsx_test.erl
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
-module(jsx_test).
|
||||||
|
|
||||||
|
-export([test/0]).
|
||||||
|
|
||||||
|
-define(assert(A, B),
|
||||||
|
case A == B of true -> ok ; false -> erlang:error(failed_assert, ?LINE) end
|
||||||
|
).
|
||||||
|
|
||||||
|
test() ->
|
||||||
|
Strict = jsx:decoder(),
|
||||||
|
Comments = jsx:decoder([{comments, true}]),
|
||||||
|
Naked = jsx:decoder([{naked_values, true}]),
|
||||||
|
NakedComments = jsx:decoder([{comments, true}, {naked_values, true}]),
|
||||||
|
|
||||||
|
%% empty objects and arrays
|
||||||
|
?assert([start_array, end_array], Strict(<<"[]">>)),
|
||||||
|
?assert([start_object, end_object], Strict(<<"{}">>)),
|
||||||
|
|
||||||
|
%% really deep array
|
||||||
|
?assert([start_array, start_array, start_array, start_array, start_array, start_array, start_array, start_array, start_array, start_array, end_array, end_array, end_array, end_array, end_array, end_array, end_array, end_array, end_array, end_array], Strict(<<"[[[[[[[[[[]]]]]]]]]]">>)),
|
||||||
|
|
||||||
|
%% naked values
|
||||||
|
?assert([{literal, true}], Naked(<<"true">>)),
|
||||||
|
?assert([{literal, false}], Naked(<<"false">>)),
|
||||||
|
?assert([{literal, null}], Naked(<<"null">>)),
|
||||||
|
?assert([{string, "blah blah blah"}], Naked(<<"\"blah blah blah\"">>)),
|
||||||
|
?assert([{number, "1"}], Naked(<<"1">>)),
|
||||||
|
?assert([{number, "0.51323412"}], Naked(<<"0.51323412">>)),
|
||||||
|
?assert([{number, "-1.1"}], Naked(<<"-1.1">>)),
|
||||||
|
|
||||||
|
%% comments
|
||||||
|
?assert([start_array, end_array], Comments(<<"[ /* this is ignored */ ]">>)),
|
||||||
|
?assert([start_object, end_object], Comments(<<"{ /* this too */ }">>)),
|
||||||
|
|
||||||
|
%% strings and unicode
|
||||||
|
?assert([start_array, {string, "a test string"}, end_array], Strict(<<"[ \"a test string\" ]">>)),
|
||||||
|
?assert([start_array, {string, "a high unicode value: " ++ [100000]}, end_array], Strict(<<"[ \"a high unicode value: ", 100000/utf8, "\" ]">>)),
|
||||||
|
?assert([start_object, {key, "key"}, {string, "value"}, end_object], Strict(<<"{ \"key\": \"value\" }">>)),
|
||||||
|
|
||||||
|
%% numbers
|
||||||
|
?assert([start_array, {number, "1"}, end_array], Strict(<<"[ 1 ]">>)),
|
||||||
|
?assert([start_array, {number, "0"}, end_array], Strict(<<"[ 0 ]">>)),
|
||||||
|
?assert([start_array, {number, "1e1"}, end_array], Strict(<<"[ 1e1 ]">>)),
|
||||||
|
?assert([start_array, {number, "-1.0e5123"}, end_array], Strict(<<"[ -1.0e5123 ]">>)),
|
||||||
|
?assert([start_array, {number, "324523452345256234455"}, end_array], Strict(<<"[ 324523452345256234455 ]">>)),
|
||||||
|
|
||||||
|
ok.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue