Anna Schumaker
4ce571ebf8
The TrackidModel takes a TrackidSet and presents it as a Gio.ListModel that maps trackids into Track objects. Tracks can be found by value using the bisect() function, which sorts the trackids by number by default (this can be changed by overriding the do_get_sort_key() function). Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
193 lines
8.0 KiB
Python
193 lines
8.0 KiB
Python
# Copyright 2023 (c) Anna Schumaker.
|
|
"""Tests our TrackidModel."""
|
|
import pathlib
|
|
import unittest.mock
|
|
import tests.util
|
|
import emmental.playlist.model
|
|
from gi.repository import Gio
|
|
|
|
|
|
class TestTrackidModel(tests.util.TestCase):
|
|
"""Tests the Trackid Model."""
|
|
|
|
def setUp(self):
|
|
"""Set up common variables."""
|
|
super().setUp()
|
|
self.db_plist = self.sql.playlists.create("Test Playlist")
|
|
self.model = emmental.playlist.model.TrackidModel(self.sql)
|
|
|
|
self.library = self.sql.libraries.create(pathlib.Path("/a/b"))
|
|
self.album = self.sql.albums.create("Test Album", "Artist", "2023")
|
|
self.medium = self.sql.media.create(self.album, "", number=1)
|
|
self.year = self.sql.years.create(2023)
|
|
|
|
self.track1 = self.sql.tracks.create(self.library,
|
|
pathlib.Path("/a/b/1.ogg"),
|
|
self.medium, self.year, number=1)
|
|
self.track2 = self.sql.tracks.create(self.library,
|
|
pathlib.Path("/a/b/2.ogg"),
|
|
self.medium, self.year, number=2)
|
|
|
|
def test_init(self):
|
|
"""Test that the TrackidModel was set up correctly."""
|
|
self.assertIsInstance(self.model, Gio.ListModel)
|
|
self.assertEqual(self.model.sql, self.sql)
|
|
self.assertIsNone(self.model._TrackidModel__trackid_set)
|
|
|
|
def test_bisect(self):
|
|
"""Test the TrackidModel bisect() function."""
|
|
self.assertTupleEqual(self.model.bisect(self.track1.trackid),
|
|
(False, 0))
|
|
|
|
self.model.trackid_set = self.db_plist.tracks
|
|
self.db_plist.add_track(self.track1)
|
|
self.assertTupleEqual(self.model.bisect(self.track1.trackid),
|
|
(True, 0))
|
|
self.assertTupleEqual(self.model.bisect(self.track2.trackid),
|
|
(False, 1))
|
|
|
|
self.db_plist.add_track(self.track2)
|
|
self.assertTupleEqual(self.model.bisect(self.track2.trackid),
|
|
(True, 1))
|
|
|
|
def test_get_item_type(self):
|
|
"""Test the Gio.ListModel:get_item_type() function."""
|
|
self.assertEqual(self.model.get_item_type(),
|
|
emmental.db.tracks.Track.__gtype__)
|
|
|
|
def test_get_n_items(self):
|
|
"""Test the Gio.ListModel:get_n_items() function."""
|
|
self.model.trackid_set = self.db_plist.tracks
|
|
self.assertEqual(self.model.get_n_items(), 0)
|
|
self.db_plist.add_track(self.track1)
|
|
self.assertEqual(self.model.get_n_items(), 1)
|
|
self.db_plist.add_track(self.track2)
|
|
self.assertEqual(self.model.get_n_items(), 2)
|
|
|
|
def test_get_item(self):
|
|
"""Test the Gio.ListModel:get_item() function."""
|
|
self.assertIsNone(self.model.get_item(0))
|
|
|
|
self.model.trackid_set = self.db_plist.tracks
|
|
self.db_plist.add_track(self.track1)
|
|
self.db_plist.add_track(self.track2)
|
|
|
|
self.assertEqual(self.model.get_item(0), self.track1)
|
|
self.assertEqual(self.model.get_item(1), self.track2)
|
|
self.assertIsNone(self.model.get_item(2))
|
|
|
|
def test_index(self):
|
|
"""Test finding the index of a specific trackid."""
|
|
self.assertIsNone(self.model.index(self.track1.trackid))
|
|
|
|
self.model.trackid_set = self.db_plist.tracks
|
|
self.db_plist.add_track(self.track1)
|
|
self.db_plist.add_track(self.track2)
|
|
|
|
self.assertEqual(self.model.index(self.track1.trackid), 0)
|
|
self.assertEqual(self.model.index(self.track2.trackid), 1)
|
|
self.assertIsNone(self.model.index(self.track2.trackid + 1))
|
|
|
|
def test_trackid_added(self):
|
|
"""Test that the TrackidModel responds to the trackid-added signal."""
|
|
items_changed = unittest.mock.Mock()
|
|
self.model.connect("items-changed", items_changed)
|
|
|
|
self.model.trackid_set = self.db_plist.tracks
|
|
self.assertListEqual(self.model.trackids, [])
|
|
self.assertEqual(self.model.n_tracks, 0)
|
|
|
|
self.db_plist.add_track(self.track2)
|
|
self.assertListEqual(self.model.trackids, [self.track2.trackid])
|
|
self.assertEqual(self.model.n_tracks, 1)
|
|
items_changed.assert_called_with(self.model, 0, 0, 1)
|
|
|
|
self.db_plist.add_track(self.track1)
|
|
self.assertListEqual(self.model.trackids,
|
|
[self.track1.trackid, self.track2.trackid])
|
|
self.assertEqual(self.model.n_tracks, 2)
|
|
items_changed.assert_called_with(self.model, 0, 0, 1)
|
|
|
|
self.model.trackid_set = None
|
|
self.db_plist.tracks.trackids.clear()
|
|
items_changed.reset_mock()
|
|
|
|
self.db_plist.tracks.add_track(self.track1)
|
|
self.assertListEqual(self.model.trackids, [])
|
|
self.assertEqual(self.model.n_tracks, 0)
|
|
items_changed.assert_not_called()
|
|
|
|
def test_trackid_removed(self):
|
|
"""Test that the TrackModel responds to the trackid-removed signal."""
|
|
items_changed = unittest.mock.Mock()
|
|
self.model.connect("items-changed", items_changed)
|
|
|
|
self.db_plist.tracks.trackids = {self.track1.trackid,
|
|
self.track2.trackid}
|
|
self.model.trackid_set = self.db_plist.tracks
|
|
|
|
self.db_plist.remove_track(self.track2)
|
|
self.assertListEqual(self.model.trackids, [self.track1.trackid])
|
|
self.assertEqual(self.model.n_tracks, 1)
|
|
items_changed.assert_called_with(self.model, 1, 1, 0)
|
|
|
|
self.db_plist.remove_track(self.track1)
|
|
self.assertListEqual(self.model.trackids, [])
|
|
self.assertEqual(self.model.n_tracks, 0)
|
|
items_changed.assert_called_with(self.model, 0, 1, 0)
|
|
|
|
self.model.trackid_set = None
|
|
self.model.trackids = [self.track1.trackid]
|
|
self.db_plist.tracks.trackids = {self.track1.trackid}
|
|
items_changed.reset_mock()
|
|
|
|
self.db_plist.tracks.remove_track(self.track1)
|
|
self.assertListEqual(self.model.trackids, [self.track1.trackid])
|
|
self.assertEqual(self.model.n_tracks, 0)
|
|
items_changed.assert_not_called()
|
|
|
|
def test_trackids_reset(self):
|
|
"""Test that the TrackModel responds to the trackids-reset signal."""
|
|
items_changed = unittest.mock.Mock()
|
|
self.model.connect("items-changed", items_changed)
|
|
|
|
self.model.trackid_set = self.db_plist.tracks
|
|
self.db_plist.tracks.trackids = {self.track1.trackid,
|
|
self.track2.trackid}
|
|
self.assertListEqual(self.model.trackids, [self.track1.trackid,
|
|
self.track2.trackid])
|
|
self.assertEqual(self.model.n_tracks, 2)
|
|
items_changed.assert_called_with(self.model, 0, 0, 2)
|
|
|
|
self.model.trackid_set = None
|
|
self.db_plist.tracks.trackids.clear()
|
|
items_changed.reset_mock()
|
|
|
|
self.db_plist.tracks.trackids = {self.track1.trackid,
|
|
self.track2.trackid}
|
|
self.assertListEqual(self.model.trackids, [])
|
|
items_changed.assert_not_called()
|
|
|
|
def test_trackid_set(self):
|
|
"""Test the trackid-set property."""
|
|
items_changed = unittest.mock.Mock()
|
|
self.model.connect("items-changed", items_changed)
|
|
|
|
self.assertIsNone(self.model.trackid_set)
|
|
self.db_plist.tracks.trackids = {self.track1.trackid,
|
|
self.track2.trackid}
|
|
|
|
self.model.trackid_set = self.db_plist.tracks
|
|
self.assertEqual(self.model._TrackidModel__trackid_set,
|
|
self.db_plist.tracks)
|
|
self.assertEqual(self.model.trackid_set, self.db_plist.tracks)
|
|
self.assertEqual(self.model.trackids, [self.track1.trackid,
|
|
self.track2.trackid])
|
|
self.assertEqual(self.model.n_tracks, 2)
|
|
items_changed.assert_called_with(self.model, 0, 0, 2)
|
|
|
|
self.model.trackid_set = None
|
|
self.assertEqual(self.model.trackids, [])
|
|
self.assertEqual(self.model.n_tracks, 0)
|
|
items_changed.assert_called_with(self.model, 0, 2, 0)
|