# Test packages (dotted-name import)

import sys, os, tempfile, traceback
from os import mkdir, rmdir             # Can't test if these fail
del mkdir, rmdir
from test_support import verify, verbose, TestFailed

# Helpers to create and destroy hierarchies.

def mkhier(root, descr):
    mkdir(root)
    for name, contents in descr:
        comps = name.split()
        fullname = root
        for c in comps:
            fullname = os.path.join(fullname, c)
        if contents is None:
            mkdir(fullname)
        else:
            if verbose: print "write", fullname
            f = open(fullname, "w")
            f.write(contents)
            if contents and contents[-1] != '\n':
                f.write('\n')
            f.close()

def mkdir(x):
    if verbose: print "mkdir", x
    os.mkdir(x)

def cleanout(root):
    names = os.listdir(root)
    for name in names:
        fullname = os.path.join(root, name)
        if os.path.isdir(fullname) and not os.path.islink(fullname):
            cleanout(fullname)
        else:
            os.remove(fullname)
    rmdir(root)

def rmdir(x):
    if verbose: print "rmdir", x
    os.rmdir(x)

def fixdir(lst):
    try:
        lst.remove('__builtins__')
    except ValueError:
        pass
    return lst

# Helper to run a test

def runtest(hier, code):
    root = tempfile.mktemp()
    mkhier(root, hier)
    savepath = sys.path[:]
    codefile = tempfile.mktemp()
    f = open(codefile, "w")
    f.write(code)
    f.close()
    try:
        sys.path.insert(0, root)
        if verbose: print "sys.path =", sys.path
        try:
            execfile(codefile, globals(), {})
        except:
            traceback.print_exc(file=sys.stdout)
    finally:
        sys.path[:] = savepath
        try:
            cleanout(root)
        except (os.error, IOError):
            pass
        os.remove(codefile)

# Test descriptions

tests = [
    ("t1", [("t1", None), ("t1 __init__.py", "")], "import t1"),

    ("t2", [
    ("t2", None),
    ("t2 __init__.py", "'doc for t2'; print __name__, 'loading'"),
    ("t2 sub", None),
    ("t2 sub __init__.py", ""),
    ("t2 sub subsub", None),
    ("t2 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
    ],
"""
import t2
print t2.__doc__
import t2.sub
import t2.sub.subsub
print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
import t2
from t2 import *
print dir()
from t2 import sub
from t2.sub import subsub
from t2.sub.subsub import spam
print sub.__name__, subsub.__name__
print sub.subsub.__name__
print dir()
import t2.sub
import t2.sub.subsub
print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
from t2 import *
print dir()
"""),

    ("t3", [
    ("t3", None),
    ("t3 __init__.py", "print __name__, 'loading'"),
    ("t3 sub", None),
    ("t3 sub __init__.py", ""),
    ("t3 sub subsub", None),
    ("t3 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
    ],
"""
import t3.sub.subsub
print t3.__name__, t3.sub.__name__, t3.sub.subsub.__name__
reload(t3)
reload(t3.sub)
reload(t3.sub.subsub)
"""),

    ("t4", [
    ("t4.py", "print 'THIS SHOULD NOT BE PRINTED (t4.py)'"),
    ("t4", None),
    ("t4 __init__.py", "print __name__, 'loading'"),
    ("t4 sub.py", "print 'THIS SHOULD NOT BE PRINTED (sub.py)'"),
    ("t4 sub", None),
    ("t4 sub __init__.py", ""),
    ("t4 sub subsub.py", "print 'THIS SHOULD NOT BE PRINTED (subsub.py)'"),
    ("t4 sub subsub", None),
    ("t4 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
    ],
"""
from t4.sub.subsub import *
print "t4.sub.subsub.spam =", spam
"""),

    ("t5", [
    ("t5", None),
    ("t5 __init__.py", "import t5.foo"),
    ("t5 string.py", "print __name__, 'loading'; spam = 1"),
    ("t5 foo.py",
     "print __name__, 'loading'; import string; print string.spam"),
     ],
"""
import t5
from t5 import *
print dir()
import t5
print fixdir(dir(t5))
print fixdir(dir(t5.foo))
print fixdir(dir(t5.string))
"""),

    ("t6", [
    ("t6", None),
    ("t6 __init__.py", "__all__ = ['spam', 'ham', 'eggs']"),
    ("t6 spam.py", "print __name__, 'loading'"),
    ("t6 ham.py", "print __name__, 'loading'"),
    ("t6 eggs.py", "print __name__, 'loading'"),
    ],
"""
import t6
print fixdir(dir(t6))
from t6 import *
print fixdir(dir(t6))
print dir()
"""),

    ("t7", [
    ("t7.py", "print 'Importing t7.py'"),
    ("t7", None),
    ("t7 __init__.py", "print __name__, 'loading'"),
    ("t7 sub.py", "print 'THIS SHOULD NOT BE PRINTED (sub.py)'"),
    ("t7 sub", None),
    ("t7 sub __init__.py", ""),
    ("t7 sub subsub.py", "print 'THIS SHOULD NOT BE PRINTED (subsub.py)'"),
    ("t7 sub subsub", None),
    ("t7 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
    ],
"""
t7, sub, subsub = None, None, None
import t7 as tas
print fixdir(dir(tas))
verify(not t7)
from t7 import sub as subpar
print fixdir(dir(subpar))
verify(not t7 and not sub)
from t7.sub import subsub as subsubsub
print fixdir(dir(subsubsub))
verify(not t7 and not sub and not subsub)
from t7.sub.subsub import spam as ham
print "t7.sub.subsub.spam =", ham
verify(not t7 and not sub and not subsub)
"""),

]

nontests = [
    ("x5", [], ("import a" + ".a"*400)),
    ("x6", [], ("import a" + ".a"*499)),
    ("x7", [], ("import a" + ".a"*500)),
    ("x8", [], ("import a" + ".a"*1100)),
    ("x9", [], ("import " + "a"*400)),
    ("x10", [], ("import " + "a"*500)),
    ("x11", [], ("import " + "a"*998)),
    ("x12", [], ("import " + "a"*999)),
    ("x13", [], ("import " + "a"*999)),
    ("x14", [], ("import " + "a"*2000)),
]

"""XXX Things to test

import package without __init__
import package with __init__
__init__ importing submodule
__init__ importing global module
__init__ defining variables
submodule importing other submodule
submodule importing global module
submodule import submodule via global name
from package import submodule
from package import subpackage
from package import variable (defined in __init__)
from package import * (defined in __init__)
"""

# Run the tests

args = []
if __name__ == '__main__':
    args = sys.argv[1:]
    if args and args[0] == '-q':
        verbose = 0
        del args[0]

for name, hier, code in tests:
    if args and name not in args:
        print "skipping test", name
        continue
    print "running test", name
    runtest(hier, code)

# Test
import sys
import imp
try:
    import sys.imp
except ImportError:
    # This is what we expect
    pass
else:
    raise TestFailed, "No ImportError exception on 'import sys.imp'"
