from option_mcp_common.indicators import adx, atr, macd, rsi, sma def test_rsi_simple(): closes = [44, 44.34, 44.09, 44.15, 43.61, 44.33, 44.83, 45.10, 45.42, 45.84, 46.08, 45.89, 46.03, 45.61, 46.28] r = rsi(closes, period=14) assert r is not None # Known textbook RSI value ballpark assert 65.0 < r < 75.0 def test_rsi_insufficient_data(): assert rsi([1, 2, 3], period=14) is None def test_sma_simple(): assert sma([1, 2, 3, 4, 5], period=5) == 3.0 assert sma([1, 2, 3], period=5) is None def test_atr_simple(): # highs, lows, closes highs = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24] lows = [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23] closes = [9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,19.5,20.5,21.5,22.5,23.5] a = atr(highs, lows, closes, period=14) assert a is not None assert 0.9 < a <= 1.5 def test_macd_trend_up(): # monotonic uptrend → MACD > 0, histogram > 0 closes = [float(i) for i in range(1, 60)] m = macd(closes) assert m["macd"] is not None assert m["signal"] is not None assert m["hist"] is not None assert m["macd"] > 0 assert m["hist"] >= 0 def test_macd_insufficient_data(): m = macd([1.0, 2.0, 3.0]) assert m == {"macd": None, "signal": None, "hist": None} def test_macd_trend_down(): closes = [float(i) for i in range(60, 1, -1)] m = macd(closes) assert m["macd"] < 0 assert m["hist"] <= 0 def test_adx_insufficient_data(): a = adx([1.0] * 10, [0.5] * 10, [0.7] * 10, period=14) assert a == {"adx": None, "+di": None, "-di": None} def test_adx_strong_uptrend(): highs = [float(i) + 1.0 for i in range(1, 40)] lows = [float(i) for i in range(1, 40)] closes = [float(i) + 0.5 for i in range(1, 40)] a = adx(highs, lows, closes, period=14) assert a["adx"] is not None assert a["+di"] is not None and a["-di"] is not None # strong uptrend → +DI >> -DI, ADX high assert a["+di"] > a["-di"] assert a["adx"] > 50.0 def test_adx_flat_market(): highs = [10.0] * 40 lows = [9.0] * 40 closes = [9.5] * 40 a = adx(highs, lows, closes, period=14) # no directional movement → ADX near 0 assert a["adx"] is not None assert a["adx"] < 5.0