Browse Source

デコードモジュールのユニットテストを作成中

Takeru Ohta 11 years ago
parent
commit
18cdae79ab
3 changed files with 75 additions and 17 deletions
  1. 2 3
      rebar.config
  2. 9 14
      src/jsone_decode.erl
  3. 64 0
      test/jsone_decode_tests.erl

+ 2 - 3
rebar.config

@@ -2,9 +2,8 @@
 {erl_opts, [
 {erl_opts, [
             warnings_as_errors,
             warnings_as_errors,
             warn_export_all,
             warn_export_all,
-            warn_untyped_record
-%,native
-%            ,bin_opt_info
+            warn_untyped_record,
+            native
            ]}. 
            ]}. 
 
 
 {xref_checks, [
 {xref_checks, [

+ 9 - 14
src/jsone_decode.erl

@@ -1,13 +1,14 @@
 -module(jsone_decode).
 -module(jsone_decode).
-
--compile(native).
-%-compile(bin_opt_info).
-
+ 
 -export([
 -export([
+         decode/1,
          decode/2
          decode/2
         ]).
         ]).
 
 
-decode(Bin, _Options) ->
+decode(Bin) ->
+    decode(Bin, []).
+
+decode(Bin, _Options) -> % TODO: delete
     whitespace(Bin, value, []).
     whitespace(Bin, value, []).
 
 
 next(<<Bin/binary>>, Value, []) ->
 next(<<Bin/binary>>, Value, []) ->
@@ -106,21 +107,15 @@ unicode_to_utf8(Code, Acc) ->
     D = 2#10000000 bor (Code band 2#111111),
     D = 2#10000000 bor (Code band 2#111111),
     [D, C, B, A | Acc].
     [D, C, B, A | Acc].
 
 
-%% number(<<Bin/binary>>, Nexts) ->
-%%     %% XXX:
-%%     number(Bin, 0, Nexts).
-
-%% number(<<C, Bin/binary>>, N, Nexts) when $0 =< C, C =< $9 ->
-%%     number(Bin, N * 10 + C - $0, Nexts);
-%% number(<<Bin/binary>>, N, Nexts) -> next(Bin, N, Nexts).
-
 number(<<$-, Bin/binary>>, Nexts) -> number_integer_part(Bin, -1, Nexts);
 number(<<$-, Bin/binary>>, Nexts) -> number_integer_part(Bin, -1, Nexts);
 number(<<Bin/binary>>,     Nexts) -> number_integer_part(Bin,  1, Nexts).
 number(<<Bin/binary>>,     Nexts) -> number_integer_part(Bin,  1, Nexts).
 
 
 number_integer_part(<<$0, Bin/binary>>, Sign, Nexts) ->
 number_integer_part(<<$0, Bin/binary>>, Sign, Nexts) ->
     number_fraction_part(Bin, Sign, 0, Nexts);
     number_fraction_part(Bin, Sign, 0, Nexts);
 number_integer_part(<<C, Bin/binary>>, Sign, Nexts) when $1 =< C, C =< $9 ->
 number_integer_part(<<C, Bin/binary>>, Sign, Nexts) when $1 =< C, C =< $9 ->
-    number_integer_part_rest(Bin, C - $0, Sign, Nexts).
+    number_integer_part_rest(Bin, C - $0, Sign, Nexts);
+number_integer_part(<<Bin/binary>>, _Sign, _Nexts) ->
+    error({invalid_json, number_integer_part, Bin}).
 
 
 number_integer_part_rest(<<C, Bin/binary>>, N, Sign, Nexts) when $0 =< C, C =< $9 ->
 number_integer_part_rest(<<C, Bin/binary>>, N, Sign, Nexts) when $0 =< C, C =< $9 ->
     number_integer_part_rest(Bin, N * 10 + C - $0, Sign, Nexts);
     number_integer_part_rest(Bin, N * 10 + C - $0, Sign, Nexts);

+ 64 - 0
test/jsone_decode_tests.erl

@@ -0,0 +1,64 @@
+%% Copyright (c) 2013, Takeru Ohta <phjgt308@gmail.com>
+-module(jsone_decode_tests).
+
+-include_lib("eunit/include/eunit.hrl").
+
+decode_test_() ->
+    [
+     {"'false'がデコード可能",
+      fun () ->
+              ?assertEqual({false, <<"">>}, jsone_decode:decode(<<"false">>))
+      end},
+     {"'true'がデコード可能",
+      fun () ->
+              ?assertEqual({true, <<"">>}, jsone_decode:decode(<<"true">>))
+      end},
+     {"'null'がデコード可能",
+      fun () ->
+              ?assertEqual({null, <<"">>}, jsone_decode:decode(<<"null">>))
+      end},
+     {"正の整数がデコード可能",
+      fun () ->
+              ?assertEqual({1, <<"">>}, jsone_decode:decode(<<"1">>))
+      end},
+     {"0がデコード可能",
+      fun () ->
+              ?assertEqual({0, <<"">>}, jsone_decode:decode(<<"0">>))
+      end},
+     {"負の整数がデコード可能",
+      fun () ->
+              ?assertEqual({-1, <<"">>}, jsone_decode:decode(<<"-1">>))
+      end},
+     {"整数の値の大きさに制限はなし",
+      fun () ->
+              ?assertEqual({111111111111111111111111111111111111111111111111111111111111111111111111111111, <<"">>},
+                           jsone_decode:decode(<<"111111111111111111111111111111111111111111111111111111111111111111111111111111">>))
+      end},
+     {"先頭に余計な0がつく場合は、先頭文字とそれ以降が別々のトークンと判断される",
+      fun () ->
+              ?assertEqual({0, <<"0">>}, jsone_decode:decode(<<"00">>)),
+              ?assertEqual({0, <<"1">>}, jsone_decode:decode(<<"01">>)),
+              ?assertEqual({0, <<"1">>}, jsone_decode:decode(<<"-01">>))
+      end},
+     {"正の整数の前の'+'記号は許可されない",
+      fun () ->
+              ?assertError({invalid_json, number_integer_part, _}, jsone_decode:decode(<<"+1">>))
+      end},
+     {"小数がデコード可能",
+      fun () ->
+              ?assertEqual({1.23, <<"">>}, jsone_decode:decode(<<"1.23">>))
+      end},
+     {"指数形式の小数がデコード可能",
+      fun () ->
+              ?assertEqual({12.345, <<"">>}, jsone_decode:decode(<<"12345e-3">>)),
+              ?assertEqual({12.345, <<"">>}, jsone_decode:decode(<<"12345E-3">>)), % 'e'は大文字でも可
+              ?assertEqual({12.345, <<"">>}, jsone_decode:decode(<<"12345.0e-3">>)),
+              ?assertEqual({12.345, <<"">>}, jsone_decode:decode(<<"0.12345e2">>)),
+              ?assertEqual({12.345, <<"">>}, jsone_decode:decode(<<"0.12345e+2">>)), % 指数部では'+'をつけても良い
+              ?assertEqual({-12.345, <<"">>}, jsone_decode:decode(<<"-0.012345e3">>))
+      end}%% ,
+     %% {"不正な形式の小数",
+     %%  fun () ->
+     %%          ?assertEqual(ok, jsone_decode:decode(<<"
+     %%  end}
+    ].