#!/usr/bin/env python3
"""
Verification script for Directory Structure Analysis Task
"""
import sys
from pathlib import Path
import os
import re
def get_test_directory() -> Path:
"""Get the test directory from FILESYSTEM_TEST_DIR env var."""
test_root = os.environ.get("FILESYSTEM_TEST_DIR")
if not test_root:
raise ValueError("FILESYSTEM_TEST_DIR environment variable is required")
return Path(test_root)
def verify_structure_analysis_file_exists(test_dir: Path) -> bool:
"""Verify that the structure_analysis.txt file exists."""
analysis_file = test_dir / "structure_analysis.txt"
if not analysis_file.exists():
print("❌ File 'structure_analysis.txt' not found")
return False
print("✅ structure_analysis.txt file found")
return True
def verify_structure_analysis_file_readable(test_dir: Path) -> bool:
"""Verify that the structure_analysis.txt file is readable."""
analysis_file = test_dir / "structure_analysis.txt"
try:
content = analysis_file.read_text()
if not content.strip():
print("❌ structure_analysis.txt file is empty")
return False
print("✅ structure_analysis.txt file is readable")
return True
except Exception as e:
print(f"❌ Error reading structure_analysis.txt file: {e}")
return False
def verify_subtask1_file_statistics(test_dir: Path) -> bool:
"""Verify subtask 1: File Statistics - files must be 69, folders must be 51, 58097 allows +-1000."""
analysis_file = test_dir / "structure_analysis.txt"
try:
content = analysis_file.read_text()
# Extract numbers from the content
file_count_match = re.search(r'total number of files:\s*(\d+)', content)
folder_count_match = re.search(r'total number of folders:\s*(\d+)', content)
size_match = re.search(r'total size of all files:\s*(\d+)', content)
if not file_count_match or not folder_count_match or not size_match:
print("❌ Could not extract file statistics from structure_analysis.txt")
return False
file_count = int(file_count_match.group(1))
folder_count = int(folder_count_match.group(1))
total_size = int(size_match.group(1))
print(f"📊 Found: files={file_count}, folders={folder_count}, size={total_size}")
# Check if file count is exactly 69
if file_count != 69:
print(f"❌ File count must be 69, found: {file_count}")
return False
# Check if folder count is exactly 51
if folder_count != 51:
print(f"❌ Folder count must be 51, found: {folder_count}")
return False
# Check if size is within acceptable range (58097 ± 1000)
expected_size = 58097
size_tolerance = 1000
if abs(total_size - expected_size) > size_tolerance:
print(f"❌ Total size ({total_size}) is not within acceptable range ({expected_size} ± {size_tolerance})")
return False
print(f"✅ File statistics verified: files={file_count}, folders={folder_count}, size={total_size} (within tolerance)")
return True
except Exception as e:
print(f"❌ Error verifying file statistics: {e}")
return False
def verify_subtask2_depth_analysis(test_dir: Path) -> bool:
"""Verify subtask 2: Depth Analysis - depth must be 7, verify path exists."""
analysis_file = test_dir / "structure_analysis.txt"
try:
content = analysis_file.read_text()
# Extract depth and path
depth_match = re.search(r'depth:\s*(\d+)', content)
path_match = re.search(r'^([^\n]+)$', content, re.MULTILINE)
if not depth_match:
print("❌ Could not extract depth from structure_analysis.txt")
return False
depth = int(depth_match.group(1))
# Check if depth is exactly 7
if depth != 7:
print(f"❌ Depth must be 7, found: {depth}")
return False
print(f"✅ Depth verified: {depth}")
# Extract the path (it should be on a separate line after "depth: 7")
lines = content.split('\n')
path_line = None
for i, line in enumerate(lines):
if line.strip() == f"depth: {depth}":
if i + 1 < len(lines):
path_line = lines[i + 1].strip()
break
if not path_line:
print("❌ Could not find path line after depth specification")
return False
print(f"📁 Found path: {path_line}")
# Verify that the path depth matches the declared depth
path_parts = path_line.split('/')
actual_depth = len(path_parts)
if actual_depth != depth:
print(f"❌ Path depth mismatch: declared depth is {depth}, but path has {actual_depth} levels")
print(f" Path: {path_line}")
print(f" Path parts: {path_parts}")
return False
print(f"✅ Path depth verified: {actual_depth} levels")
# Verify that this path exists in the test environment
expected_path = test_dir / path_line
if not expected_path.exists():
print(f"❌ Path does not exist: {expected_path}")
return False
if not expected_path.is_dir():
print(f"❌ Path exists but is not a directory: {expected_path}")
return False
print(f"✅ Path verified and exists: {path_line}")
return True
except Exception as e:
print(f"❌ Error verifying depth analysis: {e}")
return False
def verify_subtask3_file_type_classification(test_dir: Path) -> bool:
"""Verify subtask 3: File Type Classification - 68 and 1 must be accurate."""
analysis_file = test_dir / "structure_analysis.txt"
try:
content = analysis_file.read_text()
# Extract file type counts
txt_match = re.search(r'txt:\s*(\d+)', content)
py_match = re.search(r'py:\s*(\d+)', content)
if not txt_match or not py_match:
print("❌ Could not extract file type counts from structure_analysis.txt")
return False
txt_count = int(txt_match.group(1))
py_count = int(py_match.group(1))
print(f"📁 Found: txt={txt_count}, py={py_count}")
# Check if txt count is exactly 68
if txt_count != 68:
print(f"❌ txt count must be 68, found: {txt_count}")
return False
# Check if py count is exactly 1
if py_count != 1:
print(f"❌ py count must be 1, found: {py_count}")
return False
print(f"✅ File type classification verified: txt={txt_count}, py={py_count}")
return True
except Exception as e:
print(f"❌ Error verifying file type classification: {e}")
return False
def verify_file_format(test_dir: Path) -> bool:
"""Verify that the structure_analysis.txt file has proper format."""
analysis_file = test_dir / "structure_analysis.txt"
try:
content = analysis_file.read_text()
lines = content.split('\n')
# Check if file has the expected structure
if len(lines) < 5: # Should have at least 5 lines
print("❌ File seems too short to contain all required information")
return False
# Basic format check - ensure it's not completely corrupted
if not content.strip():
print("❌ File is completely empty")
return False
print("✅ File format is acceptable")
return True
except Exception as e:
print(f"❌ Error checking file format: {e}")
return False
def main():
"""Main verification function."""
try:
test_dir = get_test_directory()
print(f"🔍 Verifying Directory Structure Analysis Task in: {test_dir}")
# Define verification steps
verification_steps = [
("Structure Analysis File Exists", verify_structure_analysis_file_exists),
("File is Readable", verify_structure_analysis_file_readable),
("Subtask 1: File Statistics", verify_subtask1_file_statistics),
("Subtask 2: Depth Analysis", verify_subtask2_depth_analysis),
("Subtask 3: File Type Classification", verify_subtask3_file_type_classification),
("File Format", verify_file_format),
]
# Run all verification steps
all_passed = True
for step_name, verify_func in verification_steps:
print(f"\n--- {step_name} ---")
if not verify_func(test_dir):
all_passed = False
# Final result
print("\n" + "="*50)
if all_passed:
print("✅ Directory Structure Analysis completed correctly!")
print("🎉 Structure Analysis verification: PASS")
sys.exit(0)
else:
print("❌ Structure Analysis verification: FAIL")
sys.exit(1)
except Exception as e:
print(f"❌ Verification failed with error: {e}")
sys.exit(1)
if __name__ == "__main__":
main()