lib: Give Tags a random next() function

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-07-06 13:14:18 -04:00
parent 935087a040
commit 9fe3867eae
2 changed files with 51 additions and 2 deletions

View File

@ -1,5 +1,6 @@
# Copyright 2021 (c) Anna Schumaker.
from . import publisher
import random
import threading
class Tag:
@ -8,6 +9,7 @@ class Tag:
self.sort = sort.lower() if sort else str(name).lower()
self.current = -1
self.loop = False
self.random = False
self.tracks = [ ]
self.widgets = None
self.lock = threading.Lock()
@ -20,6 +22,7 @@ class Tag:
"sort" : self.sort,
"current" : self.current,
"loop" : self.loop,
"random" : self.random,
"tracks" : [ t.trackid for t in self.tracks ] }
def __len__(self):
@ -38,11 +41,19 @@ class Tag:
return 0
return self.current + 1
def __random_track__(self):
i = 1
length = len(self.tracks)
if len(self.tracks) >= 3:
i = random.randint(1, length - 1)
return (self.current + i) % (1 if length == 0 else length)
def __setstate__(self, state):
self.name = state["name"]
self.sort = state["sort"]
self.current = state["current"]
self.loop = state["loop"]
self.random = state["random"]
self.tracks = state["tracks"]
self.widgets = None
self.lock = threading.Lock()
@ -58,6 +69,7 @@ class Tag:
self.TrackAdded.publish(self, track)
def can_loop(self): return True
def can_random(self): return True
def get_header(self):
return self.sort[0].upper() if len(self.sort) > 0 else ""
@ -72,7 +84,11 @@ class Tag:
def next(self):
with self.lock:
self.current = self.__next_track__()
if self.random == True:
self.current = self.__random_track__()
else:
self.current = self.__next_track__()
if self.current < len(self.tracks):
return self.tracks[self.current]
return None

View File

@ -1,6 +1,7 @@
# Copyright 2021 (c) Anna Schumaker.
from . import publisher
from . import tag
import random
import threading
import unittest
@ -23,7 +24,9 @@ class TestTag(unittest.TestCase):
self.assertEqual(t.current, -1)
self.assertEqual(t.tracks, [ ])
self.assertFalse(t.loop)
self.assertFalse(t.random)
self.assertTrue( t.can_loop())
self.assertTrue( t.can_random())
self.assertIsNone(t.widgets)
self.assertIsInstance(t.lock, type(threading.Lock()))
self.assertIsInstance(t.TrackAdded, publisher.Publisher)
@ -63,12 +66,13 @@ class TestTag(unittest.TestCase):
state = t.__getstate__()
self.assertEqual(set(state.keys()),
set([ "name", "sort", "current", "loop", "tracks" ]))
set([ "name", "sort", "current", "loop", "random", "tracks" ]))
self.assertEqual(state["name"], "test")
self.assertEqual(state["sort"], "test")
self.assertEqual(state["current"], -1)
self.assertEqual(state["tracks"], [ 0, 1, 2, 3, 4 ])
self.assertFalse(state["loop"])
self.assertFalse(state["random"])
state["sort"] = "sort"
state["current"] = 42
@ -81,6 +85,7 @@ class TestTag(unittest.TestCase):
self.assertEqual(t.tracks, [ 0, 1, 2, 3, 4 ])
self.assertEqual(t.widgets, None)
self.assertFalse(t.loop)
self.assertFalse(t.random)
self.assertIsInstance(t.lock, type(threading.Lock()))
self.assertIsInstance(t.TrackAdded, publisher.Publisher)
self.assertIsInstance(t.TrackRemoved, publisher.Publisher)
@ -134,6 +139,34 @@ class TestTag(unittest.TestCase):
self.assertEqual(t.next(), 1)
self.assertEqual(t.current, 0)
def test_tag_random_next(self):
t = tag.Tag("test")
t.tracks = [ 0, 1, 2, 3, 4, 5 ]
t.random = True
# Expected randint(): 5, 3, 2, 5, 5, 5
random.seed(20210318)
self.assertEqual(t.next(), 4) # -1 + 5
self.assertEqual(t.next(), 1) # (4 + 3) % 6 = 7 % 6
self.assertEqual(t.next(), 3) # 1 + 2
self.assertEqual(t.next(), 2) # (3 + 5) % 6 = 8 % 6
self.assertEqual(t.next(), 1) # (2 + 5) % 6 = 7 % 6
self.assertEqual(t.next(), 0) # (1 + 5) % 6 = 0
t.tracks = [ ]
self.assertIsNone(t.next())
t.tracks = [ 0 ]
self.assertEqual(t.next(), 0)
self.assertEqual(t.next(), 0)
t.tracks = [ 0, 1 ]
t.current = -1
self.assertEqual(t.next(), 0)
self.assertEqual(t.next(), 1)
self.assertEqual(t.next(), 0)
self.assertEqual(t.next(), 1)
class TestSuperTag(unittest.TestCase):
def test_super_tag(self):