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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# -*- 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()