class TestRoom(unittest.TestCase):
    def setUp(self):
        self.song_1 = Song("Nirvava - Smells like teen spirit")
        self.song_2 = Song("Bob Dylan - Like A Rolling Stone")
        self.guest_1 = Guest("Dougal", 50)
        self.guest_2 = Guest("Hamish", 70)
        self.guest_3 = Guest("Donny", 3)
        songs_1 = [self.song_1, self.song_2]
        songs_2 = []
        self.room_1 = Room("Rock", songs_1, 5)
        self.room_2 = Room("Dance", songs_2, 8)

    def test_guest_has_name(self):
        self.assertEqual("Rock", self.room_1.name)
        self.assertEqual("Dance", self.room_2.name)

    def test_no_guests_in_room(self):
        self.assertEqual(0, self.room_1.get_guests_in_room())

    def test_room_has_songs(self):
        self.assertEqual(2, self.room_1.check_songs())

    def test_room_can_add_song(self):
        self.song_3 = Song("Eric Clapton - Layla")
        self.room_1.add_song_to_room(self.song_3)
        self.assertEqual(3, self.room_1.check_songs())

    def test_room_can_add_guests(self):
        self.room_1.add_guest_to_room(self.guest_1)
        self.assertEqual("Welcome",
                         self.room_1.add_guest_to_room(self.guest_2))

    def test_room_cannot_add_guests(self):
        self.room_1.add_guest_to_room(self.guest_1)
        self.room_1.add_guest_to_room(self.guest_2)
        self.assertEqual("Room is full!",
                         self.room_1.add_guest_to_room(self.guest_3))

    def test_room_can_remove_guests(self):
        self.room_1.add_guest_to_room(self.guest_3)
        self.room_1.remove_guest_from_room(self.guest_3)
        self.assertEqual(0, self.room_1.get_guests_in_room())

    def test_room_has_entry_fee(self):
        self.assertEqual(5, self.room_1.entry_fee)

    def test_room_has_till(self):
        self.assertEqual(0, self.room_1.till)

    def test_add_money_to_till(self):
        self.room_1.add_money_to_till(5)
        self.assertEqual(5, self.room_1.till)

    def test_guest_check_in(self):
        self.room_1.guest_check_in(self.guest_1)
        self.assertEqual(45, self.guest_1.money)

    def test_guest_cant_check_in(self):
        self.room_1.guest_check_in(self.guest_3)
        self.assertEqual(3, self.guest_3.money)

    def test_guest_cant_afford_room(self):
        self.assertEqual("Sorry, not tonight",
                         self.room_1.guest_check_in(self.guest_3))
class TestRoom(unittest.TestCase):
    
    def setUp(self):
        self.room = Room("Super Stars", 100.00, 2, 5.00)
        self.guest = Guest("Monica", 40.00, "I Will Survive")
        self.rich_guest = Guest("Pheobe", 70.00, "Dancing Queen")
        self.poor_guest = Guest("Chandler", 4.00, "Sweet Caroline")
        self.songs = { 
            "Dancing Queen": Song("Dancing Queen", "ABBA"),
            "I Will Survive": Song("I Will Survive", "Gloria Gaynor"),
            "Sweet Caroline": Song("Sweet Caroline", "Neil Diamond")
        }

    def test_room_has_a_name(self):
        self.assertEqual("Super Stars", self.room.name)

    def test_room_has_money_in_till(self):
        self.assertEqual(100.00, self.room.till)

    def test_room_has_empty_guest_list(self):
        self.assertEqual([], self.room.guest_list)

    def test_room_has_empty_playlist(self):
         self.assertEqual({}, self.room.playlist)

    def test_guest_room_limit_set(self):
        self.assertEqual(2, self.room.room_limit)

    def test_room_has_space_returns_True_when_room_has_space(self):
        self.assertEqual(True, self.room.check_room_has_space())
    
    def test_room_has_space_returns_False_when_room_is_full(self):
        self.room.admit_guest(self.guest)
        self.room.admit_guest(self.rich_guest)
        self.room.admit_guest(self.rich_guest)
        self.assertEqual(False, self.room.check_room_has_space())

    def test_guest_admitted_when_room_has_space_and_enough_money(self):
        self.room.admit_guest(self.guest)
        self.assertEqual(1, len(self.room.guest_list))

    def test_guest_not_admitted_when_room_has_space_but_not_enough_money(self):
        self.room.admit_guest(self.poor_guest)
        self.assertEqual(0, len(self.room.guest_list))    

    def test_guest_not_admitted_when_has_enough_money_but_capacity_full(self):
        self.room.admit_guest(self.guest)
        self.room.admit_guest(self.rich_guest)
        self.room.admit_guest(self.guest)
        self.assertEqual(2, len(self.room.guest_list)) 

    def test_remove_guest_from_guest_list(self):
        self.room.remove_guest(self.guest)
        self.assertEqual(0, len(self.room.guest_list))

    def test_guest_can_be_admitted_when_room_empty(self):
        self.room.admit_guest(self.guest)
        self.assertEqual(1, len(self.room.guest_list))

    def test_money_can_be_added_to_till(self):
        self.room.add_money_to_till(self.room.entry_fee)
        self.assertEqual(105.00, self.room.till)

    def test_get_guest_fav_song(self):
        self.assertEqual("I Will Survive", self.room.get_guest_favourite_song(self.guest))
        
    def test_add_favourite_song_to_playlist(self):
        fav_song = self.room.get_guest_favourite_song(self.guest)
        self.room.add_favourite_song_to_playlist(self.guest, self.songs)
        self.assertEqual(1, len(self.room.playlist))

    # def test_remove_song_from_playlist(self):
    #     self.room.add_favourite_song_to_playlist(self.guest, self.songs)
    #     self.room.remove_guest_song_from_playlist(self.guest)
    #     self.assertEqual(0, len(self.room.playlist))

    def test_play_song_from_playlist(self):
        self.room.add_favourite_song_to_playlist(self.guest, self.songs)
        song = self.songs["I Will Survive"]
        self.assertEqual(song, self.room.play_song_from_playlist() )