def test_song_items(self):
     region = as_region(' [C] c e | [Am] ')
     song_items = list(SongItems.parse(region))
     expected_song_items = [
         Chord(ScaleNote(0), descriptor=''),
         Note(0),
         Note(2),
         BarLine(),
         Chord(ScaleNote(5), descriptor='m')
     ]
     self.assertEquals(song_items, expected_song_items)
     self.assertEquals(song_items[0].source.value, '[C]')
     self.assertEquals(song_items[3].source.value, '|')
    def test_subticks(self):
        song_lines = """
            *song:         tempo_bpm=120, ticks_per_beat=4, subticks_per_tick = 5
                 | [C] c 
"""
        parse_string = StringToParse('test_string', song_lines)
        song = Song.parse(parse_string)
        self.assertEqualsDisplaying(
            song,
            Song([
                SongValuesCommand([
                    SetSongTempoBpm(120),
                    SetSongTicksPerBeat(4),
                    SetSongSubTicksPerTick(5)
                ]),
                BarLine(),
                Chord(ScaleNote(0), descriptor=''),
                Note(0, duration=(1, 1))
            ]))
    def test_parse_song_cut(self):
        song_lines = """
            *song:         tempo_bpm=120, ticks_per_beat=4
                 | [C] c e 
                 [:FAC] e 
                 ! c | [G] r2
"""
        parse_string = StringToParse('test_string', song_lines)
        song = Song.parse(parse_string)
        self.assertEqualsDisplaying(
            song,
            Song([
                SongValuesCommand(
                    [SetSongTempoBpm(120),
                     SetSongTicksPerBeat(4)]),
                Note(0, duration=(1, 1)),
                BarLine(),
                Chord(ScaleNote(4), descriptor=''),
                Rest((2, 1))
            ]))
    def test_parse_song(self):
        parse_string = StringToParse('test_string', self.song_lines)
        song = Song.parse(parse_string)
        self.assertEqualsDisplaying(
            song,
            Song([
                SongValuesCommand(
                    [SetSongTempoBpm(120),
                     SetSongTicksPerBeat(4)]),
                TrackValuesCommand('chord',
                                   [SetTrackOctave(2),
                                    SetTrackInstrument(40)]),
                TrackValuesCommand(
                    'bass',
                    [SetTrackOctave(1), SetTrackVolume(90)]),
                Chord(ScaleNote(0), descriptor=''),
                Note(0, duration=(1, 1)),
                Note(2, duration=(1, 1)),
                Chord(ScaleNote(3), other_notes=[ScaleNote(5),
                                                 ScaleNote(0)]),
                Note(2, duration=(1, 1)),
                Note(0, duration=(1, 2)),
                Note(0, duration=(1, 2)),
                BarLine(),
                Chord(ScaleNote(4), descriptor=''),
                Note(4, duration=(1, 1)),
                Rest((2, 1))
            ]))
        chord_track = song.tracks['chord']
        self.assertEquals(chord_track.instrument, 40)
        self.assertEquals(song.tracks['bass'].volume, 90)
        self.assertEquals(len(chord_track.items), 3)
        self.assertEquals(len(song.tracks['melody'].items), 6)

        self.assertEquals(chord_track.items[0].midi_notes, [36, 40, 43])
        self.assertEquals(chord_track.items[1].bass_midi_note, 29)
        self.assertEquals(song.bar_ticks, [0, 16, 32])
 def test_parse_barline_song_item(self):
     region = as_region("|")
     parsed_item = SongItem.parse(region)
     region = as_region("|")
     parsed_barline = BarLine.parse(region)
     self.assertEquals(parsed_item, parsed_barline)
 def test_bar_source_and_unparse(self):
     region = as_region("|")
     bar_line = BarLine.parse(region)
     self.assertEquals(bar_line.source.value, bar_line.unparse())
 def test_bar_line_parse_wrong(self):
     with self.parse_exception('Invalid bar line: "wrong"', "wrong"):
         region = as_region("wrong")
         BarLine.parse(region)
 def test_bar_line_parse(self):
     with self.parse_exception('Invalid bar line: "|extra" (extra data "extra")', "extra"):
         region = as_region("|extra")
         BarLine.parse(region)
 def test_bar_line_parse(self):
     region = as_region("|")
     bar_line = BarLine.parse(region)
     self.assertEquals(bar_line.source, region)
     self.assertEquals(bar_line, BarLine())
 def test_bar_source_and_unparse(self):
     region = as_region('|')
     bar_line = BarLine.parse(region)
     self.assertEquals(bar_line.source.value, bar_line.unparse())
 def test_parse_barline_song_item(self):
     region = as_region('|')
     parsed_item = SongItem.parse(region)
     region = as_region('|')
     parsed_barline = BarLine.parse(region)
     self.assertEquals(parsed_item, parsed_barline)
 def test_bar_line_parse_wrong(self):
     with self.parse_exception('Invalid bar line: "wrong"', 'wrong'):
         region = as_region('wrong')
         BarLine.parse(region)
 def test_bar_line_parse(self):
     with self.parse_exception(
             'Invalid bar line: "|extra" (extra data "extra")', 'extra'):
         region = as_region('|extra')
         BarLine.parse(region)
 def test_bar_line_parse(self):
     region = as_region('|')
     bar_line = BarLine.parse(region)
     self.assertEquals(bar_line.source, region)
     self.assertEquals(bar_line, BarLine())
 def test_bar_line_unparse(self):
     self.assertEquals(BarLine().unparse(), '|')
 def test_bar_equality(self):
     self.assertEquals(BarLine(), BarLine())