"""Exception event test"""

import unittest
import target
import pykd
import testutils


class ExceptionTest(unittest.TestCase):
    """Exception event test"""

    def testExceptionHandler(self):

        class ExceptionHandler(pykd.eventHandler):
           def __init__(self):
               pykd.eventHandler.__init__(self)

           def onException(self, exceptInfo):
                self.exceptInfo = exceptInfo
                return pykd.eventResult.Break

        processId = pykd.startProcess( target.appPath + " exception" )
        with testutils.ContextCallIt( testutils.KillProcess(processId) ) as killStartedProcess :
            exceptionHandler = ExceptionHandler()

            self.assertEqual( pykd.Break, pykd.go() )
            self.assertEqual( 0xC0000005, exceptionHandler.exceptInfo.exceptionCode) #0xC0000005 = Access violation

    def testSecondChance(self):

        class ExceptionHandler(pykd.eventHandler):
           def __init__(self):
               pykd.eventHandler.__init__(self)

           def onException(self, exceptInfo):
                self.exceptInfo = exceptInfo
                return pykd.eventResult.Proceed

        processId = pykd.startProcess( target.appPath + " exception" )
        with testutils.ContextCallIt( testutils.KillProcess(processId) ) as killStartedProcess :
            exceptionHandler = ExceptionHandler()
            self.assertEqual( pykd.Break, pykd.go() )
            self.assertEqual( True, exceptionHandler.exceptInfo.firstChance)
            self.assertEqual( pykd.Break, pykd.go() )
            self.assertEqual( False, exceptionHandler.exceptInfo.firstChance)