#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "zutil.h"

int main(void) {
    unsigned char plain[32];
    unsigned char compressed[130];
    PREFIX3(stream) strm;
    z_size_t bound;
    z_uintmax_t bytes;

    for (int i = 0; i <= 32; i++) {
        memset(plain, 6, i);
        memset(&strm, 0, sizeof(strm));
        PREFIX(deflateInit2)(&strm, 0, 8, 31, 1, Z_DEFAULT_STRATEGY);
        bound = PREFIX(deflateBound)(&strm, i);
        strm.next_in = plain;
        strm.next_out = compressed;
        strm.avail_in = i;
        strm.avail_out = sizeof(compressed);
        if (PREFIX(deflate)(&strm, Z_FINISH) != Z_STREAM_END) return -1;
        if (strm.avail_in != 0) return -1;
        printf("bytes = %2i, deflateBound = %2zi, total_out = %2zi\n", i, (size_t)bound, (size_t)strm.total_out);
        if (bound < strm.total_out) return -1;
        if (PREFIX(deflateEnd)(&strm) != Z_OK) return -1;
    }
    for (int i = 0; i <= 32; i++) {
        bytes = sizeof(compressed);
        for (int j = 0; j < i; j++) {
            plain[j] = j;
        }
        bound = PREFIX(compressBound)(i);
        if (PREFIX(compress2)(compressed, &bytes, plain, i, 1) != Z_OK) return -1;
        printf("bytes = %2i, compressBound = %2zi, total_out = %2zi\n", i, (size_t)bound, (size_t)bytes);
        if (bytes > bound) return -1;
    }
    return 0;
}
