diff options
| author | tanaka takashi <isazaka@gmail.com> | 2026-07-12 16:03:29 +0900 |
|---|---|---|
| committer | tanaka takashi <isazaka@gmail.com> | 2026-07-12 16:03:29 +0900 |
| commit | 22f96694a96ed9fba169e77bc27d19d00edca083 (patch) | |
| tree | 8f59c1d3f211c296b005a3f6ede8206bc3675a68 /tests/test_parser.py | |
| parent | 3bb311ad8e0f10617805c8737d92d13e6a627818 (diff) | |
MML構文解析処理を追加
Diffstat (limited to 'tests/test_parser.py')
| -rw-r--r-- | tests/test_parser.py | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/tests/test_parser.py b/tests/test_parser.py index b263aac..a0f11c7 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -1,6 +1,6 @@ -"""Tests for PPMCK and Pyxel parsers.""" +"""Tests for PPMCK and Pyxel parsers (AST output).""" -from mml_composemusic_mcp.ir import NoteEvent +from mml_composemusic_mcp.ast_nodes import NoteStmt, Program, Track from mml_composemusic_mcp.lexer import tokenize from mml_composemusic_mcp.parser_ppmck import parse_ppmck from mml_composemusic_mcp.parser_pyxel import parse_pyxel @@ -21,33 +21,42 @@ PYXEL_EXAMPLE = """0: T150 L8 O4 V100 @1 def test_ppmck_parse(): tokens = tokenize(PPMCK_EXAMPLE, "ppmck") - ns, errors = parse_ppmck(PPMCK_EXAMPLE, tokens) + program, errors = parse_ppmck(PPMCK_EXAMPLE, tokens) + assert isinstance(program, Program) assert not any(e.severity == "error" for e in errors) - assert ns.channels["Pulse1"].events - assert ns.channels["Pulse2"].events - notes = [e for e in ns.channels["Pulse1"].events if isinstance(e, NoteEvent)] - assert notes[0].note_number == 60 # C4 + assert len(program.tracks) == 2 + assert program.tracks[0].channel == "Pulse1" + assert program.tracks[1].channel == "Pulse2" + notes = [ + s for s in program.tracks[0].statements if isinstance(s, NoteStmt) + ] + assert notes[0].note_name == "c" def test_pyxel_parse(): tokens = tokenize(PYXEL_EXAMPLE, "pyxel") - ns, errors = parse_pyxel(PYXEL_EXAMPLE, tokens) + program, errors = parse_pyxel(PYXEL_EXAMPLE, tokens) + assert isinstance(program, Program) assert not any(e.severity == "error" for e in errors) - assert ns.channels["Pulse1"].events - notes = [e for e in ns.channels["Pulse1"].events if isinstance(e, NoteEvent)] - assert notes[0].note_number == 60 # C4 + assert len(program.tracks) == 2 + assert program.tracks[0].channel == "Pulse1" + notes = [ + s for s in program.tracks[0].statements if isinstance(s, NoteStmt) + ] + assert notes[0].note_name == "c" -def test_pyxel_repeat_expansion(): +def test_pyxel_repeat_ast(): source = "0: T120 L4 O4\n[ C D ]2" tokens = tokenize(source, "pyxel") - ns, errors = parse_pyxel(source, tokens) - notes = [e for e in ns.channels["Pulse1"].events if isinstance(e, NoteEvent)] - assert len(notes) == 4 + program, errors = parse_pyxel(source, tokens) + assert not any(e.severity == "error" for e in errors) + assert isinstance(program.tracks[0], Track) def test_invalid_mode_error(): from mml_composemusic_mcp.server import _parse_mml seq, errors = _parse_mml("A c", "unknown") + assert seq is None assert any(e.severity == "error" for e in errors) |
