#!/usr/bin/env python
#
# test_all.py - test suit for python-control
# RMM, 30 Mar 2011

import unittest                 # unit test module
import re                       # regular expressions
import os                       # operating system commands

def test_all(verbosity=0):
    """ Runs all tests written for python-control.
    """
    try:                      # autodiscovery (python 2.7+)
        start_dir = './'
        pattern = '*_test.py'
        top_level_dir = '../'
        testModules = \
            unittest.defaultTestLoader.discover(start_dir, pattern=pattern, \
                                                top_level_dir=top_level_dir)

        for mod in test_mods:
            print 'Running tests in', mod
            tests = unittest.defaultTestLoader.loadTestFromModule(mod)
            t = unittest.TextTestRunner()
            t.run(tests)
            print 'Completed tests in', mod

    except: 
        testModules = findTests('./tests/')

        # Now go through each module and run all of its tests.
        for mod in testModules:
            print 'Running tests in', mod
            suiteList=[]        # list of unittest.TestSuite objects
            exec('import '+mod+' as currentModule')

            try:
                currentSuite = currentModule.suite()
                if isinstance(currentSuite, unittest.TestSuite):
                    suiteList.append(currentModule.suite())
                else:
                    print mod + '.suite() doesn\'t return a TestSuite'
            except:
                print 'The test module '+mod+' doesnt have ' + \
                    'a proper suite() function'

            t=unittest.TextTestRunner(verbosity=verbosity)
            t.run(unittest.TestSuite(unittest.TestSuite(suiteList))) 
            print 'Completed tests in', mod

def findTests(testdir = './', pattern = "[^.#]*_test.py$"):
    """Since python <2.7 doesn't have test discovery, this finds tests in the 
    provided directory. The default is to check the current directory. Any files
    that match test* or Test* are considered unittest modules and checked for 
    a module.suite() function (in tests())."""

    # Get list of files in test directory
    fileList = os.listdir(testdir)

    # Go through the files and look for anything that matches the pattern
    testModules= []
    for fileName in fileList:
        if (re.match(pattern, fileName)):
            testModules.append(fileName[:-len('.py')])

    # Return all of the modules that we find
    return testModules

if __name__=='__main__':
  test_all()
