#!/usr/bin/env python
from __future__ import print_function
import sys
import os
from subprocess import check_call, Popen, PIPE

from test_utils import PYTHON, BRO, TEST_ENV, diff_q


INPUTS = """\
testdata/alice29.txt
testdata/asyoulik.txt
testdata/lcet10.txt
testdata/plrabn12.txt
../enc/encode.c
../common/dictionary.h
../dec/decode.c
%s
""" % BRO

os.chdir(os.path.abspath("../../tests"))
for filename in INPUTS.splitlines():
    for quality in (1, 6, 9, 11):
        for lgwin in (10, 15, 20, 24):
            filename = os.path.abspath(filename)
            print('Roundtrip testing file "%s" at quality %d with lg(win)=%d and auto-custom-dictionary' %
                  (os.path.basename(filename), quality, lgwin))
            compressed = os.path.splitext(filename)[0] + ".custom_bro"
            uncompressed = os.path.splitext(filename)[0] + ".custom_unbro"
            check_call([PYTHON, BRO, "-f", "-q", str(quality), "-i", filename,
                        "-o", compressed, "--lgwin", str(lgwin),
                        "--custom-dictionary", filename], env=TEST_ENV)
            check_call([PYTHON, BRO, "-f", "-d", "-i", compressed, "-o",
                        uncompressed, "--custom-dictionary", filename], env=TEST_ENV)
            if diff_q(filename, uncompressed) != 0:
                sys.exit(1)
            try:
                os.unlink(compressed)
                os.unlink(uncompressed)
            except OSError:
                pass
