"""Phase 2 PoC #5 — pair_trawl_tier DEFAULT_PARAMS ↔ seed SQL 정적 일치.""" from __future__ import annotations import importlib import json import os import sys import types import unittest if 'pandas' not in sys.modules: pd_stub = types.ModuleType('pandas') pd_stub.DataFrame = type('DataFrame', (), {}) pd_stub.Timestamp = type('Timestamp', (), {}) sys.modules['pandas'] = pd_stub if 'pydantic_settings' not in sys.modules: stub = types.ModuleType('pydantic_settings') class _S: def __init__(self, **kw): for name, value in self.__class__.__dict__.items(): if name.isupper(): setattr(self, name, kw.get(name, value)) stub.BaseSettings = _S sys.modules['pydantic_settings'] = stub if 'algorithms' not in sys.modules: pkg = types.ModuleType('algorithms') pkg.__path__ = [os.path.join(os.path.dirname(__file__), '..', 'algorithms')] sys.modules['algorithms'] = pkg class PairTrawlParamsTest(unittest.TestCase): def test_seed_matches_default(self): pt = importlib.import_module('algorithms.pair_trawl') seed_path = os.path.join( os.path.dirname(__file__), '..', 'models_core', 'seeds', 'v1_pair_trawl.sql', ) with open(seed_path, 'r', encoding='utf-8') as f: sql = f.read() start = sql.index('$json$') + len('$json$') end = sql.index('$json$', start) params = json.loads(sql[start:end].strip()) self.assertEqual(params, pt.PAIR_TRAWL_DEFAULT_PARAMS) def test_default_values_match_module_constants(self): pt = importlib.import_module('algorithms.pair_trawl') d = pt.PAIR_TRAWL_DEFAULT_PARAMS self.assertEqual(d['strong']['proximity_nm'], pt.PROXIMITY_NM) self.assertEqual(d['strong']['sog_delta_max'], pt.SOG_DELTA_MAX) self.assertEqual(d['strong']['cog_delta_max'], pt.COG_DELTA_MAX) self.assertEqual(d['strong']['min_sync_cycles'], pt.MIN_SYNC_CYCLES) self.assertEqual(d['strong']['simultaneous_gap_min'], pt.SIMULTANEOUS_GAP_MIN) self.assertEqual(d['probable']['min_block_cycles'], pt.PROBABLE_MIN_BLOCK_CYCLES) self.assertEqual(d['probable']['min_sync_ratio'], pt.PROBABLE_MIN_SYNC_RATIO) self.assertEqual(d['suspect']['min_block_cycles'], pt.SUSPECT_MIN_BLOCK_CYCLES) self.assertEqual(d['suspect']['min_sync_ratio'], pt.SUSPECT_MIN_SYNC_RATIO) self.assertEqual(d['candidate_scan']['cell_size_deg'], pt.CELL_SIZE) if __name__ == '__main__': unittest.main()