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