#!/usr/bin/python

import hashlib
import operator
import os
import shutil
import stat
import subprocess
import sys
import tempfile


def rel_to_abs(rel_path):
    return os.path.join(script_path, rel_path)


java_exec = 'java -Xms1024m -server -XX:+TieredCompilation'
tests_dir = 'tests'
jar_name = 'jsdoc_validator.jar'
script_path = os.path.dirname(os.path.abspath(__file__))
tests_path = rel_to_abs(tests_dir)
validator_jar_file = rel_to_abs(jar_name)
golden_file = os.path.join(tests_path, 'golden.dat')

test_files = [
    os.path.join(tests_path, f) for f in os.listdir(tests_path)
    if f.endswith('.js') and os.path.isfile(os.path.join(tests_path, f))
]

validator_command = "%s -jar %s %s" % (java_exec, validator_jar_file, " ".join(sorted(test_files)))


def run_and_communicate(command, error_template):
    proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
    (out, _) = proc.communicate()
    if proc.returncode:
        print >> sys.stderr, error_template % proc.returncode
        sys.exit(proc.returncode)
    return out


def help():
    print 'usage: %s [option]' % os.path.basename(__file__)
    print 'Options:'
    print '--generate-golden: Re-generate golden file'
    print '--dump: Dump the test results to stdout'


def main():
    need_golden = False
    need_dump = False
    if len(sys.argv) > 1:
        if sys.argv[1] == '--generate-golden':
            need_golden = True
        elif sys.argv[1] == '--dump':
            need_dump = True
        else:
            help()
            return

    result = run_and_communicate(validator_command, "Error running validator: %d")
    result = result.replace(script_path, "")  # pylint: disable=E1103
    if need_dump:
        print result
        return

    if need_golden:
        with open(golden_file, 'wt') as golden:
            golden.write(result)
    else:
        with open(golden_file, 'rt') as golden:
            golden_text = golden.read()
            if golden_text == result:
                print 'OK'
            else:
                print 'ERROR: Golden output mismatch'


if __name__ == '__main__':
    main()
