from __future__ import annotations from datetime import date import unittest from dragon_deep_oversold_classifier import ( deep_oversold_base_entry, deep_oversold_requires_confirmation, deep_oversold_selective_veto, deep_oversold_subtype, ) from dragon_deep_oversold_confirmation import evaluate_pending_confirmation, should_increment_pending from dragon_strategy_config import StrategyConfig class TestDeepOversoldModules(unittest.TestCase): def test_subtype_classification(self) -> None: self.assertEqual(deep_oversold_subtype(a1=-0.01, b1=0.01, c1=13.0), "positive_b1_rebound") self.assertEqual(deep_oversold_subtype(a1=-0.06, b1=-0.09, c1=10.5), "deep_capitulation") self.assertEqual(deep_oversold_subtype(a1=-0.05, b1=-0.07, c1=11.5), "classic_oversold") def test_base_entry_and_selective_veto(self) -> None: cfg = StrategyConfig( deep_oversold_selective_positive_b1_c1_max=15.3, deep_oversold_confirm_weak_with_ql=True, ) self.assertTrue(deep_oversold_base_entry(a1=-0.03, b1=-0.08, c1=12.0, config=cfg)) self.assertTrue( deep_oversold_selective_veto( subtype="positive_b1_rebound", c1=14.0, b1=0.02, ql_buy=True, config=cfg, ) ) self.assertTrue( deep_oversold_requires_confirmation( subtype="shallow_false_start", ql_buy=False, config=cfg, ) ) def test_pending_confirmation_flow(self) -> None: self.assertTrue( should_increment_pending( active=True, subtype="shallow_false_start", origin_date=date(2026, 4, 8), row_date=date(2026, 4, 9), ) ) action, reason, clear = evaluate_pending_confirmation( active=True, subtype="shallow_false_start", in_position=False, kdj_sell=False, ql_sell=False, bars_waited=1, window_bars=2, ql_buy=True, ) self.assertEqual(action, "BUY") self.assertIn("confirmed_shallow_false_start", reason) self.assertTrue(clear) if __name__ == "__main__": unittest.main()