#!/usr/bin/python

import site, os
site.addsitedir(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
    
__requires__='Bazki'
import pkg_resources
pkg_resources.require('Bazki')

import unittest

from gameki.macros import parsename, PRE, SUF

class ParsenameTest(unittest.TestCase):

    def assertDictEquals(self, expected, actual):
        for k in expected:
            self.assertTrue(k in actual,
                            "Expected key %s not in %s." % (k, actual))
            self.assertEquals(expected[k], actual[k],
                              "Expected value for %s to be '%s', not '%s'."
                              % (k, expected[k], actual[k]))
        for k in actual:
            self.assertTrue(k in expected,
                            "Unexpected key %s in %s." % (k, actual))

    def test_basic(self):
        self.assertDictEquals(dict(full='Ph43t0n',
                                   formal='Ph43t0n',
                                   informal='Ph43t0n',
                                   prefix='',
                                   first='Ph43t0n',
                                   middle='',
                                   last='',
                                   suffix=''),
                              parsename('Ph43t0n'))
        self.assertDictEquals(dict(full='James Bond',
                                   formal='Bond',
                                   informal='James',
                                   prefix='',
                                   first='James',
                                   middle='',
                                   last='Bond',
                                   suffix=''),
                              parsename('James Bond'))
        self.assertDictEquals(dict(full='Wilhelmina R. Locke',
                                   formal='Locke',
                                   informal='Wilhelmina',
                                   prefix='',
                                   first='Wilhelmina',
                                   middle='R.',
                                   last='Locke',
                                   suffix=''),
                              parsename('Wilhelmina R. Locke'))
        self.assertDictEquals(dict(full='Dr. Gregory House',
                                   formal='Dr. House',
                                   informal='Gregory',
                                   prefix='Dr.',
                                   first='Gregory',
                                   middle='',
                                   last='House',
                                   suffix=''),
                              parsename('Dr. Gregory House'))
        self.assertDictEquals(dict(full='Dr. Morden',
                                   formal='Dr. Morden',
                                   informal='Morden',
                                   prefix='Dr.',
                                   first='',
                                   middle='',
                                   last='Morden',
                                   suffix=''),
                              parsename('Dr. Morden'))

    def test_suffixes(self):
        self.assertDictEquals(dict(full="Martin Luther King, Jr.",
                                   formal="King",
                                   informal="Martin",
                                   prefix="",
                                   first="Martin",
                                   middle="Luther",
                                   last="King",
                                   suffix="Jr."),
                              parsename("Martin Luther King, Jr."))

    def test_explicit_breaking(self):
        self.assertDictEquals(dict(full='Commodore Matthew C. Perry',
                                   formal='Commodore Perry',
                                   informal='Matthew',
                                   prefix='Commodore',
                                   first='Matthew',
                                   middle='C.',
                                   last='Perry',
                                   suffix=''),
                              parsename('Commodore%sMatthew C. Perry'
                                        % PRE))
        self.assertDictEquals(dict(full='James Bond Junior',
                                   formal='Bond',
                                   informal='James',
                                   prefix='',
                                   first='James',
                                   middle='',
                                   last='Bond',
                                   suffix='Junior'),
                              parsename('James Bond%sJunior'
                                        % SUF))

if __name__ == '__main__':
    unittest.main()
