diff --git a/src/bson_binary.erl b/src/bson_binary.erl index 49e3719..16c7971 100644 --- a/src/bson_binary.erl +++ b/src/bson_binary.erl @@ -71,6 +71,8 @@ put_field(N, {javascript, {}, Code}) -> < <>; put_field(N, {mongostamp, Inc, Time}) -> <>; put_field(N, UnixTime = {_, _, _}) -> <>; +put_field(N, '+infinity') -> <>; +put_field(N, '-infinity') -> <>; put_field(N, V) when is_float(V) -> <>; put_field(N, V) when is_binary(V) -> <>; put_field(N, V) when is_tuple(V) -> <>; @@ -84,8 +86,11 @@ put_field(N, V) -> erlang:error(bad_bson, [N, V]). %% @private get_field(<<1:8, _/binary>>, _, Bin1, _) -> - <> = Bin1, - {N, Bin2}; + case Bin1 of + <<0, 0, 0, 0, 0, 0, 240, 127, Bin2/binary>> -> {'+infinity', Bin2}; + <<0, 0, 0, 0, 0, 0, 240, 255, Bin2/binary>> -> {'-infinity', Bin2}; + <> -> {N, Bin2} + end; get_field(<<2:8, _/binary>>, _, Bin1, _) -> get_string(Bin1); get_field(<<3:8, _/binary>>, _, Bin1, map) -> diff --git a/test/bson_tests.erl b/test/bson_tests.erl index 5fbc64b..893e425 100644 --- a/test/bson_tests.erl +++ b/test/bson_tests.erl @@ -145,4 +145,19 @@ maps_flattering_test() -> <<"personal.country.domen">> => <<"su">>, <<"email">> => <<"test@test.su">> }, - ?assertEqual(FlattenMap, Result). \ No newline at end of file + ?assertEqual(FlattenMap, Result). + +infinity_test() -> + Encoded = <<16#2b, 16#00, 16#00, 16#00, 16#01, 16#2b, 16#69, 16#6e, 16#66, + 16#69, 16#6e, 16#69, 16#74, 16#79, 16#00, 16#00, 16#00, 16#00, + 16#00, 16#00, 16#00, 16#f0, 16#7f, 16#01, 16#2d, 16#69, 16#6e, + 16#66, 16#69, 16#6e, 16#69, 16#74, 16#79, 16#00, 16#00, 16#00, + 16#00, 16#00, 16#00, 16#00, 16#f0, 16#ff, 16#00>>, + + ?assertEqual( + {{<<"+infinity">>, '+infinity', <<"-infinity">>, '-infinity'}, <<>>}, + bson_binary:get_document(Encoded)), + + Doc = #{<<"+infinity">> => '+infinity', <<"-infinity">> => '-infinity'}, + Encoded2 = bson_binary:put_document(Doc), + ?assertEqual(Encoded, Encoded2).