McRogueFace/tests/unit/test_api_docs.py

164 lines
4.7 KiB
Python

#!/usr/bin/env python3
"""Test that API documentation generator works correctly."""
import os
import sys
from pathlib import Path
def test_api_docs_exist():
"""Test that API documentation was generated."""
docs_path = Path("docs/API_REFERENCE.md")
if not docs_path.exists():
print("ERROR: API documentation not found at docs/API_REFERENCE.md")
return False
print("✓ API documentation file exists")
# Check file size
size = docs_path.stat().st_size
if size < 1000:
print(f"ERROR: API documentation seems too small ({size} bytes)")
return False
print(f"✓ API documentation has reasonable size ({size} bytes)")
# Read content
with open(docs_path, 'r') as f:
content = f.read()
# Check for expected sections
expected_sections = [
"# McRogueFace API Reference",
"## Overview",
"## Classes",
"## Functions",
"## Automation Module"
]
missing = []
for section in expected_sections:
if section not in content:
missing.append(section)
if missing:
print(f"ERROR: Missing sections: {missing}")
return False
print("✓ All expected sections present")
# Check for key classes
key_classes = ["Frame", "Caption", "Sprite", "Grid", "Entity", "Scene"]
missing_classes = []
for cls in key_classes:
if f"### class {cls}" not in content:
missing_classes.append(cls)
if missing_classes:
print(f"ERROR: Missing classes: {missing_classes}")
return False
print("✓ All key classes documented")
# Check for key functions
key_functions = ["createScene", "setScene", "currentScene", "find", "setTimer"]
missing_funcs = []
for func in key_functions:
if f"### {func}" not in content:
missing_funcs.append(func)
if missing_funcs:
print(f"ERROR: Missing functions: {missing_funcs}")
return False
print("✓ All key functions documented")
# Check automation module
if "automation.screenshot" in content:
print("✓ Automation module documented")
else:
print("ERROR: Automation module not properly documented")
return False
# Count documentation entries
class_count = content.count("### class ")
func_count = content.count("### ") - class_count - content.count("### automation.")
auto_count = content.count("### automation.")
print(f"\nDocumentation Coverage:")
print(f"- Classes: {class_count}")
print(f"- Functions: {func_count}")
print(f"- Automation methods: {auto_count}")
return True
def test_doc_accuracy():
"""Test that documentation matches actual API."""
# Import mcrfpy to check
import mcrfpy
print("\nVerifying documentation accuracy...")
# Read documentation
with open("docs/API_REFERENCE.md", 'r') as f:
content = f.read()
# Check that all public classes are documented
actual_classes = [name for name in dir(mcrfpy)
if isinstance(getattr(mcrfpy, name), type) and not name.startswith('_')]
undocumented = []
for cls in actual_classes:
if f"### class {cls}" not in content:
undocumented.append(cls)
if undocumented:
print(f"WARNING: Undocumented classes: {undocumented}")
else:
print("✓ All public classes are documented")
# Check functions
actual_funcs = [name for name in dir(mcrfpy)
if callable(getattr(mcrfpy, name)) and not name.startswith('_')
and not isinstance(getattr(mcrfpy, name), type)]
undoc_funcs = []
for func in actual_funcs:
if f"### {func}" not in content:
undoc_funcs.append(func)
if undoc_funcs:
print(f"WARNING: Undocumented functions: {undoc_funcs}")
else:
print("✓ All public functions are documented")
return True
def main():
"""Run all API documentation tests."""
print("API Documentation Tests")
print("======================\n")
all_passed = True
# Test 1: Documentation exists and is complete
print("Test 1: Documentation Generation")
if not test_api_docs_exist():
all_passed = False
print()
# Test 2: Documentation accuracy
print("Test 2: Documentation Accuracy")
if not test_doc_accuracy():
all_passed = False
print()
if all_passed:
print("✅ All API documentation tests passed!")
sys.exit(0)
else:
print("❌ Some tests failed.")
sys.exit(1)
if __name__ == '__main__':
main()