246 lines
9.7 KiB
Python
246 lines
9.7 KiB
Python
# Copyright 2021 (c) Anna Schumaker.
|
|
import db
|
|
import random
|
|
import unittest
|
|
from gi.repository import GObject
|
|
from . import playlist
|
|
|
|
class TestRow:
|
|
def __init__(self): pass
|
|
def keys(self): return [ "testid", "plstateid" ]
|
|
def __getitem__(self, key):
|
|
if key == "testid" or key == 0: return 1
|
|
return 10
|
|
|
|
class TestPlaylist(unittest.TestCase):
|
|
def setUp(self): db.reset()
|
|
|
|
def on_refresh(self, plist): self.refreshed = True
|
|
|
|
def test_init(self):
|
|
db.reset()
|
|
plist = playlist.Playlist(TestRow(), "missing-icon")
|
|
|
|
self.assertIsInstance(plist, GObject.GObject)
|
|
self.assertFalse(plist.has_children())
|
|
self.assertFalse(plist.can_add_remove_tracks())
|
|
|
|
self.assertEqual(plist._rowid, 1)
|
|
self.assertEqual(plist._rowkey, "testid")
|
|
self.assertEqual(plist._icon_name, "missing-icon")
|
|
|
|
self.assertEqual(plist.get_property("rowid"), 1)
|
|
self.assertEqual(plist.get_property("rowkey"), "testid")
|
|
self.assertEqual(plist.get_property("icon-name"), "missing-icon")
|
|
|
|
self.assertIsNone(plist._plstate)
|
|
self.assertIsNone(plist.get_property("plist_state"))
|
|
|
|
with self.assertRaises(NotImplementedError):
|
|
plist.get_property("name")
|
|
with self.assertRaises(NotImplementedError):
|
|
plist.delete()
|
|
|
|
def test_add_track(self):
|
|
plist = db.user.Table.find("Test Playlist")
|
|
track1 = db.make_fake_track(1, 1, "Track 1", "/a/b/c/1.ogg")
|
|
track2 = db.make_fake_track(2, 2, "Track 2", "/a/b/c/2.ogg")
|
|
track3 = db.make_fake_track(3, 3, "Track 3", "/a/b/c/3.ogg")
|
|
plist.sort = [ "tracks.number ASC" ]
|
|
|
|
plist.add_track(track2)
|
|
self.assertEqual(plist.get_track(0), track2)
|
|
self.assertEqual(plist.current, -1)
|
|
self.assertFalse(plist.track_adjusts_current(track2))
|
|
|
|
plist.current = 0
|
|
self.assertTrue(plist.track_adjusts_current(track2))
|
|
|
|
plist.add_track(track1)
|
|
self.assertEqual(plist.get_track(0), track1)
|
|
self.assertEqual(plist.get_track(1), track2)
|
|
self.assertEqual(plist.current, 1)
|
|
|
|
plist.add_track(track3)
|
|
self.assertEqual(plist.get_track(0), track1)
|
|
self.assertEqual(plist.get_track(1), track2)
|
|
self.assertEqual(plist.get_track(2), track3)
|
|
self.assertEqual(plist.current, 1)
|
|
|
|
def test_remove_track(self):
|
|
plist = db.user.Table.find("Test Playlist")
|
|
track1 = db.make_fake_track(1, 1, "Track 1", "/a/b/c/1.ogg")
|
|
track2 = db.make_fake_track(2, 2, "Track 2", "/a/b/c/2.ogg")
|
|
track3 = db.make_fake_track(3, 3, "Track 3", "/a/b/c/3.ogg")
|
|
plist.sort = [ "tracks.number ASC" ]
|
|
|
|
plist.add_track(track1)
|
|
plist.add_track(track2)
|
|
plist.add_track(track3)
|
|
plist.current = 1
|
|
|
|
self.assertTrue(plist.track_adjusts_current(track1))
|
|
self.assertTrue(plist.track_adjusts_current(track2))
|
|
self.assertFalse(plist.track_adjusts_current(track3))
|
|
|
|
plist.remove_track(track3)
|
|
self.assertEqual(plist.current, 1)
|
|
plist.remove_track(track1)
|
|
self.assertEqual(plist.current, 0)
|
|
plist.remove_track(track2)
|
|
self.assertEqual(plist.current, -1)
|
|
|
|
def test_current(self):
|
|
plist = db.user.Table.find("Test Playlist")
|
|
self.assertEqual(plist.get_property("current"), -1)
|
|
self.assertIsNone(plist.get_current_track())
|
|
plist.set_property("current", 1)
|
|
self.assertEqual(plist.get_property("current"), -1)
|
|
|
|
plist.add_track(db.make_fake_track(1, 1, "Track 1", "/a/b/c/1.ogg"))
|
|
plist.add_track(db.make_fake_track(2, 2, "Track 2", "/a/b/c/2.ogg"))
|
|
|
|
plist.set_property("current", 0)
|
|
self.assertEqual(plist.get_property("current"), 0)
|
|
self.assertEqual(plist.get_current_track(), plist.get_track(0))
|
|
|
|
plist.set_property("current", 1)
|
|
self.assertEqual(plist.get_property("current"), 1)
|
|
self.assertEqual(plist.get_current_track(), plist.get_track(1))
|
|
|
|
plist.set_property("current", 2)
|
|
self.assertEqual(plist.get_property("current"), 2)
|
|
self.assertIsNone(plist.get_current_track())
|
|
|
|
plist.set_property("current", 3)
|
|
self.assertEqual(plist.get_property("current"), 2)
|
|
self.assertIsNone(plist.get_current_track())
|
|
|
|
def test_loop(self):
|
|
plist = db.user.Table.find("Test Playlist")
|
|
self.assertFalse(plist.get_property("loop"))
|
|
plist.set_property("loop", True)
|
|
self.assertTrue(plist.get_property("loop"))
|
|
self.assertTrue(plist.plist_state.get_property("loop"))
|
|
|
|
plist.set_property("current", 0)
|
|
self.assertEqual(plist.get_property("current"), -1)
|
|
|
|
plist.add_track(db.make_fake_track(1, 1, "Track 1", "/a/b/c/1.ogg"))
|
|
plist.add_track(db.make_fake_track(2, 2, "Track 2", "/a/b/c/2.ogg"))
|
|
|
|
plist.set_property("current", 0)
|
|
self.assertEqual(plist.get_current_track(), plist.get_track(0))
|
|
plist.set_property("current", 1)
|
|
self.assertEqual(plist.get_current_track(), plist.get_track(1))
|
|
plist.set_property("current", 2)
|
|
self.assertEqual(plist.get_property("current"), 0)
|
|
self.assertEqual(plist.get_current_track(), plist.get_track(0))
|
|
|
|
def test_random(self):
|
|
plist = db.user.Table.find("Test Playlist")
|
|
self.assertFalse(plist.get_property("random"))
|
|
plist.set_property("random", True)
|
|
self.assertTrue(plist.get_property("random"))
|
|
self.assertTrue(plist.plist_state.get_property("random"))
|
|
|
|
plist.set_property("current", 0)
|
|
self.assertEqual(plist.get_property("current"), -1)
|
|
|
|
plist.add_track(db.make_fake_track(1, 1, "Track 1", "/a/b/c/1.ogg"))
|
|
plist.add_track(db.make_fake_track(2, 2, "Track 2", "/a/b/c/2.ogg"))
|
|
|
|
plist.set_property("current", 0)
|
|
self.assertEqual(plist.get_current_track(), plist.get_track(0))
|
|
plist.set_property("current", 5)
|
|
self.assertEqual(plist.get_property("current"), 1)
|
|
self.assertEqual(plist.get_current_track(), plist.get_track(1))
|
|
|
|
def test_sort(self):
|
|
plist = db.user.Table.find("Test Playlist")
|
|
plist.connect("refreshed", self.on_refresh)
|
|
self.assertEqual(plist.get_property("sort"), plist.plist_state.sort)
|
|
|
|
plist.set_property("sort", [ "tracks.number ASC" ])
|
|
self.assertEqual(plist.get_property("sort"),
|
|
[ "tracks.number ASC", "tracks.trackid ASC" ])
|
|
self.assertEqual(plist.plist_state.get_property("sort"),
|
|
[ "tracks.number ASC", "tracks.trackid ASC" ])
|
|
self.assertEqual(plist.get_property("current"), -1)
|
|
self.assertTrue(self.refreshed)
|
|
|
|
plist.add_track(db.make_fake_track(1, 1, "Track 1", "/a/b/c/1.ogg"))
|
|
plist.add_track(db.make_fake_track(2, 2, "Track 2", "/a/b/c/2.ogg"))
|
|
|
|
plist.set_property("sort", [ "tracks.number DESC" ])
|
|
self.assertEqual(plist.get_property("sort"),
|
|
[ "tracks.number DESC", "tracks.trackid ASC" ])
|
|
self.assertEqual(plist.get_property("current"), -1)
|
|
|
|
plist.set_property("current", 0)
|
|
self.assertEqual(plist.get_current_track().number, 2)
|
|
plist.set_property("sort", [ "tracks.number ASC" ])
|
|
self.assertEqual(plist.get_property("current"), 1)
|
|
|
|
def test_passthrough_plstateid(self):
|
|
plist = db.user.Table.find("Test Playlist")
|
|
self.assertEqual(plist.plstateid, plist.plist_state.rowid)
|
|
|
|
def test_next_track(self):
|
|
plist = db.user.Table.find("Test Playlist")
|
|
self.assertIsNone(plist.next_track())
|
|
self.assertEqual(plist.get_property("current"), -1)
|
|
|
|
plist.add_track(db.make_fake_track(1, 1, "Track 1", "/a/b/c/1.ogg"))
|
|
plist.add_track(db.make_fake_track(2, 2, "Track 2", "/a/b/c/2.ogg"))
|
|
self.assertEqual(plist.next_track(), plist.get_track(0))
|
|
self.assertEqual(plist.next_track(), plist.get_track(1))
|
|
self.assertIsNone(plist.next_track())
|
|
self.assertIsNone(plist.next_track())
|
|
|
|
def test_random_next_track(self):
|
|
plist = db.user.Table.find("Test Playlist")
|
|
plist.random = True
|
|
self.assertIsNone(plist.next_track())
|
|
self.assertEqual(plist.get_property("current"), -1)
|
|
|
|
plist.add_track(db.make_fake_track(1, 1, "Track 1", "/a/b/c/1.ogg"))
|
|
self.assertEqual(plist.next_track(), plist.get_track(0))
|
|
self.assertEqual(plist.get_property("current"), 0)
|
|
|
|
plist.add_track(db.make_fake_track(2, 2, "Track 2", "/a/b/c/2.ogg"))
|
|
plist.add_track(db.make_fake_track(3, 3, "Track 3", "/a/b/c/3.ogg"))
|
|
|
|
random.seed(20210318)
|
|
plist.current = -1
|
|
self.assertEqual(plist.next_track(), plist.get_track(1))
|
|
self.assertEqual(plist.next_track(), plist.get_track(2))
|
|
self.assertEqual(plist.next_track(), plist.get_track(0))
|
|
self.assertEqual(plist.next_track(), plist.get_track(2))
|
|
|
|
|
|
class TestMappedPlaylist(unittest.TestCase):
|
|
def test_init(self):
|
|
mapped = playlist.MappedPlaylist(TestRow(), "missing-icon", "test_map")
|
|
|
|
self.assertIsInstance(mapped, playlist.Playlist)
|
|
self.assertEqual(mapped._map_table, "test_map")
|
|
self.assertEqual(mapped.get_property("map-table"), "test_map")
|
|
|
|
|
|
class TestParentPlaylist(unittest.TestCase):
|
|
def test_init(self):
|
|
parent = playlist.ParentPlaylist(TestRow(), "missing-icon")
|
|
|
|
self.assertIsInstance(parent, playlist.Playlist)
|
|
self.assertTrue(parent.has_children())
|
|
|
|
with self.assertRaises(NotImplementedError):
|
|
parent.get_child_table()
|
|
with self.assertRaises(NotImplementedError):
|
|
parent.get_n_children()
|
|
with self.assertRaises(NotImplementedError):
|
|
parent.get_child(0)
|
|
with self.assertRaises(NotImplementedError):
|
|
parent.get_child_index(0)
|