467 lines
14 KiB
Python
467 lines
14 KiB
Python
from __future__ import generators
|
|
import py
|
|
from setupdata import setupdatadir
|
|
from py.__.test.outcome import Skipped, Failed, Passed, Outcome
|
|
|
|
def setup_module(mod):
|
|
mod.datadir = setupdatadir()
|
|
mod.tmpdir = py.test.ensuretemp('test_collect')
|
|
|
|
def skipboxed():
|
|
if py.test.config.option.boxed:
|
|
py.test.skip("test does not work with boxed tests")
|
|
|
|
def test_failing_import_execfile():
|
|
dest = datadir / 'failingimport.py'
|
|
col = py.test.collect.Module(dest)
|
|
py.test.raises(ImportError, col.run)
|
|
py.test.raises(ImportError, col.run)
|
|
|
|
def test_collect_listnames_and_back():
|
|
col1 = py.test.collect.Directory(datadir.dirpath())
|
|
col2 = col1.join(datadir.basename)
|
|
col3 = col2.join('filetest.py')
|
|
l = col3.listnames()
|
|
assert len(l) == 3
|
|
x = col1._getitembynames(l[1:])
|
|
assert x.name == "filetest.py"
|
|
x = col1._getitembynames("/".join(l[1:]))
|
|
assert x.name == "filetest.py"
|
|
l2 = x.listnames()
|
|
assert len(l2) == 3
|
|
|
|
def test_finds_tests():
|
|
fn = datadir / 'filetest.py'
|
|
col = py.test.collect.Module(fn)
|
|
l = col.run()
|
|
assert len(l) == 2
|
|
assert l[0] == 'test_one'
|
|
assert l[1] == 'TestClass'
|
|
|
|
def test_found_certain_testfiles():
|
|
tmp = py.test.ensuretemp("found_certain_testfiles")
|
|
tmp.ensure('test_found.py')
|
|
tmp.ensure('found_test.py')
|
|
|
|
colitem = py.test.collect.Directory(tmp)
|
|
items = list(colitem._tryiter(py.test.collect.Module))
|
|
assert len(items) == 2
|
|
items = [item.name for item in items]
|
|
assert 'test_found.py' in items
|
|
assert 'found_test.py' in items
|
|
|
|
def test_ignored_certain_directories():
|
|
tmp = py.test.ensuretemp("ignore_certain_directories")
|
|
tmp.ensure("_darcs", 'test_notfound.py')
|
|
tmp.ensure("CVS", 'test_notfound.py')
|
|
tmp.ensure("{arch}", 'test_notfound.py')
|
|
tmp.ensure(".whatever", 'test_notfound.py')
|
|
tmp.ensure(".bzr", 'test_notfound.py')
|
|
tmp.ensure("normal", 'test_found.py')
|
|
tmp.ensure('test_found.py')
|
|
|
|
colitem = py.test.collect.Directory(tmp)
|
|
items = list(colitem._tryiter(py.test.collect.Module))
|
|
assert len(items) == 2
|
|
for item in items:
|
|
assert item.name == 'test_found.py'
|
|
|
|
def test_failing_import_directory():
|
|
class MyDirectory(py.test.collect.Directory):
|
|
def filefilter(self, p):
|
|
return p.check(fnmatch='testspecial*.py')
|
|
mydir = MyDirectory(datadir)
|
|
l = mydir.run()
|
|
assert len(l) == 1
|
|
item = mydir.join(l[0])
|
|
assert isinstance(item, py.test.collect.Module)
|
|
py.test.raises(ImportError, item.run)
|
|
|
|
def test_module_file_not_found():
|
|
fn = datadir.join('nada','no')
|
|
col = py.test.collect.Module(fn)
|
|
py.test.raises(py.error.ENOENT, col.run)
|
|
|
|
def test_syntax_error_in_module():
|
|
p = py.test.ensuretemp("syntaxerror1").join('syntax_error.py')
|
|
p.write("\nthis is really not python\n")
|
|
modpath = datadir.join('syntax_error.py')
|
|
col = py.test.collect.Module(modpath)
|
|
py.test.raises(SyntaxError, col.run)
|
|
|
|
def test_disabled_class():
|
|
col = py.test.collect.Module(datadir.join('disabled.py'))
|
|
l = col.run()
|
|
assert len(l) == 1
|
|
colitem = col.join(l[0])
|
|
assert isinstance(colitem, py.test.collect.Class)
|
|
assert not colitem.run()
|
|
|
|
def test_disabled_module():
|
|
col = py.test.collect.Module(datadir.join('disabled_module.py'))
|
|
l = col.run()
|
|
assert len(l) == 0
|
|
|
|
class Testsomeclass:
|
|
disabled = True
|
|
def test_something():
|
|
raise ValueError
|
|
|
|
|
|
#class TestWithCustomItem:
|
|
# class Item(py.test.collect.Item):
|
|
# flag = []
|
|
# def execute(self, target, *args):
|
|
# self.flag.append(42)
|
|
# target(*args)
|
|
#
|
|
# def test_hello(self):
|
|
# assert self.Item.flag == [42]
|
|
#
|
|
|
|
def test_generative_simple():
|
|
o = tmpdir.ensure('generativetest', dir=1)
|
|
tfile = o.join('test_generative.py')
|
|
tfile.write(py.code.Source("""
|
|
from __future__ import generators # python2.2!
|
|
def func1(arg, arg2):
|
|
assert arg == arg2
|
|
|
|
def test_gen():
|
|
yield func1, 17, 3*5
|
|
yield func1, 42, 6*7
|
|
|
|
class TestGenMethods:
|
|
def test_gen(self):
|
|
yield func1, 17, 3*5
|
|
yield func1, 42, 6*7
|
|
"""))
|
|
col = py.test.collect.Module(tfile)
|
|
l = col.run()
|
|
assert len(l) == 2
|
|
l = col.multijoin(l)
|
|
|
|
generator = l[0]
|
|
assert isinstance(generator, py.test.collect.Generator)
|
|
l2 = generator.run()
|
|
assert len(l2) == 2
|
|
l2 = generator.multijoin(l2)
|
|
assert isinstance(l2[0], py.test.collect.Function)
|
|
assert isinstance(l2[1], py.test.collect.Function)
|
|
assert l2[0].name == '[0]'
|
|
assert l2[1].name == '[1]'
|
|
|
|
assert l2[0].obj.func_name == 'func1'
|
|
|
|
classlist = l[1].run()
|
|
assert len(classlist) == 1
|
|
classlist = l[1].multijoin(classlist)
|
|
cls = classlist[0]
|
|
generator = cls.join(cls.run()[0])
|
|
assert isinstance(generator, py.test.collect.Generator)
|
|
l2 = generator.run()
|
|
assert len(l2) == 2
|
|
l2 = generator.multijoin(l2)
|
|
assert isinstance(l2[0], py.test.collect.Function)
|
|
assert isinstance(l2[1], py.test.collect.Function)
|
|
assert l2[0].name == '[0]'
|
|
assert l2[1].name == '[1]'
|
|
|
|
def test_custom_python_collection_from_conftest():
|
|
o = tmpdir.ensure('customconfigtest', dir=1)
|
|
o.ensure('conftest.py').write("""if 1:
|
|
import py
|
|
class MyFunction(py.test.collect.Function):
|
|
pass
|
|
class Directory(py.test.collect.Directory):
|
|
def filefilter(self, fspath):
|
|
return fspath.check(basestarts='check_', ext='.py')
|
|
class myfuncmixin:
|
|
Function = MyFunction
|
|
def funcnamefilter(self, name):
|
|
return name.startswith('check_')
|
|
|
|
class Module(myfuncmixin, py.test.collect.Module):
|
|
def classnamefilter(self, name):
|
|
return name.startswith('CustomTestClass')
|
|
class Instance(myfuncmixin, py.test.collect.Instance):
|
|
pass
|
|
""")
|
|
checkfile = o.ensure('somedir', 'check_something.py')
|
|
checkfile.write("""if 1:
|
|
def check_func():
|
|
assert 42 == 42
|
|
class CustomTestClass:
|
|
def check_method(self):
|
|
assert 23 == 23
|
|
""")
|
|
|
|
for x in (o, checkfile, checkfile.dirpath()):
|
|
config = py.test.config._reparse([x])
|
|
#print "checking that %s returns custom items" % (x,)
|
|
col = config._getcollector(x)
|
|
assert len(list(col._tryiter(py.test.collect.Item))) == 2
|
|
#assert items[1].__class__.__name__ == 'MyFunction'
|
|
|
|
# test that running a session works from the directories
|
|
old = o.chdir()
|
|
try:
|
|
config = py.test.config._reparse([])
|
|
out = py.std.cStringIO.StringIO()
|
|
session = config._getsessionclass()(config, out)
|
|
session.main()
|
|
l = session.getitemoutcomepairs(Passed)
|
|
assert len(l) == 2
|
|
finally:
|
|
old.chdir()
|
|
|
|
# test that running the file directly works
|
|
config = py.test.config._reparse([str(checkfile)])
|
|
out = py.std.cStringIO.StringIO()
|
|
session = config._getsessionclass()(config, out)
|
|
session.main()
|
|
l = session.getitemoutcomepairs(Passed)
|
|
assert len(l) == 2
|
|
|
|
def test_custom_NONpython_collection_from_conftest():
|
|
o = tmpdir.ensure('customconfigtest_nonpython', dir=1)
|
|
o.ensure('conftest.py').write("""if 1:
|
|
import py
|
|
class CustomItem(py.test.collect.Item):
|
|
def run(self):
|
|
pass
|
|
|
|
class Directory(py.test.collect.Directory):
|
|
def filefilter(self, fspath):
|
|
return fspath.check(basestarts='check_', ext='.txt')
|
|
def join(self, name):
|
|
if not name.endswith('.txt'):
|
|
return super(Directory, self).join(name)
|
|
p = self.fspath.join(name)
|
|
if p.check(file=1):
|
|
return CustomItem(p, parent=self)
|
|
""")
|
|
checkfile = o.ensure('somedir', 'moredir', 'check_something.txt')
|
|
|
|
for x in (o, checkfile, checkfile.dirpath()):
|
|
print "checking that %s returns custom items" % (x,)
|
|
config = py.test.config._reparse([x])
|
|
col = config._getcollector(x)
|
|
assert len(list(col._tryiter(py.test.collect.Item))) == 1
|
|
#assert items[1].__class__.__name__ == 'MyFunction'
|
|
|
|
# test that running a session works from the directories
|
|
old = o.chdir()
|
|
try:
|
|
config = py.test.config._reparse([])
|
|
out = py.std.cStringIO.StringIO()
|
|
session = config._getsessionclass()(config, out)
|
|
session.main()
|
|
l = session.getitemoutcomepairs(Passed)
|
|
assert len(l) == 1
|
|
finally:
|
|
old.chdir()
|
|
|
|
# test that running the file directly works
|
|
config = py.test.config._reparse([str(checkfile)])
|
|
out = py.std.cStringIO.StringIO()
|
|
session = config._getsessionclass()(config, out)
|
|
session.main()
|
|
l = session.getitemoutcomepairs(Passed)
|
|
assert len(l) == 1
|
|
|
|
def test_order_of_execution_generator_same_codeline():
|
|
o = tmpdir.ensure('genorder1', dir=1)
|
|
o.join("test_order1.py").write(py.code.Source("""
|
|
def test_generative_order_of_execution():
|
|
test_list = []
|
|
expected_list = range(6)
|
|
|
|
def list_append(item):
|
|
test_list.append(item)
|
|
|
|
def assert_order_of_execution():
|
|
print 'expected order', expected_list
|
|
print 'but got ', test_list
|
|
assert test_list == expected_list
|
|
|
|
for i in expected_list:
|
|
yield list_append, i
|
|
yield assert_order_of_execution
|
|
"""))
|
|
config = py.test.config._reparse([o])
|
|
session = config.initsession()
|
|
session.main()
|
|
l = session.getitemoutcomepairs(Passed)
|
|
assert len(l) == 7
|
|
|
|
def test_order_of_execution_generator_different_codeline():
|
|
o = tmpdir.ensure('genorder2', dir=2)
|
|
o.join("test_genorder2.py").write(py.code.Source("""
|
|
def test_generative_tests_different_codeline():
|
|
test_list = []
|
|
expected_list = range(3)
|
|
|
|
def list_append_2():
|
|
test_list.append(2)
|
|
|
|
def list_append_1():
|
|
test_list.append(1)
|
|
|
|
def list_append_0():
|
|
test_list.append(0)
|
|
|
|
def assert_order_of_execution():
|
|
print 'expected order', expected_list
|
|
print 'but got ', test_list
|
|
assert test_list == expected_list
|
|
|
|
yield list_append_0
|
|
yield list_append_1
|
|
yield list_append_2
|
|
yield assert_order_of_execution
|
|
"""))
|
|
config = py.test.config._reparse([o])
|
|
session = config.initsession()
|
|
session.main()
|
|
l = session.getitemoutcomepairs(Passed)
|
|
assert len(l) == 4
|
|
|
|
|
|
|
|
def test_documentation_virtual_collector_interaction():
|
|
rootdir = py.path.local(py.__file__).dirpath("doc")
|
|
# HACK
|
|
from py.__.doc import conftest as conf
|
|
old = conf.option.forcegen
|
|
try:
|
|
conf.option.forcegen = 1
|
|
col = py.test.collect.Directory(rootdir)
|
|
x = list(col._tryiter(yieldtype=py.test.collect.Function))
|
|
finally:
|
|
conf.option.forcegen = old
|
|
|
|
|
|
def test__tryiter_ignores_skips():
|
|
tmp = py.test.ensuretemp("_tryiterskip")
|
|
tmp.ensure("subdir", "conftest.py").write(py.code.Source("""
|
|
import py
|
|
class Directory(py.test.collect.Directory):
|
|
def run(self):
|
|
py.test.skip("intentional")
|
|
"""))
|
|
col = py.test.collect.Directory(tmp)
|
|
try:
|
|
list(col._tryiter())
|
|
except KeyboardInterrupt:
|
|
raise
|
|
except:
|
|
exc = py.code.ExceptionInfo()
|
|
py.test.fail("should not have raised: %s" %(exc,))
|
|
|
|
|
|
def test__tryiter_ignores_failing_collectors():
|
|
tmp = py.test.ensuretemp("_tryiterfailing")
|
|
tmp.ensure("subdir", "conftest.py").write(py.code.Source("""
|
|
bla bla bla
|
|
"""))
|
|
col = py.test.collect.Directory(tmp)
|
|
try:
|
|
list(col._tryiter())
|
|
except KeyboardInterrupt:
|
|
raise
|
|
except:
|
|
exc = py.code.ExceptionInfo()
|
|
py.test.fail("should not have raised: %s" %(exc,))
|
|
|
|
l = []
|
|
list(col._tryiter(reporterror=l.append))
|
|
assert len(l) == 2
|
|
excinfo, item = l[-1]
|
|
assert isinstance(excinfo, py.code.ExceptionInfo)
|
|
|
|
def test_tryiter_handles_keyboardinterrupt():
|
|
tmp = py.test.ensuretemp("tryiterkeyboard")
|
|
tmp.ensure("subdir", "conftest.py").write(py.code.Source("""
|
|
raise KeyboardInterrupt()
|
|
"""))
|
|
col = py.test.collect.Directory(tmp)
|
|
py.test.raises(KeyboardInterrupt, list, col._tryiter())
|
|
|
|
def test_check_random_inequality():
|
|
tmp = py.test.ensuretemp("ineq")
|
|
tmp.ensure("test_x.py").write(py.code.Source("""def test_one():
|
|
pass
|
|
"""))
|
|
col = py.test.collect.Directory(tmp)
|
|
fn = col._tryiter().next()
|
|
assert fn != 3
|
|
assert fn != col
|
|
assert fn != [1,2,3]
|
|
assert [1,2,3] != fn
|
|
assert col != fn
|
|
|
|
def test_check_generator_collect_problems():
|
|
tmp = py.test.ensuretemp("gener_coll")
|
|
tmp.ensure("test_one.py").write(py.code.Source("""
|
|
def setup_module(mod):
|
|
mod.x = [1,2,3]
|
|
|
|
def check(zzz):
|
|
assert zzz
|
|
|
|
def test_one():
|
|
for i in x:
|
|
yield check, i
|
|
"""))
|
|
tmp.ensure("__init__.py")
|
|
col = py.test.collect.Module(tmp.join("test_one.py"))
|
|
errors = []
|
|
l = list(col._tryiter(reporterror=errors.append))
|
|
assert len(errors) == 2
|
|
|
|
def test_check_collect_hashes():
|
|
tmp = py.test.ensuretemp("check_collect_hashes")
|
|
tmp.ensure("test_one.py").write(py.code.Source("""
|
|
def test_1():
|
|
pass
|
|
|
|
def test_2():
|
|
pass
|
|
"""))
|
|
tmp.ensure("test_two.py").write(py.code.Source("""
|
|
def test_1():
|
|
pass
|
|
|
|
def test_2():
|
|
pass
|
|
"""))
|
|
tmp.ensure("__init__.py")
|
|
col = py.test.collect.Directory(tmp)
|
|
l = list(col._tryiter())
|
|
assert len(l) == 4
|
|
for numi, i in enumerate(l):
|
|
for numj, j in enumerate(l):
|
|
if numj != numi:
|
|
assert hash(i) != hash(j)
|
|
assert i != j
|
|
|
|
|
|
def test_check_directory_ordered():
|
|
tmpdir = py.test.ensuretemp("test_check_directory_ordered")
|
|
fnames = []
|
|
for i in range(9, -1, -1):
|
|
x = tmpdir.ensure("xdir%d" %(i, ), dir=1)
|
|
fnames.append(x.basename)
|
|
for i in range(9, -1, -1):
|
|
x = tmpdir.ensure("test_file%d.py" % (i,))
|
|
fnames.append(x.basename)
|
|
fnames.sort()
|
|
tmpdir.ensure('adir', dir=1)
|
|
fnames.insert(10, 'adir')
|
|
col = py.test.collect.Directory(tmpdir)
|
|
names = col.run()
|
|
assert names == fnames
|
|
|
|
|