class TestActor(TestCase):
    '''Unit tests for the TestActor Class.'''
    def setUp(self):
        """ Creates a test fixture before each test method is run """
        self.actor1 = Actor("Sub", "Hossan", "A01050900",
                            "2012-12-25 00:00:00", 3)
        self.actor1.set_id(1)
        self.actor2 = Actor("Ewan", "Watt", "A01020509", "1995-04-08 00:00:00",
                            0)
        self.actor2.set_id(2)
        self.actor3 = Actor("Tom", "Cruise", "A01021122",
                            "1999-04-28 00:00:00", 0)
        self.actor3.set_id(3)
        self.actor4 = Actor("Anna", "Bell", "A01030900", "2018-04-28 00:00:00",
                            1)
        self.actor4.set_id(4)

        self.logPoint()

    def tearDown(self):
        """ Prints a log point when test is finished """
        self.logPoint()

    def logPoint(self):
        """ Utility function used for module functions and class methods """
        current_test = self.id().split('.')[-1]
        calling_function = inspect.stack()[1][3]
        print('in %s - %s()' % (current_test, calling_function))

    def test_valid_constructor(self):
        '''Test with valid constructor'''
        self.assertIsNotNone(self.actor1, "Actor must be defined.")

    def test_constructor_empty(self):
        '''Test with empty  parameter of constructor'''
        self.assertRaisesRegex(ValueError, "First Name cannot be empty.",
                               Actor, "", "Hossan", "A01050900", "2012-12-25",
                               3)
        self.assertRaisesRegex(ValueError, "Last Name cannot be empty.", Actor,
                               "Sub", "", "A01050900", "2012-12-25", 3)
        self.assertRaisesRegex(ValueError, "Talent Number cannot be empty.",
                               Actor, "Sub", "Hossan", "", "2012-12-25", 3)
        self.assertRaisesRegex(ValueError, "Date Debut cannot be empty.",
                               Actor, "Sub", "Hossan", "A01050900", "", 3)
        self.assertRaisesRegex(ValueError,
                               "Award Number has to be an integer.", Actor,
                               "Sub", "Hossan", "A01050900", "2012-12-25", "")

    def test_constructor_none(self):
        '''Test with none  parameter of constructor'''
        self.assertRaisesRegex(ValueError, "First Name cannot be undefined.",
                               Actor, None, "Hossan", "A01050900",
                               "2012-12-25", 3)
        self.assertRaisesRegex(ValueError, "Last Name cannot be undefined.",
                               Actor, "Sub", None, "A01050900", "2012-12-25",
                               3)
        self.assertRaisesRegex(ValueError,
                               "Talent Number cannot be undefined.", Actor,
                               "Sub", "Hossan", None, "2012-12-25", 3)
        self.assertRaisesRegex(ValueError, "Date Debut cannot be undefined.",
                               Actor, "Sub", "Hossan", "A01050900", None, 3)
        self.assertRaisesRegex(ValueError,
                               "Award Number has to be an integer.", Actor,
                               "Sub", "Hossan", "A01050900", "2012-12-25",
                               None)

    def test_add_movie(self):
        "Test with valid new movie"
        self.actor1._movie_list = []
        self.actor1.add_movie('Gone with the wind')
        self.assertEqual(self.actor1.get_movie_list(), ['Gone with the wind'])

        self.actor1._movie_list = ['Gone with the wind']
        self.actor1.add_movie('Harry Porter')
        self.assertEqual(self.actor1.get_movie_list(),
                         ['Gone with the wind', 'Harry Porter'])

    def test_add_movie_exist(self):
        "Test with existing new movie"
        self.actor1._movie_list = ['Gone with the wind']
        self.actor1.add_movie('Gone with the wind')
        self.assertEqual(self.actor1.get_movie_list(), ['Gone with the wind'])

    def test_get_movie_summary(self):
        '''Test with valid movie summary'''
        self.actor1._movie_list = ['Gone with the wind', 'Harry Porter']
        self.assertEqual(
            self.actor1.get_movie_summary(),
            "Sub, Hossan is an actor in the Gone with the wind, Harry Porter")

    def test_get_num_movie(self):
        '''Test with valid number of movie'''
        self.actor1._movie_list = ['Gone with the wind', 'Harry Porter']
        self.assertEqual(self.actor1.get_num_movie(), 2)

    def test_get_num_award(self):
        '''Test with valid number of awards'''
        self.assertEqual(self.actor1.get_num_award(), 3)

    def test_get_details(self):
        '''Test with valid details'''
        self.assertEqual(
            self.actor1.get_details(),
            "Sub, Hossan id 1 talent number A01050900 year debuted 2012 has 3 awards"
        )
        self.assertEqual(
            self.actor2.get_details(),
            "Ewan, Watt id 2 talent number A01020509 year debuted 1995 has no award"
        )
        self.assertEqual(
            self.actor3.get_details(),
            "Tom, Cruise id 3 talent number A01021122 year debuted 1999 has no award"
        )
        self.assertEqual(
            self.actor4.get_details(),
            "Anna, Bell id 4 talent number A01030900 year debuted 2018 has 1 awards"
        )

    def test_get_type(self):
        '''Test with valid type'''
        self.assertEqual(self.actor1.get_type(), "actor")
        self.assertEqual(self.actor2.get_type(), "actor")
        self.assertEqual(self.actor3.get_type(), "actor")
        self.assertEqual(self.actor4.get_type(), "actor")

    def test_get_id(self):
        '''Test with valid id'''
        self.assertEqual(self.actor1.get_id(), 1)

    def test_set_id(self):
        '''Test with valid id'''

        self.actor1.set_id(2)
        self.assertEqual(self.actor1.get_id(), 2)

    def test_get_first_name(self):
        "Test with valid first name"
        self.assertEqual(self.actor1.get_first_name(), "Sub")

    def test_get_last_name(self):
        "Test with valid last name"
        self.assertEqual(self.actor1.get_last_name(), "Hossan")

    def test_get_full_name(self):
        "Test with valid full name"
        self.assertEqual(self.actor1.get_full_name(), "Sub, Hossan")

    def test_get_talent_num(self):
        "Test with valid talent num"
        self.assertEqual(self.actor1.get_talent_num(), "A01050900")

    def test_get_year_debut(self):
        "Test with valid year debut"
        self.assertEqual(self.actor1.get_year_debut(), 2012)

    def test_get_date_debut(self):
        "Test with valid date debut"
        self.assertEqual(self.actor1.get_date_debut(),
                         datetime.datetime(2012, 12, 25, 0, 0))

    def test_get_years_debut(self):
        "Test with valid num of years debut"
        self.assertEqual(self.actor1.get_years_debut(), 7)

    def test_to_dict(self):
        """Test with valid return of a dictionary represenation of an actor"""

        self.assertEqual(
            self.actor1.to_dict(), {
                'award_num': 3,
                'date_debut': '2012-12-25 00:00:00',
                'first_name': 'Sub',
                'id': 1,
                'last_name': 'Hossan',
                'movie_list': [],
                'talent_num': 'A01050900',
                'type': 'actor'
            })