% This file is part of Jiffy released under the MIT license. % See the LICENSE file for more information. -module(jiffy_03_number_tests). -include_lib("eunit/include/eunit.hrl"). -include("jiffy_util.hrl"). number_success_test_() -> [gen(ok, Case) || Case <- cases(ok)]. number_failure_test_() -> [gen(error, Case) || Case <- cases(error)]. number_double_test_() -> [gen(floats, Case) || Case <- cases(floats)]. gen(ok, {J, E}) -> gen(ok, {J, E, J}); gen(ok, {J1, E, J2}) -> {msg("~s", [J1]), [ {"Decode", ?_assertEqual(E, dec(J1))}, {"Encode", ?_assertEqual(J2, enc(E))} ]}; gen(error, J) -> {msg("Error: ~s", [J]), [ ?_assertError(_, dec(J)) ]}; gen(floats, F) -> NegF = -1.0 * F, {msg("float round trip - ~p", [F]), [ {"Pos", ?_assert(F == dec(enc(F)))}, {"Neg", ?_assert(NegF == dec(enc(NegF)))} ]}. cases(ok) -> [ {<<"0">>, 0}, {<<"-0">>, 0, <<"0">>}, {<<"-0.0">>, -0.0, <<"0.0">>}, {<<"1">>, 1}, {<<"12">>, 12}, {<<"-3">>, -3}, {<<"{\"key\":9223372036854775808}">>,{[{<<"key">>,1 bsl 63}]}}, {<<"1234567890123456789012345">>, 1234567890123456789012345}, {<<"1310050760199">>, 1310050760199}, { <<"1234567890123456789012345.0">>, 1.23456789012345678e24, <<"1.2345678901234568e24">> }, { <<"1234567890123456789012345.0E3">>, 1.2345678901234569e27, <<"1.2345678901234569e27">> }, { <<"1234567890123456789012345012">>, 1234567890123456789012345012, <<"1234567890123456789012345012">> }, {<<"1.0">>, 1.0}, { <<"0.000000000000000000000000000000000001">>, 1.0E-36, <<"1.0e-36">> }, % There is an internal num_buffer used for loading values in before % passing them to strtod and strtol so we're testing around that 32 % size limit % 30 ones { <<"111111111111111111111111111111">>, 111111111111111111111111111111, <<"111111111111111111111111111111">> }, % 31 ones { <<"1111111111111111111111111111111">>, 1111111111111111111111111111111, <<"1111111111111111111111111111111">> }, % 32 ones { <<"11111111111111111111111111111111">>, 11111111111111111111111111111111, <<"11111111111111111111111111111111">> }, % 33 ones { <<"111111111111111111111111111111111">>, 111111111111111111111111111111111, <<"111111111111111111111111111111111">> }, % 34 ones { <<"1111111111111111111111111111111111">>, 1111111111111111111111111111111111, <<"1111111111111111111111111111111111">> }, % 30 frac digits { <<"1.00000000000000000000000000E10">>, 1.0e10, <<"1.0e10">> }, % 31 frac digits { <<"1.00000000000000000000000000E10">>, 1.0e10, <<"1.0e10">> }, % 32 frac digits { <<"1.000000000000000000000000000E10">>, 1.0e10, <<"1.0e10">> }, % 33 frac digits { <<"1.0000000000000000000000000000E10">>, 1.0e10, <<"1.0e10">> }, % 34 frac digits { <<"1.00000000000000000000000000000E10">>, 1.0e10, <<"1.0e10">> }, {<<"0.75">>, 0.75}, {<<"2.0123456789">>, 2.0123456789, <<"2.0123456789">>}, {<<"2.4234324E24">>, 2.4234324E24, <<"2.4234324e24">>}, {<<"-3.1416">>, -3.1416, <<"-3.1416">>}, {<<"1E4">>, 10000.0, <<"1.0e4">>}, {<<"1.0E+01">>, 10.0, <<"10.0">>}, {<<"1e1">>, 10.0, <<"10.0">>}, {<<"3.0E2">>, 300.0, <<"300.0">>}, {<<"0E3">>, 0.0, <<"0.0">>}, {<<"1.5E3">>, 1500.0, <<"1.5e3">>}, {<<"2.5E-1">>, 0.25, <<"0.25">>}, {<<"-0.325E+2">>, -32.5, <<"-32.5">>}, %% Large integers to exercise digits10 (11-12+ digit path) {<<"10000000000">>, 10000000000}, {<<"100000000000">>, 100000000000}, {<<"-10000000000">>, -10000000000}, %% Number parsing edge cases {<<"-0.0E1">>, -0.0, <<"0.0">>}, {<<"1E-1">>, 1.0e-1, <<"0.1">>}, {<<"1e0">>, 1.0, <<"1.0">>}, {<<"1e01">>, 10.0, <<"10.0">>}, {<<"1e00001">>, 10.0, <<"10.0">>}, {<<"1E001">>, 10.0, <<"10.0">>} ]; cases(error) -> [ <<"02">>, <<"-01">>, <<"+12">>, <<"-">>, <<"1.">>, <<".1">>, <<"1.-1">>, <<"1E">>, <<"1-E2">>, <<"2E +3">>, <<"2e+">>, <<"2e-">>, <<"3E+">>, <<"3E-">>, <<"0.1e-">>, <<"0.1e+">>, <<"0.1E-">>, <<"0.1E+">>, <<"1e-e">>, <<"1e+e">>, <<"1E3000">>, <<"0.1E30000">>, <<"1EA">> ]; cases(floats) -> [ 0.0, -0.0, 0.00000001, 0.000000012, 0.0000000123, 0.0000001, 0.00000012, 0.000000123, 0.000001, 0.00001, 0.01, 0.0123, 0.1, 0.3, 1.0, 1.0e20, 1.0e21, 9.0, 10.0, 90.0, 90.12, 10000.0, 12345.0, 12345.0e23, 100000.0, 100000000000000000000.0, 111111111111111111111.0, 1111111111111111111111.0, 11111111111111111111111.0 ].