import py
from py.__.test.outcome import Skipped, Failed, Passed, Outcome
from unittest import TestCase as TC
from conftest import TestCaseInstance as TCI, UnitTestFunction as UTF

def get_test(testclass, name):
    tci = TCI(name='dummy', parent=None)
    tci.obj = testclass(methodName='run')
    utf = UTF(name=name, parent=tci)
    return tci, utf

class TestTestCaseInstance(object):
    def test_simple_unittest(self):
        class MyTestCase(TC):
            def test_passing(self):
                self.assertEquals('foo', 'foo')
        obj, test = get_test(MyTestCase, 'test_passing')
        res = test.run()
        assert res is None

    def test_simple_failing(self):
        class MyTestCase(TC):
            def test_failing(self):
                self.assertEquals('foo', 'bar')
        obj, test = get_test(MyTestCase, 'test_failing')
        py.test.raises(Failed, 'test.run()')

    def test_setup(self):
        class MyTestCase(TC):
            def setUp(self):
                self.foo = 1
            def test_setUp(self):
                self.assertEquals(1, self.foo)
        obj, test = get_test(MyTestCase, 'test_setUp')
        res = test.run()
        assert res is None

    def test_teardown(self):
        class MyTestCase(TC):
            def setUp(self):
                self.foo = 1
            def test_setUp_tearDown(self):
                self.assertEquals(1, self.foo)
            def tearDown(self):
                del self.foo
        obj, test = get_test(MyTestCase, 'test_setUp_tearDown')
        res = test.run()
        assert res is None
        assert not hasattr(obj, 'foo')

    def test_teardown_failing(self):
        class MyTestCase(TC):
            def setUp(self):
                self.foo = 1
            def test_failing(self):
                self.assertEquals(2, self.foo)
            def tearDown(self):
                del self.foo
        obj, test = get_test(MyTestCase, 'test_failing')
        obj.obj.foo = 2
        py.test.raises(Failed, 'test.run()')
        assert not hasattr(obj.obj, 'foo')

