class SongTest(unittest.TestCase):
    def setUp(self):
        self.my_song = Song("Solder Of Frortune", "Deep Purple",
                            "Stormbringer", "3:14")
        self.second_song = Song("I Stand Alone", "Godsmack", "Awake", "4:30")

    def test_song_constructor(self):
        self.assertTrue(isinstance(self.my_song, Song))
        self.assertEqual(self.my_song.title(), "Solder Of Frortune")
        self.assertEqual(self.my_song.artist(), "Deep Purple")
        self.assertEqual(self.my_song.album(), "Stormbringer")
        self.assertEqual(self.my_song.length(), "3:14")

    def test_time_error(self):
        with self.assertRaises(ValueError):
            other_song = Song("Knocking on your back door", "Deep Purple",
                              "IDK", "3:65")
        with self.assertRaises(ValueError):
            other_song = Song("Knocking on your back door", "Deep Purple",
                              "IDK", "63:45")
        with self.assertRaises(ValueError):
            other_song = Song("Knocking on your back door", "Deep Purple",
                              "IDK", "45:63")
        with self.assertRaises(ValueError):
            other_song = Song("Knocking on your back door", "Deep Purple",
                              "IDK", "1:63:45")
        with self.assertRaises(ValueError):
            other_song = Song("Knocking on your back door", "Deep Purple",
                              "IDK", "1:43:65")
        with self.assertRaises(ValueError):
            other_song = Song("Knocking on your back door", "Deep Purple",
                              "IDK", "1:4:253")
        with self.assertRaises(ValueError):
            other_song = Song("Knocking on your back door", "Deep Purple",
                              "IDK", "1:433:15")

    def test_str_cast(self):
        self.assertEqual(
            str(self.my_song),
            "Solder Of Frortune - Deep Purple from Stormbringer - 3:14")

    def test_eq(self):
        self.assertTrue(self.my_song != self.second_song)
        self.assertTrue(self.my_song == self.my_song)

    def test_hash_cast(self):
        self.assertIsNotNone(hash(self.my_song))

    def test_duration(self):
        self.assertEqual(self.my_song.duration(seconds=True), 194)
        self.assertEqual(self.my_song.duration(minutes=True), 3)
        self.assertEqual(self.my_song.duration(hours=True), 0)
        self.assertEqual(self.my_song.duration(), "3:14")