from buildutils import *
import subprocess

Import('env','build','install')
localenv = env.Clone()

localenv.Append(CPPPATH=['#ext/gtest/include', '#include'],
                LIBPATH='#build/lib',
                LIBS=['gtest'] + localenv['cantera_libs'])

localenv['ENV']['PYTHONPATH'] = Dir('#interfaces/python').abspath
localenv['ENV']['CANTERA_DATA'] = Dir('#data/inputs').abspath

# Needed for Intel runtime libraries when compiling with ICC
if 'LD_LIBRARY_PATH' in os.environ:
    localenv['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']

def testRunner(target, source, env):
    """SCons Action to run a compiled test program"""
    program = source[0]
    code = subprocess.call([program.abspath], env=env['ENV'])
    if not code:
        open(target[0].path, 'w').write(time.asctime()+'\n')
    return code


def scriptRunner(target, source, env):
    """Scons Action to run a test script using the specified interpreter"""
    interpreter = env['test_interpreter']
    workDir = Dir('#test/work').abspath
    if not os.path.isdir(workDir):
        os.mkdir(workDir)
    code = subprocess.call([interpreter, source[0].abspath],
                           env=env['ENV'],
                           cwd=workDir)
    if not code:
        open(target[0].path, 'w').write(time.asctime()+'\n')
    return code


def addTestProgram(subdir, progName):
    """
    Compile a test program and create a targets for running
    and resetting the test.
    """
    program = localenv.Program(pjoin(subdir, progName),
                               pjoin(subdir, '%s.cpp' % progName))
    passedFile = File(pjoin(str(program[0].dir), '%s.passed' % program[0].name))
    run_program = localenv.Command(passedFile, program, testRunner)
    Alias('newtest', run_program)
    if os.path.exists(passedFile.abspath):
        Alias('newtest-reset', localenv.Command('reset-%s%s' % (subdir, progName),
                                                [], [Delete(passedFile.abspath)]))


def addTestScript(subdir, script, interpreter, dependencies):
    """
    Create targets for running and resetting a test script.
    """
    testenv = localenv.Clone()
    testenv['test_interpreter'] = interpreter
    passedFile = File(pjoin(subdir, '%s.passed' % (script)))
    run_program = testenv.Command(passedFile, pjoin(subdir, script), scriptRunner)
    for dep in dependencies:
        testenv.Depends(run_program, File(pjoin(subdir, dep)))
    Alias('newtest', run_program)
    if os.path.exists(passedFile.abspath):
        Alias('newtest-reset', testenv.Command('reset-%s%s' % (subdir, script),
                                               [], [Delete(passedFile.abspath)]))

# Instantiate tests
addTestProgram('thermo', 'nasapoly')
addTestScript('python', 'runTests.py',
              interpreter=sys.executable,
              dependencies=['testSolution.py'])
