|
| 1 | +import unittest |
| 2 | +from transpose_chords import transpose_note, transpose_chord, transpose_text |
| 3 | + |
| 4 | +class TestTranspose(unittest.TestCase): |
| 5 | + def test_transpose_note_sharps(self): |
| 6 | + self.assertEqual(transpose_note('C', 1), 'Db') |
| 7 | + self.assertEqual(transpose_note('C#', 1), 'D') |
| 8 | + self.assertEqual(transpose_note('E', 1), 'F') |
| 9 | + self.assertEqual(transpose_note('B', 1), 'C') |
| 10 | + |
| 11 | + def test_transpose_note_flats(self): |
| 12 | + self.assertEqual(transpose_note('Db', 1), 'D') |
| 13 | + self.assertEqual(transpose_note('Eb', 1), 'E') |
| 14 | + self.assertEqual(transpose_note('Bb', 2), 'C') |
| 15 | + |
| 16 | + def test_transpose_chord_simple(self): |
| 17 | + self.assertEqual(transpose_chord('C', 2), 'D') |
| 18 | + self.assertEqual(transpose_chord('Am7', 1), 'Bbm7') |
| 19 | + self.assertEqual(transpose_chord('Gmaj7', 3), 'Bbmaj7') |
| 20 | + |
| 21 | + def test_transpose_chord_slash(self): |
| 22 | + # transpose_chord handles single chords. |
| 23 | + # Slash chords are handled in transpose_text by splitting. |
| 24 | + self.assertEqual(transpose_chord('C', 1), 'Db') |
| 25 | + self.assertEqual(transpose_chord('G', 1), 'Ab') |
| 26 | + |
| 27 | + def test_transpose_text_song(self): |
| 28 | + song = "[C]Hello [G/B]World\n[Am7]Testing" |
| 29 | + expected = "[Db]Hello [Ab/C]World\n[Bbm7]Testing" |
| 30 | + self.assertEqual(transpose_text(song, 1), expected) |
| 31 | + |
| 32 | + def test_smart_notes(self): |
| 33 | + # Verify the SMART_NOTES mapping |
| 34 | + self.assertEqual(transpose_note('G', 1), 'Ab') |
| 35 | + self.assertEqual(transpose_note('G#', 1), 'A') |
| 36 | + |
| 37 | +if __name__ == '__main__': |
| 38 | + unittest.main() |
0 commit comments