"""Run all python demos."""

__author__ = "Ilmar Wilbers (ilmarw@simula.no)"
__date__ = "2008-04-08 -- 2008-04-09"
__copyright__ = "Copyright (C) 2008 Ilmar Wilbers"
__license__  = "GNU LGPL Version 2.1"

# Modified by Anders Logg 2008

import sys, os, re
from commands import getstatusoutput

# Demos to run
pydemos = []
for dpath, dnames, fnames in os.walk(os.path.join(os.curdir)):
    if os.path.basename(dpath) == 'python':
        if os.path.isfile(os.path.join(dpath, 'demo.py')):
            pydemos.append(dpath)
    
# Set non-interactive
os.putenv('DOLFIN_NOPLOT', '1')

print "Running all demos (non-interactively)"
print ""
print "Found %d Python demos" % len(pydemos)
print ""

# Remove demos that are known not to work (FIXME's)
pydemos.remove('./nls/nonlinearpoisson/python')
pydemos.remove('./pde/nonlinear-poisson/python')
pydemos.remove('./pde/lift-drag/python')
pydemos.remove('./ode/aliev-panfilov/python')

# Demos that need command line arguments are treated seperately
pydemos.remove('./quadrature/python')

failed = []

# Run Python demos
for demo in pydemos:
    print "----------------------------------------------------------------------"
    print "Running Python demo %s" % demo
    print ""
    if os.path.isfile(os.path.join(demo, 'demo.py')):
        output = getstatusoutput("cd %s && python ./demo.py" % demo)
        success = not output[0]
        if success:
            print "OK"
        else:
            print "*** Failed"
            failed += [(demo, "Python", output[1])]
    else:
        print "*** Warning: missing demo"

# Print output for failed tests
print ""
if len(failed) > 0:
    print "%d demo(s) failed, see python_demo.log for details." % len(failed)
    file = open("python_demo.log", "w")
    for (test, interface, output) in failed:
        file.write("----------------------------------------------------------------------\n")
        file.write("%s (%s)\n" % (test, interface))
        file.write("\n")
        file.write(output)
        file.write("\n")
        file.write("\n")
else:
    print "All demos checked: OK"

# Return error code if tests failed
sys.exit(len(failed) != 0)
