mailRe: r2854 - /branches/test_suite/test_suite/unit_tests/unit_test_runner.py


Others Months | Index by Date | Thread Index
>>   [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Header


Content

Posted by Edward d'Auvergne on November 19, 2006 - 07:27:
This code is starting to shape up.  There are a few important points
about 'unit_test_runner.py' though.  The unit test runner will
eventually be executed by relax once I write the framework for
integrating the unit and system tests.  You have defined the function
'getStartupPath' to use 'sys.path[0]' but relax redefines the order of
this list.  Therefore this function will need to be changed later on.

The docstrings for many functions are beginning to become unparsable.
As relax uses multiple automatic docstring parsers (for the API docs,
the relax user manual, the internal Python help system, etc.), this
issue is very important.  Apart from the fact that in Python, the
first line of the docstring should be capitalised (with no space
between the quotes and the word) and there should be a full stop at
the end, there should be nothing on the second line.  This blank
second line is assumed by many parsers.  Please have a close read of
the 'Coding conventions' section of the development chapter of the
relax manual (http://download.gna.org/relax/manual/relax.pdf or
http://www.nmr-relax.com/manual/node149.html).

Thanks,

Edward


On 11/17/06, garyt@xxxxxxxxxxxxxxx <garyt@xxxxxxxxxxxxxxx> wrote:
Author: varioustoxins
Date: Fri Nov 17 11:24:33 2006
New Revision: 2854

URL: http://svn.gna.org/viewcvs/relax?rev=2854&view=rev
Log:
WORK IN PROGRESS: updates to use correct search paths and work when
starting from any unit test directory

note some documentation maybe inaccurate or incomplete

Modified:
    branches/test_suite/test_suite/unit_tests/unit_test_runner.py

Modified: branches/test_suite/test_suite/unit_tests/unit_test_runner.py
URL: 
http://svn.gna.org/viewcvs/relax/branches/test_suite/test_suite/unit_tests/unit_test_runner.py?rev=2854&r1=2853&r2=2854&view=diff
==============================================================================
--- branches/test_suite/test_suite/unit_tests/unit_test_runner.py (original)
+++ branches/test_suite/test_suite/unit_tests/unit_test_runner.py Fri Nov 17 
11:24:33 2006
@@ -4,7 +4,7 @@
 def getStartupPath():
   startupPath = sys.path[0]
   if startupPath == '':
-      startupPath = sys.getcwd()
+      startupPath = os.getcwd()
   return startupPath

 def getModuleRelativePath(modulePath,rootPaths=None):
@@ -58,15 +58,33 @@
 def segmentPath(path,normalise=True):
     if normalise:
         path = os.path.normpath(path)
+
     result  =  []
     (head,tail) = os.path.split(path)
-
-    while head != '' and tail != '':
-        result.append(tail)
-        head,tail = os.path.split(head)
-    result.reverse()
+    if head =='' or tail == '':
+        result.append(head+tail)
+    else:
+        while head != '' and tail != '':
+            result.append(tail)
+            head,tail = os.path.split(head)
+        result.append(head+tail)
+        result.reverse()
     return result

+def joinPathSegments(segments):
+
+    if len(segments) == 0:
+        result = ''
+    else:
+        segmentsCopy = segments[:]
+
+        segmentsCopy.reverse()
+
+        result = segmentsCopy.pop()
+        while len(segmentsCopy) > 0:
+            result = os.path.join(result,segmentsCopy.pop())
+
+    return result

 class TestFinder:
     pattern = re.compile('test_.*\.py$')
@@ -129,8 +147,8 @@

     def __init__(self, rootPath=None, testModule=None,
                  testPattern = ['test_(\.*).py'],
-                 rootSystemDirectory = 'test_suite/..',
-                 rootUnitTestDirectory = 'unit_tests'):
+                 rootSystemDirectory = ['test_suite/unit_tests','../..'],
+                 rootUnitTestDirectory = ['test_suite/unit_tests','.']):
         ''' initialise the unit test runner

           @type  rootPath: a string containing a directory name
@@ -139,7 +157,8 @@

           @type  testModule: string
           @param testModule: the name of a module to unit test. If the 
variable
-                 is None it will default to the current working directorys
+                 is None it will be interpreted as
+                 the current working directory
                  contents. Otherwise it will be used as a module path from 
the
                  current working directory.

@@ -151,55 +170,71 @@
                  testCases e.g in the case of test_float.py the combination
                  would be test_float.Test_float.

-          @type  rootSystemDirectory: a string containing a directory name
+          @type  rootSystemDirectory: a list containing a directory name 
folowed by a
+                 relative path
           @param rootSystemDirectory: the directory from which the 
distribution
                  is rooted. This is viewed as the the 'PYTHONPATH'
                  of the classes to be tested. It must be unique and defined
                  relative to the test suite. For the current setup
-                 in relax this is 'test_suite/..'.
-
-          @type  rootUnitTestDirectory: a string containing a directory name
+                 in relax this is (\'test_suite\',/'..\'). The first string 
is a
+                 directory to match the secon string is a relative path from 
that
+                 directory to the system directory
+
+          @type  rootUnitTestDirectory: a list containing a directory name 
folowed by a
+                 relative path
           @param rootUnitTestDirectory: the directory from which all unit
                  module directories descend. For the current setup in relax
-                 this is 'unit_tests'.
+                 this is (\'unit_tests\',\'.\').
         '''

         self.testModule = testModule
         if self.testModule == None:
-            self.testModule = sys.getcwd()
-
+            self.testModule = os.getcwd()
+        print 'test mod',self.testModule
+        self.rootPath = rootPath
+        if self.rootPath == None:
+            self.rootPath =  os.getcwd()
         self.testPattern = testPattern
         self.rootSystemDirectory = rootSystemDirectory
         self.rootUnitTestDirectory = rootUnitTestDirectory

     # should this be get last...
-    def getFirstInstancePath(self,path,targetDirectory):
+
+    def getFirstInstancePath(self,path,targetDirectory,offsetPath='.'):
         ''' get the minimal path searching down the file system to
             targetDirectory Note the algorithm understands .. and .

             @type path:  a directory path in a string
-            @param path: a directory path so search down
+            @param path: a directory path to search down

             @type  targetDirectory: a directory  name in a string
             @param targetDirectory: a directory to find in the path

         '''
-        segPath = segmentPath(os.path.abspath(path))
-        foundPath = None
-        stack = []
-        for seg in segPath():
-            if seg == '..':
-                stack.pop()
-            elif seg == '.':
-                continue
-            else:
-                stack.push(seg)
-
-            if stack[-1] == targetDirectory:
-                foundPath = os.path.join(segPath[:i+1])
-                break
-
-        return foundPath
+        result = None
+        segPath = segmentPath(path)
+        segTargetDirectory = segmentPath(targetDirectory)
+        segTargetDirectoryLen = len(segTargetDirectory)
+        #print segTargetDirectoryLen
+        while len(segPath) > 0:
+           #print '\t segTargetDirectory[:-segTargetDirectoryLen] ', 
segTargetDirectory[-segTargetDirectoryLen:]
+           #print segPath
+           #print 
'segPath[:-segTargetDirectoryLen]',segPath[-segTargetDirectoryLen:]
+           #print
+           if segPath[-segTargetDirectoryLen:] ==  
segTargetDirectory[-segTargetDirectoryLen:]:
+               break
+           else:
+               segPath.pop()
+
+
+        if len(segPath) != 0:
+            segOffsetPath = segmentPath(offsetPath)
+            segPath.extend(segOffsetPath)
+            print 'pre join', os.path.join(segPath),segPath
+            result = os.path.normpath(joinPathSegments(segPath))
+
+        #print 'result', result
+        return result

     def findUnitTestDirectoryPath(self,path):
         ''' find the path to the unit_test directory starting from path and
@@ -209,8 +244,10 @@
              @param path: a path to a point to start searching to the system
                     directory from.
         '''
-
-        return getFirstInstancePath(path,self.rootUnitTestDirectory)
+        print 'find unit test path'
+        searchPath = self.rootUnitTestDirectory[0]
+        offsetPath  = self.rootUnitTestDirectory[1]
+        return self.getFirstInstancePath(path,searchPath,offsetPath)


def findSystemDirectoryPath(self,path): @@ -221,12 +258,22 @@ @param path: a path to a point to start searching to the system directory from. ''' - return getFirstInstancePath(path,self.rootSystemDirectory) - - - - def pathFromTestModule(self,rootPath): - ''' determine the path of the self.testModule starting from rootPath + searchPath = self.rootSystemDirectory[0] + offsetPath = self.rootSystemDirectory[1] + + return self.getFirstInstancePath(path,searchPath,offsetPath) + + + + def pathsFromTestModule(self,rootPath): + ''' determine the possible path of the self.testModule starting from + the current directory or the rootPath + + The possible paths are as follows + 1. a file or directory relative to the rootPath (usually pwd) + 2. the rootPath itself (self.testModule == None) + 3. a file or directory relative to the unitTestRootPath + 4. the unit test directory itself (self.testModule == None)

            currently this assumes that if the last two names in testModule 
are
            the same barring an initial  capital letter in the class name
@@ -240,46 +287,60 @@
            @param rootPath: directory to start looking for the module from
         '''

-        unitTestDirectory  = findUnitTestDirectoryPath(rootPath)
-        testModuleSegs = split(self.testModule,'.')
-
-
-        result = None
-        if len(testModuleSegs) >= 2:
-            putativeClassName =  testModuleSegs[-1]
-            classFromModuleName = string.lower(putativeClassName[0])+ 
putativeClassName[:1]
-            putativeModuleName = testModuleSegs[-2]
-
-
-
-
-
-            if classFromModuleName == putativeModuleName:
-                copyTestModuleSegs =  copy(testModuleSegs)
-                copyTestModuleSegs.pop()
-                classFileName = copyTestModuleSegs.pop()
-                classFileName = classFileName + '.py'
-                testPath = 
os.path.join(unitTestDirectory,copyTestModuleSegs, classFileName)
-
-
-                if os.path.isfile(testPath):
-                    result = testPath
-
-         if result == None:
-             result  = os.path.join(unitTestDirectory,testModuleSegs)
-
-         return result
-
-
-
-
-    def runTests(self):
+        unitTestDirectory  = self.findUnitTestDirectoryPath(rootPath)
+        print rootPath,'unit',unitTestDirectory
+        searchPaths  = (unitTestDirectory,rootPath)
+        result = []
+        if self.testModule != None:
+            result.extend(searchPaths)
+
+        else:
+            testModuleSegs = string.split(self.testModule,'.')
+            print 'root path', rootPath
+            print 'test segs', testModuleSegs
+
+            testModuleNames = []
+            if len(testModuleSegs) >= 2:
+                putativeClassName =  testModuleSegs[-1]
+                classFromModuleName = string.lower(putativeClassName[0])+ 
putativeClassName[:1]
+                putativeModuleName = testModuleSegs[-2]
+
+                if classFromModuleName == putativeModuleName:
+                    copyTestModuleSegs =  copy(testModuleSegs)
+                    classFile = copyTestModuleSegs.pop()
+                    classFile =  classFile + '.py'
+                    copyTesModuleSegs.append(classFile)
+                    testModuleNames.append(copyTesModuleSegs)
+
+            testModuleNames.append(testModuleSegs)
+            for testModule in testModuleNames:
+                for searchPath in searchPaths:
+                    result.append(os.path.join(searchPath,testModule))
+
+        return result
+
+
+
+
+    def run(self):
+        print self.rootPath
         systemDirectory = self.findSystemDirectoryPath(self.rootPath)
         unitTestDirectory = self.findUnitTestDirectoryPath(self.rootPath)
-        modulePath = self.pathFromTestModule(self,self.rootPath)
-
+        modulePath = self.pathsFromTestModule(self.rootPath)
+        print 'system directory', systemDirectory
+        print 'unit test directory', unitTestDirectory
+        print 'module paths',modulePath
         # add UnitTestDirectory to python path
+        print 'sys path',sys.path
+        backupPythonPath = sys.path[:]
+        sys.path.insert(1,unitTestDirectory)
+        sys.path.insert(1,systemDirectory)
+
+
         #iterate and load unit tests from module path
+        finder = TestFinder('test_float')
+        finder.scanPaths(unitTestDirectory)
+        finder.run()
         # add SystemDirectory to python path
         # iterate and load files to be tested

@@ -293,7 +354,6 @@
     print getCommonPrefix(('A','B','C','F'),('A','B','C','D'))
     print getCommonPrefix((),('A','B','C','D'))
     print ('A','B','C') == ('A','B','C')
-    finder = TestFinder()
-    finder.scanPaths()
-    finder.run()
+    runner =  run_unit_tests()
+    runner.run()
 # todo normcase home


_______________________________________________ relax (http://nmr-relax.com)

This is the relax-commits mailing list
relax-commits@xxxxxxx

To unsubscribe from this list, get a password
reminder, or change your subscription options,
visit the list information page at
https://mail.gna.org/listinfo/relax-commits




Related Messages


Powered by MHonArc, Updated Mon Nov 20 05:00:36 2006