DesenrolaAi / python-basic-pitch /tests /test_music_token_metrics.py
Azure DevOps Pipeline
deploy: Merged PR 26: melhoria no projeto
77bffac
Raw
History Blame Contribute Delete
4.72 kB
import sys
import unittest
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from music_token_metrics import (
MatrizSemAcorde,
avaliar_sem_acorde,
distancia_edicao_tokens,
eh_sem_acorde,
normalizar_token,
qualidade_completa_token,
qualidade_token,
raiz_token,
simplificar_token_musical,
)
class MusicTokenMetricsTests(unittest.TestCase):
def test_normaliza_aliases_de_no_chord_sem_confundir_com_acorde(self):
for token in ("N", "N.C.", "no_chord", "sem_acorde", "silencio"):
with self.subTest(token=token):
self.assertEqual(normalizar_token(token), "N")
self.assertTrue(eh_sem_acorde(token))
self.assertEqual(raiz_token(token), "")
self.assertEqual(qualidade_token(token), "no_chord")
self.assertEqual(simplificar_token_musical(token), "N")
self.assertFalse(eh_sem_acorde("C"))
self.assertEqual(qualidade_token("token-invalido"), "unknown")
def test_qualidade_completa_distingue_extensoes_antes_colapsadas(self):
casos = {
"C": "major",
"Cm": "minor",
"C7": "dominant7",
"Cmaj7": "major7",
"Cm7": "minor7",
"CM7": "major7",
"C7M": "major7",
"C6": "major6",
"Cm6": "minor6",
"C9": "dominant9",
"Cmaj9": "major9",
"Cm9": "minor9",
"Cadd9": "add9",
"Csus2": "sus2",
"Csus4": "sus4",
"Cdim": "diminished",
"Cdim7": "diminished7",
"C°7": "diminished7",
"Cm7b5": "half_diminished7",
"Cø7": "half_diminished7",
"Caug": "augmented",
"C+": "augmented",
"C-7": "minor7",
"C5": "power5",
"N": "no_chord",
}
for token, esperado in casos.items():
with self.subTest(token=token):
self.assertEqual(qualidade_completa_token(token), esperado)
self.assertEqual(qualidade_token("C"), qualidade_token("Cmaj7"))
self.assertNotEqual(qualidade_completa_token("C"), qualidade_completa_token("Cmaj7"))
def test_matriz_no_chord_expoe_falso_positivo_e_falso_negativo(self):
matriz = avaliar_sem_acorde(
["C", "N", "G", "N"],
["C", "N.C.", "N", "A"],
)
self.assertEqual(
matriz,
MatrizSemAcorde(
verdadeiros_positivos=1,
falsos_positivos=1,
falsos_negativos=1,
verdadeiros_negativos=1,
),
)
self.assertEqual(matriz.suporte, 2)
self.assertAlmostEqual(matriz.acuracia, 0.5)
self.assertAlmostEqual(matriz.precisao, 0.5)
self.assertAlmostEqual(matriz.revocacao, 0.5)
self.assertAlmostEqual(matriz.f1, 0.5)
def test_matriz_no_chord_conta_token_ausente_como_falso_negativo(self):
matriz = avaliar_sem_acorde(["C", "N"], ["C"])
self.assertEqual(matriz.falsos_negativos, 1)
self.assertEqual(matriz.verdadeiros_negativos, 1)
def test_distancia_edicao_separa_insercao_remocao_e_substituicao(self):
insercao = distancia_edicao_tokens(
["C", "G", "AM", "F"],
["C", "D", "G", "AM", "F"],
)
remocao = distancia_edicao_tokens(["C", "G", "AM", "F"], ["C", "AM", "F"])
substituicao = distancia_edicao_tokens(["C", "G"], ["C", "D"])
self.assertEqual((insercao.distancia, insercao.insercoes), (1, 1))
self.assertEqual((remocao.distancia, remocao.remocoes), (1, 1))
self.assertEqual((substituicao.distancia, substituicao.substituicoes), (1, 1))
def test_distancia_edicao_aceita_transformacao_musical(self):
exata = distancia_edicao_tokens(
["Cmaj7", "G7/B"],
["C", "G"],
raiz_token,
)
self.assertEqual(exata.distancia, 0)
self.assertEqual(exata.substituicoes, 0)
self.assertEqual(exata.insercoes, 0)
self.assertEqual(exata.remocoes, 0)
def test_soma_de_matrizes_preserva_contagens_para_agregacao(self):
primeira = MatrizSemAcorde(verdadeiros_positivos=1, falsos_positivos=2)
segunda = MatrizSemAcorde(falsos_negativos=3, verdadeiros_negativos=4)
self.assertEqual(
primeira.somar(segunda),
MatrizSemAcorde(
verdadeiros_positivos=1,
falsos_positivos=2,
falsos_negativos=3,
verdadeiros_negativos=4,
),
)
if __name__ == "__main__":
unittest.main()