# 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)