audio: Create a StopWatch object
The StopWatch will be used to calculate how long a track is in the 'playing' state so we can accurately determin if it has been played or not. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
c3818a2b18
commit
db6ae0ecb6
|
@ -0,0 +1,42 @@
|
||||||
|
# Copyright 2024 (c) Anna Schumaker.
|
||||||
|
"""A custom StopWatch object for tracking play time."""
|
||||||
|
import datetime
|
||||||
|
from gi.repository import GObject
|
||||||
|
|
||||||
|
|
||||||
|
class StopWatch(GObject.GObject):
|
||||||
|
"""A StopWatch object."""
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
"""Initialize the StopWatch."""
|
||||||
|
super().__init__()
|
||||||
|
self._saved = None
|
||||||
|
self._started = None
|
||||||
|
|
||||||
|
def elapsed_time(self) -> float:
|
||||||
|
"""Get the elapsed time (in seconds)."""
|
||||||
|
total = datetime.timedelta()
|
||||||
|
if self._saved is not None:
|
||||||
|
total += self._saved
|
||||||
|
if self._started is not None:
|
||||||
|
total += datetime.datetime.now() - self._started
|
||||||
|
return total.total_seconds()
|
||||||
|
|
||||||
|
def reset(self) -> None:
|
||||||
|
"""Reset the StopWatch."""
|
||||||
|
self._saved = None
|
||||||
|
self._started = None
|
||||||
|
|
||||||
|
def start(self) -> None:
|
||||||
|
"""Start the StopWatch."""
|
||||||
|
self._started = datetime.datetime.now()
|
||||||
|
|
||||||
|
def stop(self) -> None:
|
||||||
|
"""Stop the StopWatch."""
|
||||||
|
if self._started is not None:
|
||||||
|
delta = datetime.datetime.now() - self._started
|
||||||
|
if self._saved is None:
|
||||||
|
self._saved = delta
|
||||||
|
else:
|
||||||
|
self._saved += delta
|
||||||
|
self._started = None
|
|
@ -0,0 +1,87 @@
|
||||||
|
# Copyright 2024 (c) Anna Schumaker.
|
||||||
|
"""Tests our StopWatch object."""
|
||||||
|
import datetime
|
||||||
|
import emmental.audio.stopwatch
|
||||||
|
import unittest
|
||||||
|
from gi.repository import GObject
|
||||||
|
|
||||||
|
|
||||||
|
@unittest.mock.patch.object(emmental.audio.stopwatch, "datetime")
|
||||||
|
class TestStopwatch(unittest.TestCase):
|
||||||
|
"""Our stopwatch test case."""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
"""Set up common variables."""
|
||||||
|
self.now = datetime.datetime.now()
|
||||||
|
self.newdelta = datetime.timedelta
|
||||||
|
self.stopwatch = emmental.audio.stopwatch.StopWatch()
|
||||||
|
|
||||||
|
def test_init(self, mock_datetime: unittest.mock.Mock):
|
||||||
|
"""Test that the StopWatch was created properly."""
|
||||||
|
self.assertIsInstance(self.stopwatch, GObject.GObject)
|
||||||
|
|
||||||
|
def test_elapsed_time(self, mock_datetime: unittest.mock.Mock):
|
||||||
|
"""Test the elapsed_time() function."""
|
||||||
|
mock_datetime.timedelta = self.newdelta
|
||||||
|
self.assertEqual(self.stopwatch.elapsed_time(), 0.0)
|
||||||
|
|
||||||
|
mock_datetime.datetime.now.return_value = self.now
|
||||||
|
self.stopwatch.start()
|
||||||
|
|
||||||
|
soon = self.now + datetime.timedelta(seconds=12.345)
|
||||||
|
mock_datetime.datetime.now.return_value = soon
|
||||||
|
self.assertEqual(self.stopwatch.elapsed_time(), 12.345)
|
||||||
|
|
||||||
|
self.stopwatch._saved = datetime.timedelta(seconds=2)
|
||||||
|
self.assertEqual(self.stopwatch.elapsed_time(), 14.345)
|
||||||
|
|
||||||
|
self.stopwatch.stop()
|
||||||
|
self.assertEqual(self.stopwatch.elapsed_time(), 14.345)
|
||||||
|
|
||||||
|
self.stopwatch.reset()
|
||||||
|
self.assertEqual(self.stopwatch.elapsed_time(), 0.0)
|
||||||
|
|
||||||
|
def test_reset(self, mock_datetime: unittest.mock.Mock):
|
||||||
|
"""Test resetting the StopWatch."""
|
||||||
|
mock_datetime.datetime.now.return_value = self.now
|
||||||
|
self.stopwatch.start()
|
||||||
|
soon = self.now + datetime.timedelta(seconds=12.345)
|
||||||
|
mock_datetime.datetime.now.return_value = soon
|
||||||
|
self.stopwatch.stop()
|
||||||
|
|
||||||
|
self.stopwatch.reset()
|
||||||
|
self.assertIsNone(self.stopwatch._saved)
|
||||||
|
self.assertIsNone(self.stopwatch._started)
|
||||||
|
|
||||||
|
def test_start(self, mock_datetime: unittest.mock.Mock):
|
||||||
|
"""Test starting the StopWatch."""
|
||||||
|
self.assertIsNone(self.stopwatch._started)
|
||||||
|
|
||||||
|
mock_datetime.datetime.now.return_value = self.now
|
||||||
|
self.stopwatch.start()
|
||||||
|
self.assertEqual(self.stopwatch._started, self.now)
|
||||||
|
|
||||||
|
def test_stop(self, mock_datetime: unittest.mock.Mock):
|
||||||
|
"""Test stopping the StopWatch."""
|
||||||
|
self.assertIsNone(self.stopwatch._saved)
|
||||||
|
self.stopwatch.stop()
|
||||||
|
self.assertIsNone(self.stopwatch._saved)
|
||||||
|
|
||||||
|
mock_datetime.datetime.now.return_value = self.now
|
||||||
|
self.stopwatch.start()
|
||||||
|
delta1 = datetime.timedelta(seconds=12.345)
|
||||||
|
mock_datetime.datetime.now.return_value = self.now + delta1
|
||||||
|
self.stopwatch.stop()
|
||||||
|
self.assertEqual(self.stopwatch._saved, delta1)
|
||||||
|
self.assertIsNone(self.stopwatch._started)
|
||||||
|
|
||||||
|
now = self.now + delta1 + datetime.timedelta(seconds=2)
|
||||||
|
mock_datetime.datetime.now.return_value = now
|
||||||
|
self.stopwatch.start()
|
||||||
|
delta2 = datetime.timedelta(seconds=3)
|
||||||
|
mock_datetime.datetime.now.return_value = now + delta2
|
||||||
|
self.stopwatch.stop()
|
||||||
|
self.assertEqual(self.stopwatch._saved, delta1 + delta2)
|
||||||
|
|
||||||
|
self.stopwatch.stop()
|
||||||
|
self.assertEqual(self.stopwatch._saved, delta1 + delta2)
|
Loading…
Reference in New Issue