48 lines
1.7 KiB
Python
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()
|