/* This file is part of Subsonic. Subsonic is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Subsonic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Subsonic. If not, see <http://www.gnu.org/licenses/>. Copyright 2009 (C) Sindre Mehus */ package net.sourceforge.subsonic.domain; import java.io.File; import java.io.IOException; import junit.framework.TestCase; import net.sourceforge.subsonic.domain.Playlist.SortOrder; import net.sourceforge.subsonic.domain.Playlist.Status; /** * Unit test of {@link Playlist}. * * @author Sindre Mehus */ public class PlaylistTestCase extends TestCase { public void testEmpty() { Playlist playlist = new Playlist(); assertEquals(0, playlist.size()); assertTrue(playlist.isEmpty()); assertEquals(0, playlist.getFiles().size()); assertNull(playlist.getCurrentFile()); } public void testStatus() throws Exception { Playlist playlist = new Playlist(); assertEquals(Status.PLAYING, playlist.getStatus()); playlist.setStatus(Status.STOPPED); assertEquals(Status.STOPPED, playlist.getStatus()); playlist.addFiles(true, new TestMediaFile()); assertEquals(Status.PLAYING, playlist.getStatus()); playlist.clear(); assertEquals(Status.PLAYING, playlist.getStatus()); } public void testMoveUp() throws Exception { Playlist playlist = createPlaylist(0, "A", "B", "C", "D"); playlist.moveUp(0); assertPlaylistEquals(playlist, 0, "A", "B", "C", "D"); playlist = createPlaylist(0, "A", "B", "C", "D"); playlist.moveUp(9999); assertPlaylistEquals(playlist, 0, "A", "B", "C", "D"); playlist = createPlaylist(1, "A", "B", "C", "D"); playlist.moveUp(1); assertPlaylistEquals(playlist, 0, "B", "A", "C", "D"); playlist = createPlaylist(3, "A", "B", "C", "D"); playlist.moveUp(3); assertPlaylistEquals(playlist, 2, "A", "B", "D", "C"); } public void testMoveDown() throws Exception { Playlist playlist = createPlaylist(0, "A", "B", "C", "D"); playlist.moveDown(0); assertPlaylistEquals(playlist, 1, "B", "A", "C", "D"); playlist = createPlaylist(0, "A", "B", "C", "D"); playlist.moveDown(9999); assertPlaylistEquals(playlist, 0, "A", "B", "C", "D"); playlist = createPlaylist(1, "A", "B", "C", "D"); playlist.moveDown(1); assertPlaylistEquals(playlist, 2, "A", "C", "B", "D"); playlist = createPlaylist(3, "A", "B", "C", "D"); playlist.moveDown(3); assertPlaylistEquals(playlist, 3, "A", "B", "C", "D"); } public void testRemove() throws Exception { Playlist playlist = createPlaylist(0, "A", "B", "C", "D"); playlist.removeFileAt(0); assertPlaylistEquals(playlist, 0, "B", "C", "D"); playlist = createPlaylist(1, "A", "B", "C", "D"); playlist.removeFileAt(0); assertPlaylistEquals(playlist, 0, "B", "C", "D"); playlist = createPlaylist(0, "A", "B", "C", "D"); playlist.removeFileAt(3); assertPlaylistEquals(playlist, 0, "A", "B", "C"); playlist = createPlaylist(1, "A", "B", "C", "D"); playlist.removeFileAt(1); assertPlaylistEquals(playlist, 1, "A", "C", "D"); playlist = createPlaylist(3, "A", "B", "C", "D"); playlist.removeFileAt(3); assertPlaylistEquals(playlist, 2, "A", "B", "C"); playlist = createPlaylist(0, "A"); playlist.removeFileAt(0); assertPlaylistEquals(playlist, -1); } public void testNext() throws Exception { Playlist playlist = createPlaylist(0, "A", "B", "C"); assertFalse(playlist.isRepeatEnabled()); playlist.next(); assertPlaylistEquals(playlist, 1, "A", "B", "C"); playlist.next(); assertPlaylistEquals(playlist, 2, "A", "B", "C"); playlist.next(); assertPlaylistEquals(playlist, -1, "A", "B", "C"); playlist = createPlaylist(0, "A", "B", "C"); playlist.setRepeatEnabled(true); assertTrue(playlist.isRepeatEnabled()); playlist.next(); assertPlaylistEquals(playlist, 1, "A", "B", "C"); playlist.next(); assertPlaylistEquals(playlist, 2, "A", "B", "C"); playlist.next(); assertPlaylistEquals(playlist, 0, "A", "B", "C"); } public void testPlayAfterEndReached() throws Exception { Playlist playlist = createPlaylist(2, "A", "B", "C"); playlist.setStatus(Status.PLAYING); playlist.next(); assertNull(playlist.getCurrentFile()); assertEquals(Status.STOPPED, playlist.getStatus()); playlist.setStatus(Status.PLAYING); assertEquals(Status.PLAYING, playlist.getStatus()); assertEquals(0, playlist.getIndex()); assertEquals("A", playlist.getCurrentFile().getName()); } public void testAppend() throws Exception { Playlist playlist = createPlaylist(1, "A", "B", "C"); playlist.addFiles(true, new TestMediaFile("D")); assertPlaylistEquals(playlist, 1, "A", "B", "C", "D"); playlist.addFiles(false, new TestMediaFile("E")); assertPlaylistEquals(playlist, 0, "E"); } public void testUndo() throws Exception { Playlist playlist = createPlaylist(0, "A", "B", "C"); playlist.setIndex(2); playlist.undo(); assertPlaylistEquals(playlist, 0, "A", "B", "C"); playlist.removeFileAt(2); playlist.undo(); assertPlaylistEquals(playlist, 0, "A", "B", "C"); playlist.clear(); playlist.undo(); assertPlaylistEquals(playlist, 0, "A", "B", "C"); playlist.addFiles(true, new TestMediaFile()); playlist.undo(); assertPlaylistEquals(playlist, 0, "A", "B", "C"); playlist.moveDown(1); playlist.undo(); assertPlaylistEquals(playlist, 0, "A", "B", "C"); playlist.moveUp(1); playlist.undo(); assertPlaylistEquals(playlist, 0, "A", "B", "C"); } public void testOrder() throws IOException { Playlist playlist = new Playlist(); playlist.addFiles(true, new TestMediaFile(2, "Artist A", "Album B")); playlist.addFiles(true, new TestMediaFile(1, "Artist C", "Album C")); playlist.addFiles(true, new TestMediaFile(3, "Artist B", "Album A")); playlist.addFiles(true, new TestMediaFile(null, "Artist D", "Album D")); playlist.setIndex(2); assertEquals("Error in sort.", new Integer(3), playlist.getCurrentFile().getTrackNumber()); // Order by track. playlist.sort(SortOrder.TRACK); assertEquals("Error in sort().", null, playlist.getFile(0).getTrackNumber()); assertEquals("Error in sort().", new Integer(1), playlist.getFile(1).getTrackNumber()); assertEquals("Error in sort().", new Integer(2), playlist.getFile(2).getTrackNumber()); assertEquals("Error in sort().", new Integer(3), playlist.getFile(3).getTrackNumber()); assertEquals("Error in sort().", new Integer(3), playlist.getCurrentFile().getTrackNumber()); // Order by artist. playlist.sort(SortOrder.ARTIST); assertEquals("Error in sort().", "Artist A", playlist.getFile(0).getArtist()); assertEquals("Error in sort().", "Artist B", playlist.getFile(1).getArtist()); assertEquals("Error in sort().", "Artist C", playlist.getFile(2).getArtist()); assertEquals("Error in sort().", "Artist D", playlist.getFile(3).getArtist()); assertEquals("Error in sort().", new Integer(3), playlist.getCurrentFile().getTrackNumber()); // Order by album. playlist.sort(SortOrder.ALBUM); assertEquals("Error in sort().", "Album A", playlist.getFile(0).getAlbumName()); assertEquals("Error in sort().", "Album B", playlist.getFile(1).getAlbumName()); assertEquals("Error in sort().", "Album C", playlist.getFile(2).getAlbumName()); assertEquals("Error in sort().", "Album D", playlist.getFile(3).getAlbumName()); assertEquals("Error in sort().", new Integer(3), playlist.getCurrentFile().getTrackNumber()); } private void assertPlaylistEquals(Playlist playlist, int index, String... songs) { assertEquals(songs.length, playlist.size()); for (int i = 0; i < songs.length; i++) { assertEquals(songs[i], playlist.getFiles().get(i).getName()); } if (index == -1) { assertNull(playlist.getCurrentFile()); } else { assertEquals(songs[index], playlist.getCurrentFile().getName()); } } private Playlist createPlaylist(int index, String... songs) throws Exception { Playlist playlist = new Playlist(); for (String song : songs) { playlist.addFiles(true, new TestMediaFile(song)); } playlist.setIndex(index); return playlist; } private static class TestMediaFile extends MediaFile { private String name; private Integer track; private String album; private String artist; TestMediaFile() { } TestMediaFile(String name) { this.name = name; } TestMediaFile(Integer track, String artist, String album) { this.track = track; this.album = album; this.artist = artist; } @Override public String getName() { return name; } @Override public boolean isFile() { return true; } @Override public Integer getTrackNumber() { return track; } @Override public String getArtist() { return artist; } @Override public String getAlbumName() { return album; } @Override public File getFile() { return new File(name); } @Override public boolean exists() { return true; } @Override public boolean isDirectory() { return false; } @Override public boolean equals(Object o) { return this == o; } } }