328 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			328 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
| import py
 | |
| from setupdata import setup_module # sets up global 'tmpdir' 
 | |
| from py.__.test.outcome import Skipped, Failed, Passed, Outcome
 | |
| 
 | |
| implied_options = {
 | |
|     '--pdb': 'usepdb and nocapture', 
 | |
|     '-v': 'verbose', 
 | |
|     '-l': 'showlocals',
 | |
|     '--runbrowser': 'startserver and runbrowser', 
 | |
| }
 | |
| 
 | |
| conflict_options = ('--looponfailing --pdb',
 | |
|                     '--dist --pdb', 
 | |
|                     '--exec=%s --pdb' % py.std.sys.executable,
 | |
|                    )
 | |
| 
 | |
| def test_conflict_options():
 | |
|     for spec in conflict_options: 
 | |
|         opts = spec.split()
 | |
|         yield check_conflict_option, opts
 | |
| 
 | |
| def check_conflict_option(opts):
 | |
|     print "testing if options conflict:", " ".join(opts)
 | |
|     config = py.test.config._reparse(opts + [datadir/'filetest.py'])
 | |
|     py.test.raises((ValueError, SystemExit), """
 | |
|         config.initsession()
 | |
|     """)
 | |
|     
 | |
| def test_implied_options():
 | |
|     for key, expr in implied_options.items():
 | |
|         yield check_implied_option, [key], expr
 | |
| 
 | |
| def check_implied_option(opts, expr):
 | |
|     config = py.test.config._reparse(opts + [datadir/'filetest.py'])
 | |
|     session = config.initsession()
 | |
|     assert eval(expr, session.config.option.__dict__)
 | |
| 
 | |
| def test_default_session_options():
 | |
|     for opts in ([], ['-l'], ['-s'], ['--tb=no'], ['--tb=short'], 
 | |
|                  ['--tb=long'], ['--fulltrace'], ['--nomagic'], 
 | |
|                  ['--traceconfig'], ['-v'], ['-v', '-v']):
 | |
|         yield runfiletest, opts
 | |
| 
 | |
| def runfiletest(opts):
 | |
|     config = py.test.config._reparse(opts + [datadir/'filetest.py']) 
 | |
|     session = config.initsession()
 | |
|     session.main()
 | |
|     l = session.getitemoutcomepairs(Failed)
 | |
|     assert len(l) == 2 
 | |
|     l = session.getitemoutcomepairs(Passed)
 | |
|     assert not l 
 | |
| 
 | |
| def test_is_not_boxed_by_default():
 | |
|     config = py.test.config._reparse([datadir])
 | |
|     assert not config.option.boxed
 | |
| 
 | |
| class TestKeywordSelection: 
 | |
|     def test_select_simple(self): 
 | |
|         for keyword in ['test_one', 'est_on']:
 | |
|             config = py.test.config._reparse([datadir/'filetest.py', 
 | |
|                                                    '-k', keyword])
 | |
|             session = config._getsessionclass()(config, py.std.sys.stdout)
 | |
|             session.main()
 | |
|             l = session.getitemoutcomepairs(Failed)
 | |
|             assert len(l) == 1 
 | |
|             item = l[0][0]
 | |
|             assert item.name == 'test_one'
 | |
|             l = session.getitemoutcomepairs(Skipped)
 | |
|             assert len(l) == 1 
 | |
| 
 | |
|     def test_select_extra_keywords(self): 
 | |
|         o = tmpdir.ensure('selecttest', dir=1)
 | |
|         tfile = o.join('test_select.py').write(py.code.Source("""
 | |
|             def test_1():
 | |
|                 pass 
 | |
|             class TestClass: 
 | |
|                 def test_2(self): 
 | |
|                     pass
 | |
|         """))
 | |
|         conftest = o.join('conftest.py').write(py.code.Source("""
 | |
|             import py
 | |
|             class Class(py.test.collect.Class): 
 | |
|                 def _haskeyword(self, keyword): 
 | |
|                     return keyword == 'xxx' or \
 | |
|                            super(Class, self)._haskeyword(keyword) 
 | |
|         """))
 | |
|         for keyword in ('xxx', 'xxx test_2', 'TestClass', 'xxx -test_1', 
 | |
|                         'TestClass test_2', 'xxx TestClass test_2',): 
 | |
|             f = py.std.StringIO.StringIO()
 | |
|             config = py.test.config._reparse([o, '-k', keyword]) 
 | |
|             session = config._getsessionclass()(config, f) 
 | |
|             session.main()
 | |
|             print "keyword", repr(keyword)
 | |
|             l = session.getitemoutcomepairs(Passed)
 | |
|             assert len(l) == 1
 | |
|             assert l[0][0].name == 'test_2'
 | |
|             l = session.getitemoutcomepairs(Skipped)
 | |
|             assert l[0][0].name == 'test_1'
 | |
| 
 | |
|     def test_select_starton(self):
 | |
|         config = py.test.config._reparse([datadir/'testmore.py', 
 | |
|                                           '-j', '-k', "test_two"])
 | |
|         session = config._getsessionclass()(config, py.std.sys.stdout)
 | |
