SXXXXXXX_PyUCC/tests/test_differ_consistency.py

148 lines
4.2 KiB
Python

"""Test differ consistency: multiple differ runs should give identical results."""
import os
import sys
import shutil
import tempfile
from pathlib import Path
# Create a test project structure
temp_project = tempfile.mkdtemp(prefix="test_project_")
try:
# Create some test files
(Path(temp_project) / "module1.py").write_text(
'''"""Module 1."""
def function_a():
"""Function A."""
return 42
def function_b():
"""Function B."""
x = 10
return x * 2
''',
encoding="utf-8",
)
(Path(temp_project) / "module2.py").write_text(
'''"""Module 2."""
class MyClass:
"""A test class."""
def method1(self):
"""Method 1."""
pass
def method2(self):
"""Method 2."""
return "test"
''',
encoding="utf-8",
)
print(f"Test project: {temp_project}")
print()
# Import modules
from pyucc.core.differ import BaselineManager
from pyucc.core.countings_impl import _COUNTING_CACHE
# Create baseline manager
baseline_dir = tempfile.mkdtemp(prefix="test_baselines_")
bm = BaselineManager(temp_project, baselines_root=baseline_dir)
print("Creating baseline 1...")
baseline_id_1 = bm.create_baseline_from_dir(
temp_project, baseline_id="test_baseline_1", snapshot=False
)
print(f"Created: {baseline_id_1}")
print(f"Cache size after baseline 1: {len(_COUNTING_CACHE)}")
# Load metadata
meta1 = bm.load_metadata(baseline_id_1)
print(f"Files in baseline 1: {len(meta1.files)}")
# Extract countings from first baseline
countings_1 = {}
for fm in meta1.files:
if fm.countings:
countings_1[fm.path] = (
fm.countings["physical_lines"],
fm.countings["code_lines"],
fm.countings["comment_lines"],
fm.countings["blank_lines"],
)
print("Baseline 1 countings:")
for path, counts in sorted(countings_1.items()):
print(
f" {path}: physical={counts[0]}, code={counts[1]}, comment={counts[2]}, blank={counts[3]}"
)
print()
# Create a second baseline from the SAME unchanged files
print("Creating baseline 2 from SAME files (cache should be used)...")
baseline_id_2 = bm.create_baseline_from_dir(
temp_project, baseline_id="test_baseline_2", snapshot=False
)
print(f"Created: {baseline_id_2}")
print(f"Cache size after baseline 2: {len(_COUNTING_CACHE)}")
meta2 = bm.load_metadata(baseline_id_2)
print(f"Files in baseline 2: {len(meta2.files)}")
# Extract countings from second baseline
countings_2 = {}
for fm in meta2.files:
if fm.countings:
countings_2[fm.path] = (
fm.countings["physical_lines"],
fm.countings["code_lines"],
fm.countings["comment_lines"],
fm.countings["blank_lines"],
)
print("Baseline 2 countings:")
for path, counts in sorted(countings_2.items()):
print(
f" {path}: physical={counts[0]}, code={counts[1]}, comment={counts[2]}, blank={counts[3]}"
)
print()
# Compare baselines
print("Comparing baselines...")
all_files = set(countings_1.keys()) | set(countings_2.keys())
differences = []
for path in sorted(all_files):
c1 = countings_1.get(path)
c2 = countings_2.get(path)
if c1 != c2:
differences.append((path, c1, c2))
if differences:
print(f"❌ FAIL: Found {len(differences)} differences:")
for path, c1, c2 in differences:
print(f" {path}:")
print(f" Baseline 1: {c1}")
print(f" Baseline 2: {c2}")
else:
print("✅ SUCCESS: All countings are identical between baselines!")
print(
" Same content always produces same results, regardless of when analyzed."
)
print()
print(f"Final cache size: {len(_COUNTING_CACHE)} entries")
print("(Should be 2 entries for 2 unique files, reused across both baselines)")
finally:
# Cleanup
shutil.rmtree(temp_project, ignore_errors=True)
if "baseline_dir" in locals():
shutil.rmtree(baseline_dir, ignore_errors=True)