Spaces:
Sleeping
Sleeping
File size: 4,724 Bytes
77bffac | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | 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()
|