Name, Seitentitel, Dienste (playwish-web, playwish-controller), Dienst-Benutzer (playwish), Pfade (/opt/playwish, /usr/local/src/playwish), Vorlagen und Repository-Adresse. „Audiofy“ war bereits von mehreren Produkten belegt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
102 lines
3.0 KiB
Python
102 lines
3.0 KiB
Python
"""Tests für die Wiederholungsregel der Grund-Playlist (ohne Spotify)."""
|
|
|
|
import random
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
|
from controller import Controller, Playlist # noqa: E402
|
|
|
|
|
|
class FakeSpotify:
|
|
def __init__(self, titel):
|
|
self.titel = list(titel)
|
|
|
|
def playlist_titel(self, playlist_id):
|
|
return list(self.titel)
|
|
|
|
|
|
def spielen(pl: Playlist, anzahl: int) -> list[str]:
|
|
folge = []
|
|
for _ in range(anzahl):
|
|
uri = pl.naechster()
|
|
pl.gespielt(uri)
|
|
folge.append(uri)
|
|
return folge
|
|
|
|
|
|
def kleinster_abstand(folge: list[str]) -> int:
|
|
"""Wie viele verschiedene andere Titel liefen mindestens zwischen zwei Einsätzen desselben Titels?"""
|
|
minimum = 10**9
|
|
letzte: dict[str, int] = {}
|
|
for i, uri in enumerate(folge):
|
|
if uri in letzte:
|
|
minimum = min(minimum, len(set(folge[letzte[uri] + 1:i])))
|
|
letzte[uri] = i
|
|
return minimum
|
|
|
|
|
|
TITEL = [f"spotify:track:{i:022d}" for i in range(10)]
|
|
|
|
|
|
@pytest.mark.parametrize("prozent, mindestens", [(50, 5), (80, 8), (100, 9)])
|
|
def test_regel_haelt_abstand_ein(prozent, mindestens):
|
|
random.seed(prozent)
|
|
pl = Playlist(FakeSpotify(TITEL), "liste", prozent)
|
|
assert kleinster_abstand(spielen(pl, 300)) >= mindestens
|
|
|
|
|
|
def test_jeder_titel_kommt_dran():
|
|
pl = Playlist(FakeSpotify(TITEL), "liste", 100)
|
|
assert set(spielen(pl, 10)) == set(TITEL)
|
|
|
|
|
|
def test_regel_gilt_ueber_neustart():
|
|
random.seed(1)
|
|
alt = Playlist(FakeSpotify(TITEL), "liste", 50)
|
|
vorher = spielen(alt, 7)
|
|
neu = Playlist(FakeSpotify(TITEL), "liste", 50) # "Neustart"
|
|
neu.zuletzt.extend(alt.zuletzt)
|
|
gesperrt = set(vorher[-5:])
|
|
assert not gesperrt & set(spielen(neu, 5))
|
|
|
|
|
|
def test_neu_mischen_bricht_regel_nicht():
|
|
random.seed(2)
|
|
pl = Playlist(FakeSpotify(TITEL), "liste", 80)
|
|
folge = spielen(pl, 4)
|
|
pl.neu_mischen()
|
|
folge += spielen(pl, 30)
|
|
assert kleinster_abstand(folge) >= 8
|
|
|
|
|
|
def test_null_prozent_wie_bisher():
|
|
pl = Playlist(FakeSpotify(TITEL), "liste", 0)
|
|
assert pl.gesperrt() == set()
|
|
assert len(spielen(pl, 25)) == 25
|
|
|
|
|
|
def test_titel_anderer_playlist_zaehlen_nicht():
|
|
pl = Playlist(FakeSpotify(TITEL), "liste", 100)
|
|
pl.zuletzt.extend(f"spotify:track:x{i:021d}" for i in range(50)) # alte Playlist
|
|
pl.naechster()
|
|
assert pl.gesperrt() == set()
|
|
|
|
|
|
def test_ein_titel_bleibt_immer_frei():
|
|
pl = Playlist(FakeSpotify(TITEL[:2]), "liste", 100)
|
|
assert len(spielen(pl, 10)) == 10
|
|
|
|
|
|
def test_zustand_speichert_zuletzt(tmp_path):
|
|
datei = tmp_path / "zustand.json"
|
|
neu = lambda: Controller(sp=None, playlist=Playlist(FakeSpotify(TITEL), "liste", 50), server=None, # noqa: E731
|
|
n=3, geraetename="Playwish", bt_mac=None, zustand_pfad=datei)
|
|
c = neu()
|
|
c.playlist.gespielt(TITEL[3])
|
|
c.playlist.gespielt(TITEL[4])
|
|
c.zustand_sichern()
|
|
assert list(neu().playlist.zuletzt) == [TITEL[3], TITEL[4]]
|