88 lines
2.8 KiB
Python
88 lines
2.8 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import sys
|
|
import os
|
|
from pathlib import Path
|
|
|
|
# Add the current directory to Python path so we can import our modules
|
|
sys.path.insert(0, '/home/janniclas/Projekte/Construction-of-Compilers/Project-02-03-04')
|
|
|
|
import triplayacc as yacc
|
|
import cfg_build
|
|
from cfg.CFG import CFG
|
|
from cfg.CFG_Node import (CFG_START, CFG_END)
|
|
|
|
def test_cfg_refactoring():
|
|
"""Test that the CFG refactoring works correctly"""
|
|
|
|
test_files = [
|
|
'example.tripla',
|
|
'simpleSequence.tripla',
|
|
'condition.tripla',
|
|
'factorial.tripla'
|
|
]
|
|
|
|
print("Testing CFG refactoring...")
|
|
print("=" * 50)
|
|
|
|
for filename in test_files:
|
|
print(f"\nTesting {filename}...")
|
|
|
|
try:
|
|
# Reset the global FUNCTIONS registry
|
|
cfg_build.FUNCTIONS.clear()
|
|
|
|
source = Path(f'triplaprograms/{filename}').read_text()
|
|
ast = yacc.parser.parse(source)
|
|
|
|
# Create CFG the old way (without AST parameter)
|
|
start1 = CFG_START()
|
|
end1 = CFG_END()
|
|
last1 = ast.cfa(start1, end1)
|
|
if last1 is not None:
|
|
last1.add_child(end1)
|
|
cfg_old = CFG(start1, end1) # Old constructor
|
|
dot_old = cfg_old.to_dot()
|
|
|
|
# Create CFG the new way (with AST parameter)
|
|
cfg_build.FUNCTIONS.clear()
|
|
start2 = CFG_START()
|
|
end2 = CFG_END()
|
|
last2 = ast.cfa(start2, end2)
|
|
if last2 is not None:
|
|
last2.add_child(end2)
|
|
cfg_new = CFG(start2, end2, ast) # New constructor
|
|
dot_new = cfg_new.to_dot()
|
|
|
|
# Compare the outputs
|
|
if dot_old == dot_new:
|
|
print(f" ✓ PASS: DOT outputs are identical")
|
|
else:
|
|
print(f" ✗ FAIL: DOT outputs differ")
|
|
print(f" Old length: {len(dot_old)}")
|
|
print(f" New length: {len(dot_new)}")
|
|
return False
|
|
|
|
# Verify basic structure
|
|
if 'digraph CFG' not in dot_new:
|
|
print(f" ✗ FAIL: Missing graph declaration")
|
|
return False
|
|
|
|
if '->' not in dot_new:
|
|
print(f" ✗ FAIL: Missing edges")
|
|
return False
|
|
|
|
print(f" ✓ PASS: Basic structure verified")
|
|
print(f" ✓ Generated DOT with {len(dot_new)} characters")
|
|
|
|
except Exception as e:
|
|
print(f" ✗ FAIL: Exception occurred: {e}")
|
|
return False
|
|
|
|
print("\n" + "=" * 50)
|
|
print("✓ All tests passed! CFG refactoring is working correctly.")
|
|
return True
|
|
|
|
if __name__ == "__main__":
|
|
success = test_cfg_refactoring()
|
|
sys.exit(0 if success else 1) |