You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.7 KiB
137 lines
3.7 KiB
# tests/test_validate_svd_themes.py
|
|
"""Tests for scripts/validate_svd_themes.py."""
|
|
|
|
import pytest
|
|
|
|
|
|
def test_check_canonical_right_on_right_no_left_right_pole():
|
|
"""Validation should work without left_pole/right_pole in themes."""
|
|
import sys
|
|
|
|
sys.path.insert(0, ".")
|
|
from scripts.validate_svd_themes import check_canonical_right_on_right
|
|
|
|
# Mock party positions
|
|
party_positions = {
|
|
"PVV": {1: 0.5},
|
|
"FVD": {1: 0.4},
|
|
"SP": {1: -0.5},
|
|
"GroenLinks-PvdA": {1: -0.4},
|
|
}
|
|
party_avg_vectors = {
|
|
"PVV": [0.5],
|
|
"FVD": [0.4],
|
|
"SP": [-0.5],
|
|
"GroenLinks-PvdA": [-0.4],
|
|
}
|
|
|
|
# Themes WITHOUT left_pole/right_pole
|
|
themes = {
|
|
1: {
|
|
"label": "Test axis",
|
|
"positive_pole": "Right",
|
|
"negative_pole": "Left",
|
|
"flip": False,
|
|
}
|
|
}
|
|
|
|
canonical_right = frozenset(["PVV", "FVD"])
|
|
canonical_left = frozenset(["SP", "GroenLinks-PvdA"])
|
|
|
|
divergences = check_canonical_right_on_right(
|
|
party_positions,
|
|
party_avg_vectors,
|
|
themes,
|
|
canonical_right,
|
|
canonical_left,
|
|
num_components=1,
|
|
)
|
|
|
|
# Should return empty list (no divergences) because right parties are on right
|
|
assert divergences == []
|
|
|
|
|
|
def test_check_canonical_right_on_right_detects_divergence():
|
|
"""Validation should detect when right parties are NOT on right."""
|
|
import sys
|
|
|
|
sys.path.insert(0, ".")
|
|
from scripts.validate_svd_themes import check_canonical_right_on_right
|
|
|
|
# Mock party positions where right parties are on LEFT
|
|
# The flip will be computed as True (since right_mean=-0.45 < left_mean=0.45)
|
|
# After flip: right parties will be on the RIGHT side (correct)
|
|
# So no divergence in this case - the flip mechanism works
|
|
party_positions = {
|
|
"PVV": {1: -0.5}, # Right party on left side
|
|
"FVD": {1: -0.4},
|
|
"SP": {1: 0.5}, # Left party on right side
|
|
"GroenLinks-PvdA": {1: 0.4},
|
|
}
|
|
party_avg_vectors = {
|
|
"PVV": [-0.5],
|
|
"FVD": [-0.4],
|
|
"SP": [0.5],
|
|
"GroenLinks-PvdA": [0.4],
|
|
}
|
|
|
|
themes = {
|
|
1: {
|
|
"label": "Test axis",
|
|
"positive_pole": "Right",
|
|
"negative_pole": "Left",
|
|
"flip": False, # Will be overridden by compute_flip_direction
|
|
}
|
|
}
|
|
|
|
canonical_right = frozenset(["PVV", "FVD"])
|
|
canonical_left = frozenset(["SP", "GroenLinks-PvdA"])
|
|
|
|
divergences = check_canonical_right_on_right(
|
|
party_positions,
|
|
party_avg_vectors,
|
|
themes,
|
|
canonical_right,
|
|
canonical_left,
|
|
num_components=1,
|
|
)
|
|
|
|
# No divergence because flip=True was computed and corrected the issue
|
|
assert divergences == []
|
|
|
|
|
|
def test_check_canonical_right_on_right_missing_party_data():
|
|
"""Validation should detect when canonical party data is missing."""
|
|
import sys
|
|
|
|
sys.path.insert(0, ".")
|
|
from scripts.validate_svd_themes import check_canonical_right_on_right
|
|
|
|
# Empty party positions - no data for canonical parties
|
|
party_positions = {}
|
|
party_avg_vectors = {}
|
|
|
|
themes = {
|
|
1: {
|
|
"label": "Test axis",
|
|
"positive_pole": "Right",
|
|
"negative_pole": "Left",
|
|
"flip": False,
|
|
}
|
|
}
|
|
|
|
canonical_right = frozenset(["PVV", "FVD"])
|
|
canonical_left = frozenset(["SP", "GroenLinks-PvdA"])
|
|
|
|
divergences = check_canonical_right_on_right(
|
|
party_positions,
|
|
party_avg_vectors,
|
|
themes,
|
|
canonical_right,
|
|
canonical_left,
|
|
num_components=1,
|
|
)
|
|
|
|
# Should detect missing party data
|
|
assert len(divergences) == 1
|
|
assert divergences[0]["issue"] == "missing_canonical_party_data"
|
|
|