155 lines
3.7 KiB
Python
155 lines
3.7 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
import sys
|
||
|
|
import io
|
||
|
|
import contextlib
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
sys.path.insert(0, str(Path.cwd()))
|
||
|
|
|
||
|
|
from gx_cli.main import main
|
||
|
|
|
||
|
|
|
||
|
|
def test_summary_basic():
|
||
|
|
"""Test summary command on a .gx file"""
|
||
|
|
gx_path = Path("/tmp/test_summary_basic.gx")
|
||
|
|
|
||
|
|
# Compile
|
||
|
|
compile_code = main(["compile", "/home/dave/sample_code.py", "-o", str(gx_path)])
|
||
|
|
if compile_code != 0:
|
||
|
|
print("FAIL: compilation failed")
|
||
|
|
return False
|
||
|
|
|
||
|
|
# Summary
|
||
|
|
f = io.StringIO()
|
||
|
|
with contextlib.redirect_stdout(f):
|
||
|
|
exit_code = main(["summary", str(gx_path)])
|
||
|
|
|
||
|
|
output = f.getvalue()
|
||
|
|
|
||
|
|
if exit_code != 0:
|
||
|
|
print("FAIL: summary returned non-zero")
|
||
|
|
return False
|
||
|
|
|
||
|
|
# Check for expected content
|
||
|
|
if "GX File:" not in output:
|
||
|
|
print("FAIL: missing 'GX File:' in summary")
|
||
|
|
return False
|
||
|
|
|
||
|
|
if "Source:" not in output:
|
||
|
|
print("FAIL: missing 'Source:' in summary")
|
||
|
|
return False
|
||
|
|
|
||
|
|
print("PASS: Summary shows file info")
|
||
|
|
return True
|
||
|
|
|
||
|
|
|
||
|
|
def test_summary_content():
|
||
|
|
"""Test that summary contains expected information"""
|
||
|
|
gx_path = Path("/tmp/test_summary_content.gx")
|
||
|
|
|
||
|
|
# Compile
|
||
|
|
main(["compile", "/home/dave/sample_code.py", "-o", str(gx_path)])
|
||
|
|
|
||
|
|
# Summary
|
||
|
|
f = io.StringIO()
|
||
|
|
with contextlib.redirect_stdout(f):
|
||
|
|
main(["summary", str(gx_path)])
|
||
|
|
|
||
|
|
output = f.getvalue()
|
||
|
|
|
||
|
|
# Check for expected fields
|
||
|
|
required_content = [
|
||
|
|
"GX File:",
|
||
|
|
"Source:",
|
||
|
|
"Type:",
|
||
|
|
"Segments:",
|
||
|
|
"Compressed:",
|
||
|
|
"Version:"
|
||
|
|
]
|
||
|
|
|
||
|
|
for content in required_content:
|
||
|
|
if content not in output:
|
||
|
|
print(f"FAIL: missing '{content}' in summary")
|
||
|
|
return False
|
||
|
|
|
||
|
|
# Should contain actual values
|
||
|
|
if "/home/dave/sample_code.py" not in output:
|
||
|
|
print("FAIL: source file path not in summary")
|
||
|
|
return False
|
||
|
|
|
||
|
|
if ".py" not in output:
|
||
|
|
print("FAIL: source type not in summary")
|
||
|
|
return False
|
||
|
|
|
||
|
|
print("PASS: Summary contains all expected fields and values")
|
||
|
|
return True
|
||
|
|
|
||
|
|
|
||
|
|
def test_summary_readable():
|
||
|
|
"""Test that summary output is human-readable"""
|
||
|
|
gx_path = Path("/tmp/test_summary_readable.gx")
|
||
|
|
|
||
|
|
# Compile
|
||
|
|
main(["compile", "/home/dave/sample_code.py", "-o", str(gx_path)])
|
||
|
|
|
||
|
|
# Summary
|
||
|
|
f = io.StringIO()
|
||
|
|
with contextlib.redirect_stdout(f):
|
||
|
|
main(["summary", str(gx_path)])
|
||
|
|
|
||
|
|
output = f.getvalue()
|
||
|
|
|
||
|
|
# Should be formatted on separate lines
|
||
|
|
lines = output.strip().split('\n')
|
||
|
|
if len(lines) < 5:
|
||
|
|
print(f"FAIL: summary too short ({len(lines)} lines)")
|
||
|
|
return False
|
||
|
|
|
||
|
|
# Each line should be readable
|
||
|
|
for line in lines:
|
||
|
|
if ":" in line: # Should be key: value format
|
||
|
|
parts = line.split(":", 1)
|
||
|
|
if len(parts) == 2:
|
||
|
|
key = parts[0].strip()
|
||
|
|
value = parts[1].strip()
|
||
|
|
if not key or not value:
|
||
|
|
print(f"FAIL: malformed line: {line}")
|
||
|
|
return False
|
||
|
|
|
||
|
|
print("PASS: Summary is human-readable")
|
||
|
|
return True
|
||
|
|
|
||
|
|
|
||
|
|
def main_test():
|
||
|
|
print("[TEST SUITE] test_summary.py")
|
||
|
|
print()
|
||
|
|
|
||
|
|
tests = [
|
||
|
|
("Basic summary", test_summary_basic),
|
||
|
|
("Summary content", test_summary_content),
|
||
|
|
("Readable format", test_summary_readable),
|
||
|
|
]
|
||
|
|
|
||
|
|
passed = 0
|
||
|
|
failed = 0
|
||
|
|
|
||
|
|
for name, test_func in tests:
|
||
|
|
print(f"Running: {name}...", end=" ")
|
||
|
|
try:
|
||
|
|
if test_func():
|
||
|
|
passed += 1
|
||
|
|
else:
|
||
|
|
failed += 1
|
||
|
|
except Exception as e:
|
||
|
|
print(f"FAIL: {e}")
|
||
|
|
failed += 1
|
||
|
|
|
||
|
|
print()
|
||
|
|
print(f"Results: {passed} passed, {failed} failed")
|
||
|
|
|
||
|
|
return 0 if failed == 0 else 1
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
sys.exit(main_test())
|