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()