-module(json_test).

-compile(export_all).

-include_lib("eunit/include/eunit.hrl").

%% @format-begin

encode_binary_test() ->
    Binary = <<"This is an error text.">>,
    Encoded = <<"\"This is an error text.\"">>,
    ?assertMatch(Encoded, misc:json_encode(Binary)).

-ifdef(OTP_BELOW_27).
-ifdef(OTP_BELOW_26).

%% OTP 25 or lower
encode_map_test() ->
    Map = #{name => <<"room">>,
            service => <<"conference">>,
            jid => jid:encode({<<"user">>, <<"server">>, <<"">>}),
            affiliation => member},
    Encoded =
        <<"{\"service\":\"conference\",\"name\":\"room\",\"jid\":\"user@server\",\"affiliation\":\"member\"}">>,
    ?assertMatch(Encoded, misc:json_encode(Map)).

-else.

%% OTP 26
encode_map_test() ->
    Map = #{name => <<"room">>,
            service => <<"conference">>,
            jid => jid:encode({<<"user">>, <<"server">>, <<"">>}),
            affiliation => member},
    Encoded =
        <<"{\"affiliation\":\"member\",\"jid\":\"user@server\",\"service\":\"conference\",\"name\":\"room\"}">>,
    ?assertMatch(Encoded, misc:json_encode(Map)).

-endif.

-else.

%% OTP 27 or higher or higher
encode_map_test() ->
    Map = #{name => <<"room">>,
            service => <<"conference">>,
            jid => jid:encode({<<"user">>, <<"server">>, <<"">>}),
            affiliation => member},
    Encoded27 =
        <<"{\"name\":\"room\",\"service\":\"conference\",\"jid\":\"user@server\",\"affiliation\":\"member\"}">>,
    ?assertMatch(Encoded27, misc:json_encode(Map)).

-endif.

decode_test() ->
    Encoded =
        <<"{\"affiliation\":\"member\",\"jid\":\"user@server\",\"service\":\"conference\",\"name\":\"room\"}">>,
    TupleList =
        #{<<"affiliation">> => <<"member">>,
          <<"jid">> => <<"user@server">>,
          <<"name">> => <<"room">>,
          <<"service">> => <<"conference">>},
    ?assertMatch(TupleList, misc:json_decode(Encoded)).

decode_maps_test() ->
    Encoded =
        <<"{\"affiliation\":\"member\",\"jid\":\"user@server\",\"service\":\"conference\",\"name\":\"room\"}">>,
    Map = #{<<"affiliation">> => misc:atom_to_binary(member),
            <<"jid">> => jid:encode({<<"user">>, <<"server">>, <<"">>}),
            <<"name">> => <<"room">>,
            <<"service">> => <<"conference">>},
    ?assertMatch(Map, misc:json_decode(Encoded)).