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.

51 lines
2.3 KiB

# -*- coding: utf-8 -*-
import unittest
import sys
import os
# Ensure src module can be imported
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.storage import DatabaseManager
class TestStorage(unittest.TestCase):
def test_parse_sniper_value(self):
"""测试解析狙击点位数值"""
# 1. 正常数值
self.assertEqual(DatabaseManager._parse_sniper_value(100), 100.0)
self.assertEqual(DatabaseManager._parse_sniper_value(100.5), 100.5)
self.assertEqual(DatabaseManager._parse_sniper_value("100"), 100.0)
self.assertEqual(DatabaseManager._parse_sniper_value("100.5"), 100.5)
# 2. 包含中文描述和"元"
self.assertEqual(DatabaseManager._parse_sniper_value("建议在 100 元附近买入"), 100.0)
self.assertEqual(DatabaseManager._parse_sniper_value("价格100.5元"), 100.5)
# 3. 包含干扰数字修复的Bug场景
# 之前 "MA5" 会被错误提取为 5.0,现在应该提取 "元" 前面的 100
text_bug = "无法给出。需等待MA5数据恢复在股价回踩MA5且乖离率<2%时考虑100元"
self.assertEqual(DatabaseManager._parse_sniper_value(text_bug), 100.0)
# 4. 更多干扰场景
text_complex = "MA10为20.5建议在30元买入"
self.assertEqual(DatabaseManager._parse_sniper_value(text_complex), 30.0)
text_multiple = "支撑位10元阻力位20元" # 应该提取最后一个"元"前面的数字即20或者更复杂的逻辑
# 当前逻辑是找最后一个冒号,然后找之后的第一个"元",提取中间的数字。
# 测试没有冒号的情况
self.assertEqual(DatabaseManager._parse_sniper_value("30元"), 30.0)
# 测试多个数字在"元"之前
self.assertEqual(DatabaseManager._parse_sniper_value("MA5 10 20元"), 20.0)
# 5. 无效输入
self.assertIsNone(DatabaseManager._parse_sniper_value(None))
self.assertIsNone(DatabaseManager._parse_sniper_value(""))
self.assertIsNone(DatabaseManager._parse_sniper_value("没有数字"))
self.assertIsNone(DatabaseManager._parse_sniper_value("MA5但没有元"))
if __name__ == '__main__':
unittest.main()