pyLyricFlow/tests/test_engine.py
2026-02-24 13:22:10 -06:00

48 lines
1.7 KiB
Python

import unittest
from src.engine.rhyme_engine import engine
class TestRhymeEngine(unittest.TestCase):
def test_perfect_rhyme(self):
score = engine.calculate_similarity("cat", "mat")
self.assertGreaterEqual(score, 0.5)
def test_near_rhyme(self):
# Specific examples might depend on CMUDict stressed phonemes
score = engine.calculate_similarity("power", "hour")
self.assertGreaterEqual(score, 0.5)
def test_no_rhyme(self):
score = engine.calculate_similarity("cat", "dog")
self.assertLess(score, 0.2)
def test_normalization(self):
score = engine.calculate_similarity("runnin'", "running")
self.assertGreaterEqual(score, 0.8)
def test_density_respects_lyricdown_syntax_lines(self):
text = "# Intro\n@tempo: 90\n> skip this\ncat bat"
densities = engine.get_line_densities(text)
self.assertEqual([0.0, 0.0, 0.0, 1.0], densities)
def test_density_ignores_bracket_tags(self):
text = "[Verse 1]\ncat bat [Hook]"
densities = engine.get_line_densities(text)
self.assertEqual([0.0, 1.0], densities)
def test_density_ignores_unclosed_bracket_tags(self):
text = "[Voice: The Jester\ncat bat"
densities = engine.get_line_densities(text)
self.assertEqual([0.0, 1.0], densities)
def test_grouping_considers_all_pronunciations(self):
text = "cat bat brat combat"
groups = engine.get_rhyme_groups(text)
by_word = {}
for item in groups:
by_word.setdefault(item["word"], item["group"])
self.assertIsNotNone(by_word.get("combat"))
self.assertEqual(by_word.get("bat"), by_word.get("combat"))
if __name__ == '__main__':
unittest.main()