import sys
import unittest
import nose.result
from nose.config import Config
from nose.exc import DeprecatedTest, SkipTest
from nose.result import start_capture, end_capture

class TestResult(unittest.TestCase):

    class T(unittest.TestCase):
        def runTest(self):
            pass

    def setUp(self):
        self.buf = []
        class dummy:
            pass
        stream = dummy()
        stream.write = self.buf.append
        stream.writeln = self.buf.append
        self.tr = nose.result.TextTestResult(stream, None, 2, Config())

#    def tearDown(self):
#        nose.result.end_capture()
        
    def test_capture(self):
        start_capture()
        try:
            print "Hello"
            self.assertEqual(sys.stdout.getvalue(), "Hello\n")
        finally:
            end_capture()
        
    def test_init(self):
        tr = self.tr
        self.assertEqual(tr.errors, [])
        self.assertEqual(tr.failures, [])
        self.assertEqual(tr.deprecated, [])
        self.assertEqual(tr.skip, [])
        self.assertEqual(tr.testsRun, 0)
        self.assertEqual(tr.shouldStop, 0)
        
    def test_add_error(self):
        buf, tr = self.buf, self.tr
        try:
            raise Exception("oh no!")
        except:
            err = sys.exc_info()            
        test = self.T()
        tr.addError(test, err)
        self.assertEqual(tr.errors[0],
                         (test, tr._exc_info_to_string(err, test), ''))
        self.assertEqual(buf, [ 'ERROR' ])

        # test with capture
        start_capture()
        try:
            tr.capture = True
            print "some output"
            tr.addError(test, err)
            self.assertEqual(tr.errors[1],
                             (test, tr._exc_info_to_string(err, test),
                              'some output\n'))
            self.assertEqual(buf, [ 'ERROR', 'ERROR' ])
        finally:
            end_capture()

        # test deprecated
        try:
            raise DeprecatedTest("deprecated")
        except:
            err = sys.exc_info()
        tr.addError(test, err)
        self.assertEqual(len(tr.errors), 2)
        self.assertEqual(tr.deprecated, [ (test, '', '') ])

        # test skip
        try:
            raise SkipTest("skip")
        except:
            err = sys.exc_info()
        tr.addError(test, err)
        self.assertEqual(len(tr.errors), 2)
        self.assertEqual(tr.skip, [ (test, '', '') ])
        self.assertEqual(buf, ['ERROR', 'ERROR', 'DEPRECATED', 'SKIP'])
        
    def test_add_failure(self):
        buf, tr = self.buf, self.tr
        try:
            assert False, "test add fail"
        except:
            err = sys.exc_info()            
        test = self.T()
        tr.addFailure(test, err)
        self.assertEqual(tr.failures[0],
                         (test, tr._exc_info_to_string(err, test), ''))
        self.assertEqual(buf, [ 'FAIL' ])

        # test with capture
        start_capture()
        try:
            tr.capture = True
            print "some output"
            tr.addFailure(test, err)
            self.assertEqual(tr.failures[1],
                             (test, tr._exc_info_to_string(err, test),
                              'some output\n'))
            self.assertEqual(buf, [ 'FAIL', 'FAIL' ])
        finally:
            end_capture()

    def test_start_stop(self):
        tr = self.tr
        test = self.T()
        tr.startTest(test)
        tr.stopTest(test)

    def test_stop_on_error(self):
        buf, tr = self.buf, self.tr
        tr.conf.stopOnError = True
        try:
            raise Exception("oh no!")
        except:
            err = sys.exc_info()
        test = self.T()
        tr.addError(test, err)        
        assert tr.shouldStop

    def test_stop_on_error_skip(self):
        buf, tr = self.buf, self.tr
        tr.conf.stopOnError = True
        try:
            raise SkipTest("oh no!")
        except:
            err = sys.exc_info()
        test = self.T()
        tr.addError(test, err)        
        assert not tr.shouldStop

    def test_stop_on_error_deprecated(self):
        buf, tr = self.buf, self.tr
        tr.conf.stopOnError = True
        try:
            raise DeprecatedTest("oh no!")
        except:
            err = sys.exc_info()
        test = self.T()
        tr.addError(test, err)        
        assert not tr.shouldStop
        
    def test_stop_on_error_fail(self):
        buf, tr = self.buf, self.tr
        tr.conf.stopOnError = True
        try:
            assert False, "test add fail"
        except:
            err = sys.exc_info()            
        test = self.T()
        tr.addFailure(test, err)        
        assert tr.shouldStop
        
if __name__ == '__main__':
    unittest.main()


syntax highlighted by Code2HTML, v. 0.9.1