Unify beginner syntax while preserving compatibility, repair ownership and parser guards, add verified distribution tooling and VC6 Windows 98 build inputs, and clarify documentation and release status. Preserve DOS build-input line endings and exclude generated binaries/caches.
51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
"""Execute every Claro code block in docs/FIRST_HOUR.md and check its output."""
|
|
from pathlib import Path
|
|
import os
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
EXE = Path(os.environ.get("CLARO_EXE", str(ROOT / ("claro.exe" if os.name == "nt" else "claro")))).resolve()
|
|
INPUTS = {2: "Ada\n", 5: "4\n"}
|
|
EXPECTED = {
|
|
1: "Hello!\n",
|
|
2: "What is your name?\nHello Ada\n",
|
|
3: "0\n",
|
|
4: "1\n",
|
|
5: "What is 2 + 2?\nCorrect!\n",
|
|
6: "Practice helps\nPractice helps\nPractice helps\n",
|
|
7: "milk\nbread\n",
|
|
8: "5\n",
|
|
9: "Hello\n",
|
|
}
|
|
|
|
|
|
def main() -> int:
|
|
text = (ROOT / "docs/FIRST_HOUR.md").read_text(encoding="utf-8")
|
|
blocks = re.findall(r"```claro\s*\n(.*?)\n```", text, flags=re.DOTALL)
|
|
if len(blocks) != len(EXPECTED):
|
|
print(f"FAIL: expected {len(EXPECTED)} Claro blocks, found {len(blocks)}")
|
|
return 1
|
|
with tempfile.TemporaryDirectory(prefix="claro-first-hour-") as tmp:
|
|
for number, block in enumerate(blocks, 1):
|
|
script = Path(tmp) / f"block-{number}.claro"
|
|
script.write_text(block + "\n", encoding="utf-8")
|
|
run = subprocess.run([str(EXE), str(script)], cwd=tmp,
|
|
input=INPUTS.get(number, ""), text=True,
|
|
capture_output=True, timeout=10)
|
|
if run.returncode or run.stdout != EXPECTED[number]:
|
|
print(f"FAIL: First Hour block {number}: exit={run.returncode}")
|
|
print(f"expected stdout: {EXPECTED[number]!r}")
|
|
print(f"actual stdout: {run.stdout!r}")
|
|
print(run.stderr, end="", file=sys.stderr)
|
|
return 1
|
|
print(f"PASS: First Hour block {number}")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|