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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
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]) |
|
col = config._getcollector(x) |
assert len(list(col._tryiter(py.test.collect.Item))) == 2 |
|
|
|
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() |
|
|
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 |
|
|
|
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() |
|
|
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") |
|
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 |
|
|
|