haochengsama's picture
Add files using upload-large-folder tool
a2ec7b6 verified
Raw
History Blame Contribute Delete
10.2 kB
#!/usr/bin/env python3
"""
Verification script for File Filtering Task: Find Files with Common Substring
"""
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_answer_file_exists(test_dir: Path) -> bool:
"""Verify that the answer.txt file exists."""
answer_file = test_dir / "answer.txt"
if not answer_file.exists():
print("❌ File 'answer.txt' not found")
return False
print("βœ… Answer file found")
return True
def verify_answer_format(test_dir: Path) -> bool:
"""Verify that the answer file has the correct format."""
answer_file = test_dir / "answer.txt"
try:
content = answer_file.read_text().strip()
# If file is empty, that's acceptable (no matches found)
if not content:
print("βœ… Answer file is empty (no matches found)")
return True
lines = content.split('\n')
for i, line in enumerate(lines, 1):
line = line.strip()
if not line:
continue
# Check format: filename.txt,start_position
parts = line.split(',')
if len(parts) != 2:
print(f"❌ Line {i} has incorrect format: {line}")
print(" Expected format: filename.txt,start_position")
return False
filename, start_pos = parts
# Check filename format
if not filename.endswith('.txt') or not filename.startswith('file_'):
print(f"❌ Line {i} has invalid filename: {filename}")
return False
# Check position format (should be integer)
try:
start_int = int(start_pos)
if start_int <= 0:
print(f"❌ Line {i} has invalid position: {start_pos}")
return False
except ValueError:
print(f"❌ Line {i} has non-integer position: {start_pos}")
return False
print("βœ… Answer format is correct")
return True
except Exception as e:
print(f"❌ Error reading answer file: {e}")
return False
def find_30_plus_char_matches(test_dir: Path) -> dict:
"""Find all matches with 30 or more characters between files and large_file.txt."""
large_file = test_dir / "large_file.txt"
if not large_file.exists():
print("❌ large_file.txt not found")
return {}
large_content = large_file.read_text()
matches = {}
# Check each file from file_01.txt to file_20.txt
for i in range(1, 21):
filename = f"file_{i:02d}.txt"
file_path = test_dir / filename
if not file_path.exists():
continue
file_content = file_path.read_text()
# Find the longest matching substring (30+ characters)
longest_match = ""
longest_match_start = -1
# Check all possible substrings in the file
for start_pos in range(len(file_content)):
for end_pos in range(start_pos + 30, len(file_content) + 1): # At least 30 characters
substring = file_content[start_pos:end_pos]
# Check if this substring exists in large_file.txt
if substring in large_content:
if len(substring) > len(longest_match):
longest_match = substring
# Find the position in large_file.txt where this substring starts
large_start_pos = large_content.find(substring)
longest_match_start = large_start_pos + 1 # 1-indexed
# If we found a match of 30+ characters, record it
if longest_match and len(longest_match) >= 30:
matches[filename] = longest_match_start
return matches
def verify_matches_are_correct(test_dir: Path) -> bool:
"""Verify that the matches found in answer.txt are actually correct."""
answer_file = test_dir / "answer.txt"
try:
content = answer_file.read_text().strip()
# If no content, check if there should actually be no matches
if not content:
expected_matches = find_30_plus_char_matches(test_dir)
if expected_matches:
print("❌ Answer file is empty but matches should exist")
for filename, start_pos in expected_matches.items():
print(f" Expected: {filename},{start_pos}")
return False
else:
print("βœ… No matches found (correct)")
return True
# Parse answer file
answer_matches = {}
lines = content.split('\n')
for line in lines:
line = line.strip()
if not line:
continue
filename, start_pos = line.split(',')
answer_matches[filename] = int(start_pos)
# Get expected matches
expected_matches = find_30_plus_char_matches(test_dir)
# Check if all answer matches are correct
for filename, start_pos in answer_matches.items():
if filename not in expected_matches:
print(f"❌ File {filename} listed in answer but has no valid 30+ character match")
return False
expected_start = expected_matches[filename]
if start_pos != expected_start:
print(f"❌ Incorrect match position for {filename}")
print(f" Expected: {expected_start}")
print(f" Found: {start_pos}")
return False
# Check if all expected matches are in answer
for filename in expected_matches:
if filename not in answer_matches:
print(f"❌ Missing match for {filename} in answer file")
return False
print("βœ… All matches are correct")
return True
except Exception as e:
print(f"❌ Error verifying matches: {e}")
return False
def verify_match_length_is_30_plus(test_dir: Path) -> bool:
"""Verify that all matches are at least 30 characters long."""
answer_file = test_dir / "answer.txt"
try:
content = answer_file.read_text().strip()
if not content:
return True # No matches to verify
large_file = test_dir / "large_file.txt"
large_content = large_file.read_text()
lines = content.split('\n')
for line in lines:
line = line.strip()
if not line:
continue
filename, start_pos = line.split(',')
start_int = int(start_pos)
# Get the file content to check the match
file_path = test_dir / filename
file_content = file_path.read_text()
# Find the longest matching substring starting from the given position
longest_match = ""
for end_pos in range(start_int + 30 - 1, len(large_content) + 1): # At least 30 characters
substring = large_content[start_int - 1:end_pos] # Convert to 0-indexed
if substring in file_content:
longest_match = substring
else:
break
if len(longest_match) < 30:
print(f"❌ Match in {filename} is {len(longest_match)} characters, less than 30")
print(f" Starting position: {start_int}")
return False
print("βœ… All matches are at least 30 characters long")
return True
except Exception as e:
print(f"❌ Error verifying match lengths: {e}")
return False
def verify_files_exist(test_dir: Path) -> bool:
"""Verify that all files mentioned in answer.txt actually exist."""
answer_file = test_dir / "answer.txt"
try:
content = answer_file.read_text().strip()
if not content:
return True # No files to verify
lines = content.split('\n')
for line in lines:
line = line.strip()
if not line:
continue
filename = line.split(',')[0]
file_path = test_dir / filename
if not file_path.exists():
print(f"❌ File mentioned in answer does not exist: {filename}")
return False
print("βœ… All files mentioned in answer exist")
return True
except Exception as e:
print(f"❌ Error verifying file existence: {e}")
return False
def main():
"""Main verification function."""
test_dir = get_test_directory()
print("πŸ” Verifying Pattern Matching Task: Find Files with Common Substring...")
# Define verification steps
verification_steps = [
("Answer File Exists", verify_answer_file_exists),
("Answer Format", verify_answer_format),
("Files Exist", verify_files_exist),
("Match Length is 30+", verify_match_length_is_30_plus),
("Matches are Correct", verify_matches_are_correct),
]
# 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("βœ… File filtering task completed correctly!")
print("πŸŽ‰ Task verification: PASS")
sys.exit(0)
else:
print("❌ Task verification: FAIL")
sys.exit(1)
if __name__ == "__main__":
main()