home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 April / PCWorld_2001-04_cd.bin / Software / TemaCD / webclean / !!!python!!! / BeOpen-Python-2.0.exe / TEST_PKG.PY < prev    next >
Encoding:
Python Source  |  2000-09-28  |  6.6 KB  |  260 lines

  1. # Test packages (dotted-name import)
  2.  
  3. import sys, os, string, tempfile, traceback
  4. from os import mkdir, rmdir             # Can't test if these fail
  5. del mkdir, rmdir
  6. from test_support import verbose, TestFailed
  7.  
  8. # Helpers to create and destroy hierarchies.
  9.  
  10. def mkhier(root, descr):
  11.     mkdir(root)
  12.     for name, contents in descr:
  13.         comps = string.split(name)
  14.         fullname = root
  15.         for c in comps:
  16.             fullname = os.path.join(fullname, c)
  17.         if contents is None:
  18.             mkdir(fullname)
  19.         else:
  20.             if verbose: print "write", fullname
  21.             f = open(fullname, "w")
  22.             f.write(contents)
  23.             if contents and contents[-1] != '\n':
  24.                 f.write('\n')
  25.             f.close()
  26.  
  27. def mkdir(x):
  28.     if verbose: print "mkdir", x
  29.     os.mkdir(x)
  30.  
  31. def cleanout(root):
  32.     names = os.listdir(root)
  33.     for name in names:
  34.         fullname = os.path.join(root, name)
  35.         if os.path.isdir(fullname) and not os.path.islink(fullname):
  36.             cleanout(fullname)
  37.         else:
  38.             os.remove(fullname)
  39.     rmdir(root)
  40.  
  41. def rmdir(x):
  42.     if verbose: print "rmdir", x
  43.     os.rmdir(x)
  44.  
  45. def fixdir(lst):
  46.     try:
  47.         lst.remove('__builtins__')
  48.     except ValueError:
  49.         pass
  50.     return lst
  51.  
  52. # Helper to run a test
  53.  
  54. def runtest(hier, code):
  55.     root = tempfile.mktemp()
  56.     mkhier(root, hier)
  57.     savepath = sys.path[:]
  58.     codefile = tempfile.mktemp()
  59.     f = open(codefile, "w")
  60.     f.write(code)
  61.     f.close()
  62.     try:
  63.         sys.path.insert(0, root)
  64.         if verbose: print "sys.path =", sys.path
  65.         try:
  66.             execfile(codefile, globals(), {})
  67.         except:
  68.             traceback.print_exc(file=sys.stdout)
  69.     finally:
  70.         sys.path[:] = savepath
  71.         try:
  72.             cleanout(root)
  73.         except (os.error, IOError):
  74.             pass
  75.         os.remove(codefile)
  76.  
  77. # Test descriptions
  78.  
  79. tests = [
  80.     ("t1", [("t1", None), ("t1 __init__.py", "")], "import t1"),
  81.     
  82.     ("t2", [
  83.     ("t2", None),
  84.     ("t2 __init__.py", "'doc for t2'; print __name__, 'loading'"),
  85.     ("t2 sub", None),
  86.     ("t2 sub __init__.py", ""),
  87.     ("t2 sub subsub", None),
  88.     ("t2 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
  89.     ],
  90. """
  91. import t2
  92. print t2.__doc__
  93. import t2.sub
  94. import t2.sub.subsub
  95. print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
  96. import t2
  97. from t2 import *
  98. print dir()
  99. from t2 import sub
  100. from t2.sub import subsub
  101. from t2.sub.subsub import spam
  102. print sub.__name__, subsub.__name__
  103. print sub.subsub.__name__
  104. print dir()
  105. import t2.sub
  106. import t2.sub.subsub
  107. print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
  108. from t2 import *
  109. print dir()
  110. """),
  111.     
  112.     ("t3", [
  113.     ("t3", None),
  114.     ("t3 __init__.py", "print __name__, 'loading'"),
  115.     ("t3 sub", None),
  116.     ("t3 sub __init__.py", ""),
  117.     ("t3 sub subsub", None),
  118.     ("t3 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
  119.     ],
  120. """
  121. import t3.sub.subsub
  122. print t3.__name__, t3.sub.__name__, t3.sub.subsub.__name__
  123. reload(t3)
  124. reload(t3.sub)
  125. reload(t3.sub.subsub)
  126. """),
  127.     
  128.     ("t4", [
  129.     ("t4.py", "print 'THIS SHOULD NOT BE PRINTED (t4.py)'"),
  130.     ("t4", None),
  131.     ("t4 __init__.py", "print __name__, 'loading'"),
  132.     ("t4 sub.py", "print 'THIS SHOULD NOT BE PRINTED (sub.py)'"),
  133.     ("t4 sub", None),
  134.     ("t4 sub __init__.py", ""),
  135.     ("t4 sub subsub.py", "print 'THIS SHOULD NOT BE PRINTED (subsub.py)'"),
  136.     ("t4 sub subsub", None),
  137.     ("t4 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
  138.     ],
  139. """
  140. from t4.sub.subsub import *
  141. print "t4.sub.subsub.spam =", spam
  142. """),
  143.  
  144.     ("t5", [
  145.     ("t5", None),
  146.     ("t5 __init__.py", "import t5.foo"),
  147.     ("t5 string.py", "print __name__, 'loading'; spam = 1"),
  148.     ("t5 foo.py",
  149.      "print __name__, 'loading'; import string; print string.spam"),
  150.      ],
  151. """
  152. import t5
  153. from t5 import *
  154. print dir()
  155. import t5
  156. print fixdir(dir(t5))
  157. print fixdir(dir(t5.foo))
  158. print fixdir(dir(t5.string))
  159. """),
  160.  
  161.     ("t6", [
  162.     ("t6", None),
  163.     ("t6 __init__.py", "__all__ = ['spam', 'ham', 'eggs']"),
  164.     ("t6 spam.py", "print __name__, 'loading'"),
  165.     ("t6 ham.py", "print __name__, 'loading'"),
  166.     ("t6 eggs.py", "print __name__, 'loading'"),
  167.     ],
  168. """
  169. import t6
  170. print fixdir(dir(t6))
  171. from t6 import *
  172. print fixdir(dir(t6))
  173. print dir()
  174. """),
  175.     
  176.     ("t7", [
  177.     ("t7.py", "print 'Importing t7.py'"),
  178.     ("t7", None),
  179.     ("t7 __init__.py", "print __name__, 'loading'"),
  180.     ("t7 sub.py", "print 'THIS SHOULD NOT BE PRINTED (sub.py)'"),
  181.     ("t7 sub", None),
  182.     ("t7 sub __init__.py", ""),
  183.     ("t7 sub subsub.py", "print 'THIS SHOULD NOT BE PRINTED (subsub.py)'"),
  184.     ("t7 sub subsub", None),
  185.     ("t7 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
  186.     ],
  187. """
  188. t7, sub, subsub = None, None, None
  189. import t7 as tas
  190. print dir(tas)
  191. assert not t7
  192. from t7 import sub as subpar
  193. print dir(subpar)
  194. assert not t7 and not sub
  195. from t7.sub import subsub as subsubsub
  196. print dir(subsubsub)
  197. assert not t7 and not sub and not subsub
  198. from t7.sub.subsub import spam as ham
  199. print "t7.sub.subsub.spam =", ham
  200. assert not t7 and not sub and not subsub
  201. """),
  202.  
  203. ]
  204.  
  205. nontests = [
  206.     ("x5", [], ("import a" + ".a"*400)),
  207.     ("x6", [], ("import a" + ".a"*499)),
  208.     ("x7", [], ("import a" + ".a"*500)),
  209.     ("x8", [], ("import a" + ".a"*1100)),
  210.     ("x9", [], ("import " + "a"*400)),
  211.     ("x10", [], ("import " + "a"*500)),
  212.     ("x11", [], ("import " + "a"*998)),
  213.     ("x12", [], ("import " + "a"*999)),
  214.     ("x13", [], ("import " + "a"*999)),
  215.     ("x14", [], ("import " + "a"*2000)),
  216. ]
  217.  
  218. """XXX Things to test
  219.  
  220. import package without __init__
  221. import package with __init__
  222. __init__ importing submodule
  223. __init__ importing global module
  224. __init__ defining variables
  225. submodule importing other submodule
  226. submodule importing global module
  227. submodule import submodule via global name
  228. from package import submodule
  229. from package import subpackage
  230. from package import variable (defined in __init__)
  231. from package import * (defined in __init__)
  232. """
  233.  
  234. # Run the tests
  235.  
  236. args = []
  237. if __name__ == '__main__':
  238.     args = sys.argv[1:]
  239.     if args and args[0] == '-q':
  240.         verbose = 0
  241.         del args[0]
  242.  
  243. for name, hier, code in tests:
  244.     if args and name not in args:
  245.         print "skipping test", name
  246.         continue
  247.     print "running test", name
  248.     runtest(hier, code)
  249.  
  250. # Test
  251. import sys
  252. import imp
  253. try:
  254.     import sys.imp
  255. except ImportError:
  256.     # This is what we expect
  257.     pass
  258. else:
  259.     raise TestFailed, "No ImportError exception on 'import sys.imp'"
  260.