from playlist import Playlist

def test_addAndSelectOneSong():
    songAddedByUser = "/path/to/song"
    songSetByCallback = None

    def testCallback(song):
        nonlocal songSetByCallback
        songSetByCallback = song

    uut = Playlist(testCallback)
    uut.addSong(songAddedByUser)
    uut.setCurrentSong(0)

    assert songAddedByUser == songSetByCallback
    assert uut.getCurrentSong() == songAddedByUser
    assert uut.getCurrentSongIndex() == 0
    assert uut.getSongs() == [songAddedByUser]

def test_addTwoSongsAndSelectBoth():
    songAddedByUser = ["/path/to/song", "/path/to/second/song"]
    songSetByCallback = None

    def testCallback(song):
        nonlocal songSetByCallback
        songSetByCallback = song

    uut = Playlist(testCallback)
    uut.addSong(songAddedByUser[0])
    uut.addSong(songAddedByUser[1])
    assert uut.getSongs() == songAddedByUser

    uut.setCurrentSong(0)
    assert songAddedByUser[0] == songSetByCallback
    assert uut.getCurrentSong() == songAddedByUser[0]
    assert uut.getCurrentSongIndex() == 0

    uut.setCurrentSong(1)
    assert songAddedByUser[1] == songSetByCallback
    assert uut.getCurrentSong() == songAddedByUser[1]
    assert uut.getCurrentSongIndex() == 1

def test_firstAddedSongIsNotSelected():
    songAddedByUser = "/path/to/song"
    songSetByCallback = None

    def testCallback(song):
        nonlocal songSetByCallback
        songSetByCallback = song

    uut = Playlist(testCallback)
    uut.addSong(songAddedByUser)

    assert songSetByCallback == None
    assert uut.getCurrentSong() == None
    assert uut.getCurrentSongIndex() == None
    assert uut.getSongs() == [songAddedByUser]

def test_invalidSongSelection():
    songAddedByUser = "/path/to/song"
    songSetByCallback = None

    def testCallback(song):
        nonlocal songSetByCallback
        songSetByCallback = song

    uut = Playlist(testCallback)
    assert songSetByCallback == None
    assert uut.getCurrentSong() == None
    assert uut.getCurrentSongIndex() == None

    uut.setCurrentSong(10)
    assert songSetByCallback == None
    assert uut.getCurrentSong() == None
    assert uut.getCurrentSongIndex() == None

    uut.addSong(songAddedByUser)
    uut.setCurrentSong(10)
    assert songSetByCallback == None
    assert uut.getCurrentSong() == None
    assert uut.getCurrentSongIndex() == None
    assert uut.getSongs() == [songAddedByUser]

def test_clearPlaylist():
    songAddedByUser = ["/path/to/song", "/path/to/second/song"]

    def dummy(index):
        pass

    uut = Playlist(dummy)
    for s in songAddedByUser:
        uut.addSong(s)
    uut.setCurrentSong(0)

    assert uut.getSongs() == songAddedByUser
    assert uut.getCurrentSong() == songAddedByUser[0]
    assert uut.getCurrentSongIndex() == 0

    uut.clear()

    assert uut.getSongs() == []
    assert uut.getCurrentSong() == None
    assert uut.getCurrentSongIndex() == None

def test_nextSong():
    songAddedByUser = ["/path/to/song", "/path/to/second/song"]
    
    uut = Playlist(lambda index: None)
    for s in songAddedByUser:
        uut.addSong(s)
    assert uut.getCurrentSong() == None
    assert uut.getCurrentSongIndex() == None

    uut.nextSong()
    assert uut.getCurrentSong() == songAddedByUser[0]
    assert uut.getCurrentSongIndex() == 0
    
    uut.nextSong()
    assert uut.getCurrentSong() == songAddedByUser[1]
    assert uut.getCurrentSongIndex() == 1

    uut.nextSong()
    assert uut.getCurrentSong() == songAddedByUser[1]
    assert uut.getCurrentSongIndex() == 1

def test_previousSong():
    songAddedByUser = ["/path/to/song", "/path/to/second/song"]
    
    uut = Playlist(lambda index: None)
    for s in songAddedByUser:
        uut.addSong(s)
    assert uut.getCurrentSong() == None
    assert uut.getCurrentSongIndex() == None

    uut.previousSong()
    assert uut.getCurrentSong() == songAddedByUser[0]
    assert uut.getCurrentSongIndex() == 0
    
    uut.previousSong()
    assert uut.getCurrentSong() == songAddedByUser[0]
    assert uut.getCurrentSongIndex() == 0

    uut.setCurrentSong(1)
    assert uut.getCurrentSong() == songAddedByUser[1]
    assert uut.getCurrentSongIndex() == 1
    uut.previousSong()
    assert uut.getCurrentSong() == songAddedByUser[0]
    assert uut.getCurrentSongIndex() == 0