% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
%   http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.

-module(couch_compress_tests).

-include_lib("couch/include/couch_eunit.hrl").
-include_lib("couch/include/couch_db.hrl").

-define(TERM, {[{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5}]}).
-define(NONE, <<131,104,1,108,0,0,0,5,104,2,100,0,1,97,97,1,
    104,2,100,0,1,98,97,2,104,2,100,0,1,99,97,3,104,2,100,0,
    1,100,97,4,104,2,100,0,1,101,97,5,106>>).
-define(DEFLATE, <<131,80,0,0,0,48,120,218,203,96,204,97,96,
    96,96,205,96,74,97,96,76,76,100,4,211,73,137,76,96,58,57,
    145,25,76,167,36,178,128,233,212,68,214,44,0,212,169,9,51>>).
-define(SNAPPY, <<1,49,64,131,104,1,108,0,0,0,5,104,2,100,0,
    1,97,97,1,104,1,8,8,98,97,2,5,8,8,99,97,3,5,8,44,100,97,
    4,104,2,100,0,1,101,97,5,106>>).
-define(CORRUPT, <<2,12,85,06>>).


compress_test_() ->
    [
        ?_assertEqual(?NONE, couch_compress:compress(?TERM, none)),
        ?_assertEqual(?DEFLATE, couch_compress:compress(?TERM, {deflate, 9})),
        ?_assertEqual(?SNAPPY, couch_compress:compress(?TERM, snappy))
    ].

decompress_test_() ->
    [
        ?_assertEqual(?TERM, couch_compress:decompress(?NONE)),
        ?_assertEqual(?TERM, couch_compress:decompress(?DEFLATE)),
        ?_assertEqual(?TERM, couch_compress:decompress(?SNAPPY)),
        ?_assertError(invalid_compression, couch_compress:decompress(?CORRUPT))
    ].

recompress_test_() ->
    [
        ?_assertEqual(?DEFLATE, couch_compress:compress(?NONE, {deflate, 9})),
        ?_assertEqual(?SNAPPY, couch_compress:compress(?NONE, snappy)),
        ?_assertEqual(?NONE, couch_compress:compress(?DEFLATE, none)),
        ?_assertEqual(?SNAPPY, couch_compress:compress(?DEFLATE, snappy)),
        ?_assertEqual(?NONE, couch_compress:compress(?SNAPPY, none)),
        ?_assertEqual(?DEFLATE, couch_compress:compress(?SNAPPY, {deflate, 9}))
    ].

is_compressed_test_() ->
    [
        ?_assert(couch_compress:is_compressed(?NONE, none)),
        ?_assert(couch_compress:is_compressed(?DEFLATE, {deflate, 9})),
        ?_assert(couch_compress:is_compressed(?SNAPPY, snappy)),
        ?_assertNot(couch_compress:is_compressed(?NONE, {deflate, 0})),
        ?_assertNot(couch_compress:is_compressed(?NONE, {deflate, 9})),
        ?_assertNot(couch_compress:is_compressed(?NONE, snappy)),
        ?_assertNot(couch_compress:is_compressed(?DEFLATE, none)),
        ?_assertNot(couch_compress:is_compressed(?DEFLATE, snappy)),
        ?_assertNot(couch_compress:is_compressed(?SNAPPY, none)),
        ?_assertNot(couch_compress:is_compressed(?SNAPPY, {deflate, 9})),
        ?_assertError(invalid_compression,
            couch_compress:is_compressed(?CORRUPT, none)),
        ?_assertError(invalid_compression,
            couch_compress:is_compressed(?CORRUPT, {deflate, 9})),
        ?_assertError(invalid_compression,
            couch_compress:is_compressed(?CORRUPT, snappy))
    ].
