summaryrefslogtreecommitdiff
path: root/tests/test_parser.py
diff options
context:
space:
mode:
authortanaka takashi <isazaka@gmail.com>2026-07-12 16:03:29 +0900
committertanaka takashi <isazaka@gmail.com>2026-07-12 16:03:29 +0900
commit22f96694a96ed9fba169e77bc27d19d00edca083 (patch)
tree8f59c1d3f211c296b005a3f6ede8206bc3675a68 /tests/test_parser.py
parent3bb311ad8e0f10617805c8737d92d13e6a627818 (diff)
MML構文解析処理を追加
Diffstat (limited to 'tests/test_parser.py')
-rw-r--r--tests/test_parser.py39
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)