def setUp(self):
     self.parser = ProtocolParser()
class TestProtocolParser(unittest.TestCase):
    """ Unit tests for the protocol parser. """
    
    def setUp(self):
        self.parser = ProtocolParser()
        
    def test_event_name(self):
        """ Test the ``event_name`` method of the protocol parser. """
        # Basic part packet
        packet = Packet('recv chat:Botdom\n\npart photofroggy\nr=timed out')
        
        # event_name should return `recv_part` in this case!
        packet_name = self.parser.event_name(packet)
        
        self.failIf(packet_name != 'recv_part',
            'Protocol parser does not properly determine packet names')
    
    def test_event_name_unknown(self):
        """ Make sure the parser returns a correct value for an unknown packet. """
        # Unsupported packet.
        packet = Packet('foo bar\n')
        
        # event_name should return `unknown` in this case!
        packet_name = self.parser.event_name(packet)
        
        self.failIf(packet_name != 'unknown',
            'Protocol recognised an unsupported packet as a supported packet')
    
    def test_mapper(self):
        """ Test the ``mapper`` method of the protocol parser. """
        # Testing the mapper using a recv_msg packet has the side-effect
        # of testing both the generic_recv and sort methods.
        packet = Packet('recv chat:Botdom\n\nmsg main\nfrom=photofroggy\n\nStupid message here.')
        event = self.parser.mapper(packet)
        
        ''' Time to make sure we got the right data out of the protocol parser.
            The object returned should contain this data:
                
                event.args = OrderedDict({
                    'ns': 'chat:Botdom',
                    'user': '******',
                    'message': 'Stupid message here.',
                    'raw': 'recv chat:Botdom\n\nmsg main\nfrom=photofroggy\n\nStupid message here.'
                })
        '''
        expected = [
            ('ns', 'chat:Botdom'),
            ('user', 'photofroggy'),
            ('message', 'Stupid message here.'),
            ('raw', 'recv chat:Botdom\n\nmsg main\nfrom=photofroggy\n\nStupid message here.')
        ]
        
        for rule in expected:
            try:
                arg = event(rule[0])
                self.failIf(arg != rule[1],
                    'Protocol parser stored an incorrect {0} value in the event object'.format(rule[0]))
            except KeyError:
                self.fail('Protocol parser failed to store {0} value in the event object'.format(rule[0]))
    
    def test_message_generating(self):
        """ Test the ``logger`` method to make sure it generates messages properly. """
        packet = Packet('recv chat:Botdom\n\nmsg main\nfrom=photofroggy\n\nStupid message here.')
        data = self.parser.mapper(packet)
        
        log_list = self.parser.logger(data, '#Botdom', packet.raw)
        
        self.failIf(log_list is None,
            'Protocol parser did not recognise the given packet')
        
        self.failIf(log_list[0] != '<photofroggy> Stupid message here.',
            'The logger method did not render the correct log message')
        
        self.failIf(log_list[1] != '#Botdom',
            'The logger method returned with the wrong channel namespace')
        
        self.failIf(not log_list[2],
            'The logger method returned with the wrong value for `showns`')
        
        self.failIf(log_list[3],
            'The logger method returned with the wrong value for `mute`')
        
        self.failIf(log_list[4] != 'recv chat:Botdom\n\nmsg main\nfrom=photofroggy\n\nStupid message here.',
            'The logger method did not return the raw packet')


# EOF