111 lines
4.0 KiB
Python
111 lines
4.0 KiB
Python
# Copyright 2021 (c) Anna Schumaker.
|
|
from lib import publisher
|
|
from . import allocator
|
|
import pathlib
|
|
import threading
|
|
import unittest
|
|
|
|
test_tracks = pathlib.Path("./data/Test Album")
|
|
|
|
class FakeLibrary:
|
|
def __init__(self):
|
|
self.name = test_tracks
|
|
|
|
class TestTrackAllocator(unittest.TestCase):
|
|
def setUp(self):
|
|
self.lib = FakeLibrary()
|
|
self.added = None
|
|
self.removed = None
|
|
self.updated = None
|
|
|
|
def on_track_added(self, track):
|
|
self.added = track
|
|
|
|
def on_track_removed(self, track):
|
|
self.removed = track
|
|
|
|
def on_track_updated(self, track):
|
|
self.updated = track
|
|
|
|
def test_allocator_init(self):
|
|
alloc = allocator.TrackAllocator()
|
|
self.assertEqual(alloc.tracks, { })
|
|
self.assertEqual(alloc.nextid, 0)
|
|
self.assertIsInstance(alloc.lock, type(threading.Lock()))
|
|
self.assertIsInstance(alloc.Added, publisher.Publisher)
|
|
self.assertIsInstance(alloc.Removed, publisher.Publisher)
|
|
self.assertIsInstance(alloc.Updated, publisher.Publisher)
|
|
|
|
def test_allocator(self):
|
|
alloc = allocator.TrackAllocator()
|
|
alloc.Added.register(self.on_track_added)
|
|
alloc.Removed.register(self.on_track_removed)
|
|
|
|
track = alloc.allocate(self.lib, test_tracks / "01 - Test Track.ogg")
|
|
self.assertEqual(alloc.tracks[0], track)
|
|
self.assertEqual(alloc[0], track)
|
|
self.assertEqual(len(alloc), 1)
|
|
self.assertEqual(alloc.nextid, 1)
|
|
self.assertEqual(track.trackid, 0)
|
|
self.assertEqual(self.added, track)
|
|
|
|
track2 = alloc.allocate(self.lib, test_tracks / "02 - Test {Disc 2}.ogg")
|
|
self.assertEqual(alloc.tracks[1], track2)
|
|
self.assertEqual(alloc[1], track2)
|
|
self.assertEqual(len(alloc), 2)
|
|
|
|
self.assertIsNone(alloc.allocate(self.lib, test_tracks / "No Such File"))
|
|
self.assertEqual(self.added, track2)
|
|
self.assertEqual([ t for t in alloc.list_tracks(self.lib) ], [ track, track2 ])
|
|
track.library = None
|
|
self.assertEqual([ t for t in alloc.list_tracks(self.lib) ], [ track2 ])
|
|
|
|
alloc.remove(track)
|
|
self.assertEqual(alloc[0], None)
|
|
self.assertEqual(alloc.tracks, { 1 : track2 })
|
|
self.assertEqual(alloc.nextid, 2)
|
|
self.assertEqual(self.removed, track)
|
|
|
|
alloc.reset()
|
|
self.assertEqual(alloc.nextid, 0)
|
|
self.assertEqual(alloc.tracks, { })
|
|
self.assertEqual(alloc.Added.subscribers, set())
|
|
self.assertEqual(alloc.Removed.subscribers, set())
|
|
|
|
def test_allocator_autoremove(self):
|
|
alloc = allocator.TrackAllocator()
|
|
alloc.Removed.register(self.on_track_removed)
|
|
|
|
track = alloc.allocate(self.lib, test_tracks / "01 - Test Track.ogg")
|
|
track2 = alloc.allocate(self.lib, test_tracks / "02 - Test {Disc 2}.ogg")
|
|
track2.path = pathlib.Path("No Such File")
|
|
|
|
self.assertEqual(alloc.autoremove(self.lib), [ track2 ])
|
|
self.assertEqual([ t for t in alloc.list_tracks(self.lib) ], [ track ])
|
|
|
|
def test_allocator_played(self):
|
|
alloc = allocator.TrackAllocator()
|
|
alloc.Updated.register(self.on_track_updated)
|
|
track = alloc.allocate(self.lib, test_tracks / "01 - Test Track.ogg")
|
|
|
|
alloc.played(track)
|
|
self.assertEqual(track.playcount, 1)
|
|
self.assertEqual(self.updated, track)
|
|
|
|
def test_allocator_state(self):
|
|
alloc = allocator.TrackAllocator()
|
|
track = alloc.allocate(self.lib, test_tracks / "01 - Test Track.ogg")
|
|
|
|
state = alloc.__getstate__()
|
|
self.assertEqual(state, { "tracks" : { 0 : track },
|
|
"nextid" : 1 })
|
|
|
|
alloc.__dict__.clear()
|
|
alloc.__setstate__(state)
|
|
self.assertEqual(alloc.tracks, { 0 : track })
|
|
self.assertEqual(alloc.nextid, 1)
|
|
self.assertIsInstance(alloc.lock, type(threading.Lock()))
|
|
self.assertIsInstance(alloc.Added, publisher.Publisher)
|
|
self.assertIsInstance(alloc.Removed, publisher.Publisher)
|
|
self.assertIsInstance(alloc.Updated, publisher.Publisher)
|