tests/test_pyfiles.py
changeset 2963 c414c0ab69e7
child 2966 c9df63ccabdf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test_pyfiles.py	Wed Sep 03 16:05:15 2008 +0000
@@ -0,0 +1,158 @@
+#Copyright ReportLab Europe Ltd. 2000-2004
+#see license.txt for license details
+#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/test/test_pyfiles.py
+"""Tests performed on all Python source files of the ReportLab distribution.
+"""
+
+
+import os, sys, string, fnmatch, re
+
+import reportlab
+from reportlab.test import unittest
+from reportlab.test.utils import makeSuiteForClasses, SecureTestCase, GlobDirectoryWalker, outputfile, printLocation
+from reportlab.lib.utils import open_and_read, open_and_readlines
+
+RL_HOME = os.path.dirname(reportlab.__file__)
+
+
+# Helper function and class.
+
+def unique(seq):
+    "Remove elements from a list that occur more than once."
+
+    # Return input if it has less than 2 elements.
+    if len(seq) < 2:
+        return seq
+
+    # Make a sorted copy of the input sequence.
+    seq2 = seq[:]
+    if type(seq2) == type(''):
+        seq2 = map(None, seq2)
+    seq2.sort()
+
+    # Remove adjacent elements if they are identical.
+    i = 0
+    while i < len(seq2)-1:
+        elem = seq2[i]
+        try:
+            while elem == seq2[i+1]:
+                del seq2[i+1]
+        except IndexError:
+            pass
+        i = i + 1
+
+    # Try to return something of the same type as the input.
+    if type(seq) == type(''):
+        return string.join(seq2, '')
+    else:
+        return seq2
+
+class SelfTestCase(unittest.TestCase):
+    "Test unique() function."
+
+    def testUnique(self):
+        "Test unique() function."
+
+        cases = [([], []),
+                 ([0], [0]),
+                 ([0, 1, 2], [0, 1, 2]),
+                 ([2, 1, 0], [0, 1, 2]),
+                 ([0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 2, 3]),
+                 ('abcabcabc', 'abc')
+                 ]
+
+        msg = "Failed: unique(%s) returns %s instead of %s."
+        for sequence, expectedOutput in cases:
+            output = unique(sequence)
+            args = (sequence, output, expectedOutput)
+            assert output == expectedOutput, msg % args
+
+
+class AsciiFileTestCase(unittest.TestCase):
+    "Test if Python files are pure ASCII ones."
+
+    def testAscii(self):
+        "Test if Python files are pure ASCII ones."
+
+        RL_HOME = os.path.dirname(reportlab.__file__)
+        allPyFiles = GlobDirectoryWalker(RL_HOME, '*.py')
+
+        for path in allPyFiles:
+            fileContent = open_and_read(path,'r')
+            nonAscii = filter(lambda c: ord(c)>127, fileContent)
+            nonAscii = unique(nonAscii)
+
+            truncPath = path[string.find(path, 'reportlab'):]
+            args = (truncPath, repr(map(ord, nonAscii)))
+            msg = "File %s contains characters: %s." % args
+##            if nonAscii:
+##                print msg
+            assert nonAscii == '', msg
+
+
+class FilenameTestCase(unittest.TestCase):
+    "Test if Python files contain trailing digits."
+
+    def testTrailingDigits(self):
+        "Test if Python files contain trailing digits."
+
+        allPyFiles = GlobDirectoryWalker(RL_HOME, '*.py')
+
+        for path in allPyFiles:
+            #hack - exclude barcode extensions from this test
+            if string.find(path, 'barcode'):
+                pass
+            else:
+                basename = os.path.splitext(path)[0]
+                truncPath = path[string.find(path, 'reportlab'):]
+                msg = "Filename %s contains trailing digits." % truncPath
+                assert basename[-1] not in string.digits, msg
+
+    ##            if basename[-1] in string.digits:
+    ##                print truncPath
+
+
+class FirstLineTestCase(SecureTestCase):
+    "Testing if objects in the ReportLab package have docstrings."
+
+    def findSuspiciousModules(self, folder, rootName):
+        "Get all modul paths with non-Unix-like first line."
+
+        firstLinePat = re.compile('^#!.*python.*')
+
+        paths = []
+        for file in GlobDirectoryWalker(folder, '*.py'):
+            if os.path.basename(file) == '__init__.py':
+                continue
+            firstLine = open_and_readlines(file)[0]
+            if not firstLinePat.match(firstLine):
+                paths.append(file)
+
+        return paths
+
+    def test1(self):
+        "Test if all Python files have a Unix-like first line."
+
+        path = outputfile("test_firstline.log")
+        file = open(path, 'w')
+        file.write('No Unix-like first line found in the files below.\n\n')
+
+        paths = self.findSuspiciousModules(RL_HOME, 'reportlab')
+        paths.sort()
+
+        for p in paths:
+            file.write("%s\n" % p)
+
+        file.close()
+
+def makeSuite():
+    suite = makeSuiteForClasses(SelfTestCase, AsciiFileTestCase, FilenameTestCase)
+    if sys.platform[:4] != 'java':
+        loader = unittest.TestLoader()
+        suite.addTest(loader.loadTestsFromTestCase(FirstLineTestCase))
+    return suite
+
+#noruntests
+if __name__ == "__main__":
+    unittest.TextTestRunner().run(makeSuite())
+    printLocation()