|         session.main()
 | |
|         l = session.getitemoutcomepairs(Passed)
 | |
|         assert len(l) == 2
 | |
|         l = session.getitemoutcomepairs(Skipped)
 | |
|         assert len(l) == 1
 | |
|         
 | |
|    
 | |
| class TestTerminalSession: 
 | |
|     def mainsession(self, *args): 
 | |
|         from py.__.test.terminal.terminal import TerminalSession
 | |
|         self.file = py.std.StringIO.StringIO() 
 | |
|         config = py.test.config._reparse(list(args))
 | |
|         session = TerminalSession(config, file=self.file) 
 | |
|         session.main()
 | |
|         return session
 | |
| 
 | |
|     def test_terminal(self): 
 | |
|         session = self.mainsession(datadir / 'filetest.py')
 | |
|         out = self.file.getvalue() 
 | |
|         l = session.getitemoutcomepairs(Failed)
 | |
|         assert len(l) == 2
 | |
|         assert out.find('2 failed') != -1 
 | |
| 
 | |
|     def test_syntax_error_module(self): 
 | |
|         session = self.mainsession(datadir / 'syntax_error.py')
 | |
|         l = session.getitemoutcomepairs(Failed)
 | |
|         assert len(l) == 1 
 | |
|         out = self.file.getvalue() 
 | |
|         assert out.find(str('syntax_error.py')) != -1
 | |
|         assert out.find(str('not python')) != -1
 | |
| 
 | |
|     def test_exit_first_problem(self): 
 | |
|         session = self.mainsession("--exitfirst", 
 | |
|                                    datadir / 'filetest.py')
 | |
|         assert session.config.option.exitfirst
 | |
|         l = session.getitemoutcomepairs(Failed)
 | |
|         assert len(l) == 1 
 | |
|         l = session.getitemoutcomepairs(Passed)
 | |
|         assert not l 
 | |
| 
 | |
|     def test_collectonly(self): 
 | |
|         session = self.mainsession("--collectonly", 
 | |
|                                    datadir / 'filetest.py')
 | |
|         assert session.config.option.collectonly
 | |
|         out = self.file.getvalue()
 | |
|         #print out 
 | |
|         l = session.getitemoutcomepairs(Failed)
 | |
|         #if l: 
 | |
|         #    x = l[0][1].excinfo
 | |
|         #    print x.exconly() 
 | |
|         #    print x.traceback
 | |
|         assert len(l) == 0 
 | |
|         for line in ('filetest.py', 'test_one', 
 | |
|                      'TestClass', 'test_method_one'): 
 | |
|             assert out.find(line) 
 | |
| 
 | |
|     def test_recursion_detection(self): 
 | |
|         o = tmpdir.ensure('recursiontest', dir=1)
 | |
|         tfile = o.join('test_recursion.py')
 | |
|         tfile.write(py.code.Source("""
 | |
|             def test_1():
 | |
|                 def f(): 
 | |
|                     g() 
 | |
|                 def g(): 
 | |
|                     f() 
 | |
|                 f() 
 | |
|         """))
 | |
|         session = self.mainsession(o)
 | |
|         print "back from main", o
 | |
|         out = self.file.getvalue() 
 | |
|         #print out
 | |
|         i = out.find('Recursion detected') 
 | |
|         assert i != -1 
 | |
| 
 | |
|     def test_generator_yields_None(self): 
 | |
|         o = tmpdir.ensure('generatornonetest', dir=1)
 | |
|         tfile = o.join('test_generatornone.py')
 | |
|         tfile.write(py.code.Source("""
 | |
|             def test_1():
 | |
|                 yield None 
 | |
|         """))
 | |
|         session = self.mainsession(o) 
 | |
|         out = self.file.getvalue() 
 | |
|         #print out
 | |
|         i = out.find('TypeError') 
 | |
|         assert i != -1 
 | |
| 
 | |
|     def test_capturing_hooks_simple(self): 
 | |
|         o = tmpdir.ensure('capturing', dir=1)
 | |
|         tfile = o.join('test_capturing.py').write(py.code.Source("""
 | |
|             import py
 | |
|             print "module level output"
 | |
|             def test_capturing():
 | |
|                 print 42
 | |
|                 print >>py.std.sys.stderr, 23 
 | |
|             def test_capturing_error():
 | |
|                 print 1
 | |
|                 print >>py.std.sys.stderr, 2
 | |
|                 raise ValueError
 | |
|         """))
 | |
|         conftest = o.join('conftest.py').write(py.code.Source("""
 | |
|             import py
 | |
|             class Function(py.test.collect.Function): 
 | |
|                 def startcapture(self): 
 | |
|                     self._mycapture = None
 | |
|                     
 | |
|                 def finishcapture(self): 
 | |
|                     self._testmycapture = None
 | |
|         """))
 | |
|         session = self.mainsession(o) 
 | |
|         l = session.getitemoutcomepairs(Passed)
 | |
|         assert len(l) == 1
 | |
|         item = l[0][0]
 | |
|         assert hasattr(item, '_testmycapture')
 | |
