import numpy as np, pandas as pd, pytest from pathlib import Path from wp35.harmonization import seshat as S ROOT = Path(__file__).resolve().parents[1] PROC = ROOT / "data" / "processed" needs_data = pytest.mark.skipif(not (PROC / "seshat_facts.parquet").exists(), reason="processed data not built") def test_presence_coding_rules(): assert S.code_presence("P")[0] == 1 and S.code_presence("IP") == (1.0, True, False, False) assert S.code_presence("A")[0] == 0 and S.code_presence("IA")[1] is True assert S.code_presence("A~P") == (0.5, False, True, False) for v in ["SU", "U", "unknown", None, np.nan, ""]: assert np.isnan(S.code_presence(v)[0]) and not S.code_presence(v)[3] assert S.code_presence("land")[3] is True # unparsed, logged, never zero def test_geometric_midpoint_and_bounds(): df = pd.DataFrame({"sheet": ["Social complexity"], "section": ["sc"], "seshat_region": ["x"], "polity_number": [1], "polity_id": ["p"], "variable_name": ["polity_population"], "value_from": [100], "value_to": [400], "year_from": [np.nan], "year_to": [np.nan], "is_disputed": [False], "is_uncertain": [False]}) f = S.build_facts({"Social complexity": df, "Warfare": df.iloc[0:0], "Religion": df.iloc[0:0], "General": df.iloc[0:0]}) assert f.value.iloc[0] == pytest.approx(200.0) and f.value_lo.iloc[0] == 100 and f.value_hi.iloc[0] == 400 and not f.dated.iloc[0] @needs_data def test_no_zero_for_missing_and_counts_match_registry(): facts = pd.read_parquet(PROC / "seshat_facts.parquet") assert facts.value.isna().sum() > 0 # unknowns stay missing assert (facts.loc[facts.variable == "polity_population", "value"].dropna() > 0).all() crisis = pd.read_parquet(PROC / "seshat_crisis.parquet") assert len(crisis) == 166 and crisis.polity_id.nunique() == 150 assert crisis.y1_severity.between(0, 1).all() meta = pd.read_parquet(PROC / "seshat_polity_meta.parquet") assert len(meta) == 626 and meta.macro_region.notna().all() and meta.era.notna().all() @needs_data def test_modern_events_are_sparse_and_in_last_regime_year(): p = pd.read_parquet(PROC / "modern_panel.parquet") assert 0 < p.y6_irregular_regime_end.mean() < 0.1 fra = p[p.country_text_id == "FRA"].set_index("year") assert fra.loc[1939, "y6_irregular_regime_end"] == 1.0 and fra.loc[1938, "y6_irregular_regime_end"] == 0.0 assert fra.loc[1958, "y6_irregular_regime_end"] == 0.0 # Fourth Republic ended by a directed process (type 10) @needs_data def test_dplace_levels(): d = pd.read_parquet(PROC / "dplace_ea_societies.parquet") assert len(d) == 1291 and d.jurisdictional_hierarchy_beyond.dropna().between(0, 4).all() assert d.Family_ID.notna().all()