|         print item._testmycapture
 | |
| 
 | |
|         assert isinstance(item.parent, py.test.collect.Module)
 | |
|         out, err = item.parent._getouterr()
 | |
|         assert out.find('module level output') != -1 
 | |
|         allout = self.file.getvalue()
 | |
|         print "allout:", allout
 | |
|         assert allout.find('module level output') != -1, (
 | |
|                            "session didn't show module output")
 | |
| 
 | |
|     def test_raises_output(self): 
 | |
|         o = tmpdir.ensure('raisestest', dir=1)
 | |
|         tfile = o.join('test_raisesoutput.py')
 | |
|         tfile.write(py.code.Source("""
 | |
|             import py
 | |
|             def test_raises_doesnt():
 | |
|                 py.test.raises(ValueError, int, "3")
 | |
|         """))
 | |
|         session = self.mainsession(o) 
 | |
|         out = self.file.getvalue() 
 | |
|         if not out.find("DID NOT RAISE") != -1: 
 | |
|             print out
 | |
|             py.test.fail("incorrect raises() output") 
 | |
| 
 | |
|     def test_order_of_execution(self): 
 | |
|         o = tmpdir.ensure('ordertest', dir=1)
 | |
|         tfile = o.join('test_orderofexecution.py')
 | |
|         tfile.write(py.code.Source("""
 | |
|             l = []
 | |
|             def test_1():
 | |
|                 l.append(1)
 | |
|             def test_2():
 | |
|                 l.append(2)
 | |
|             def test_3():
 | |
|                 assert l == [1,2]
 | |
|             class Testmygroup:
 | |
|                 reslist = l
 | |
|                 def test_1(self):
 | |
|                     self.reslist.append(1)
 | |
|                 def test_2(self):
 | |
|                     self.reslist.append(2)
 | |
|                 def test_3(self):
 | |
|                     self.reslist.append(3)
 | |
|                 def test_4(self):
 | |
|                     assert self.reslist == [1,2,1,2,3]
 | |
|         """))
 | |
| 
 | |
|         session = self.mainsession(o) 
 | |
|         l = session.getitemoutcomepairs(Failed)
 | |
|         assert len(l) == 0 
 | |
|         l = session.getitemoutcomepairs(Passed)
 | |
|         assert len(l) == 7 
 | |
|         # also test listnames() here ... 
 | |
|         item, result = l[-1]
 | |
|         assert item.name == 'test_4' 
 | |
|         names = item.listnames()
 | |
|         assert names == ['ordertest', 'test_orderofexecution.py', 'Testmygroup', '()', 'test_4']
 | |
| 
 | |
|     def test_nested_import_error(self): 
 | |
|         o = tmpdir.ensure('Ians_importfailure', dir=1) 
 | |
|         tfile = o.join('test_import_fail.py')
 | |
|         tfile.write(py.code.Source("""
 | |
|             import import_fails
 | |
|             def test_this():
 | |
|                 assert import_fails.a == 1
 | |
|         """))
 | |
|         o.join('import_fails.py').write(py.code.Source("""
 | |
|             import does_not_work 
 | |
|             a = 1
 | |
|         """))
 | |
|         session = self.mainsession(o) 
 | |
|         l = session.getitemoutcomepairs(Failed)
 | |
|         assert len(l) == 1 
 | |
|         item, outcome = l[0]
 | |
|         assert str(outcome.excinfo).find('does_not_work') != -1 
 | |
| 
 | |
|     def test_safe_repr(self):
 | |
|         session = self.mainsession(datadir/'brokenrepr.py')
 | |
|         out = self.file.getvalue()
 | |
|         print 'Output of simulated "py.test brokenrepr.py":'
 | |
|         print out
 | |
|         
 | |
|         l = session.getitemoutcomepairs(Failed)
 | |
|         assert len(l) == 2
 | |
|         assert out.find("""[Exception("Ha Ha fooled you, I'm a broken repr().") raised in repr()]""") != -1 #'
 | |
|         assert out.find("[unknown exception raised in repr()]") != -1
 | |
| 
 | |
|     def test_E_on_correct_line(self):
 | |
|         o = tmpdir.ensure('E_on_correct_line', dir=1)
 | |
|         tfile = o.join('test_correct_line.py')
 | |
|         source = py.code.Source("""
 | |
|             import py
 | |
|             def test_hello():
 | |
|                 assert (None ==
 | |
|                         ['a',
 | |
|                          'b',
 | |
|                          'c'])
 | |
|         """)
 | |
|         tfile.write(source)
 | |
|         session = self.mainsession(o) 
 | |
|         out = self.file.getvalue()
 | |
|         print 'Output of simulated "py.test test_correct_line.py":'
 | |
|         print out
 | |
|         i = out.find('test_correct_line.py:')
 | |
|         assert i >= 0
 | |
|         linenum = int(out[i+len('test_correct_line.py:')])  # a single char
 | |
|         line_to_report = source[linenum-1]
 | |
|         expected_output = '\nE   ' + line_to_report + '\n'
 | |
|         print 'Looking for:', expected_output
 | |
|         assert expected_output in out
 |