test_state_validator.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from data_modules.state_validator import (
  4. FORESHADOWING_STATUS_PENDING,
  5. FORESHADOWING_STATUS_RESOLVED,
  6. FORESHADOWING_TIER_CORE,
  7. FORESHADOWING_TIER_DECOR,
  8. FORESHADOWING_TIER_SUB,
  9. count_patterns,
  10. get_chapter_meta_entry,
  11. is_resolved_foreshadowing_status,
  12. normalize_chapter_meta,
  13. normalize_foreshadowing_item,
  14. normalize_foreshadowing_status,
  15. normalize_foreshadowing_tier,
  16. normalize_state_runtime_sections,
  17. resolve_chapter_field,
  18. split_patterns,
  19. to_positive_int,
  20. )
  21. def test_to_positive_int_and_resolve_chapter_field():
  22. assert to_positive_int(12) == 12
  23. assert to_positive_int("ch-18") == 18
  24. assert to_positive_int(0) is None
  25. assert to_positive_int("no number") is None
  26. item = {"added_chapter": "第15章", "target": "200"}
  27. assert resolve_chapter_field(item, ["planted_chapter", "added_chapter"]) == 15
  28. assert resolve_chapter_field(item, ["target_chapter", "target"]) == 200
  29. def test_status_and_tier_normalization():
  30. assert normalize_foreshadowing_status("pending") == FORESHADOWING_STATUS_PENDING
  31. assert normalize_foreshadowing_status("resolved") == FORESHADOWING_STATUS_RESOLVED
  32. assert normalize_foreshadowing_status("") == FORESHADOWING_STATUS_PENDING
  33. assert is_resolved_foreshadowing_status("已回收") is True
  34. assert is_resolved_foreshadowing_status("active") is False
  35. assert normalize_foreshadowing_tier("core") == FORESHADOWING_TIER_CORE
  36. assert normalize_foreshadowing_tier("decoration") == FORESHADOWING_TIER_DECOR
  37. assert normalize_foreshadowing_tier("unknown") == FORESHADOWING_TIER_SUB
  38. def test_pattern_split_and_count():
  39. assert split_patterns(["A", " A ", "B", ""]) == ["A", "B"]
  40. assert split_patterns("A, B / C|A") == ["A", "B", "C"]
  41. assert count_patterns("A,B,C") == 3
  42. assert count_patterns(123) is None
  43. def test_normalize_foreshadowing_item_and_chapter_meta_entry():
  44. item = {
  45. "content": " 遗迹钥匙 ",
  46. "status": "pending",
  47. "tier": "main",
  48. "added_chapter": "第30章",
  49. "target": "120",
  50. }
  51. normalized_item = normalize_foreshadowing_item(item)
  52. assert normalized_item["content"] == "遗迹钥匙"
  53. assert normalized_item["status"] == FORESHADOWING_STATUS_PENDING
  54. assert normalized_item["tier"] == FORESHADOWING_TIER_CORE
  55. assert normalized_item["planted_chapter"] == 30
  56. assert normalized_item["target_chapter"] == 120
  57. state = {
  58. "chapter_meta": {
  59. "0003": {"coolpoint_pattern": "反杀, 掉马"},
  60. "7": {"patterns": ["翻车", "反杀"]},
  61. }
  62. }
  63. meta3 = get_chapter_meta_entry(state, 3)
  64. assert meta3["coolpoint_patterns"] == ["反杀", "掉马"]
  65. meta7 = get_chapter_meta_entry(state, 7)
  66. assert meta7["coolpoint_patterns"] == ["翻车", "反杀"]
  67. def test_normalize_state_runtime_sections():
  68. state = {
  69. "plot_threads": {
  70. "foreshadowing": [
  71. {"content": "伏笔A", "status": "active", "tier": "decor", "chapter": 11, "target": 99},
  72. "invalid",
  73. ]
  74. },
  75. "chapter_meta": {
  76. 1: {"cool_point_pattern": "打脸|翻车"},
  77. "bad": "invalid",
  78. },
  79. }
  80. normalized = normalize_state_runtime_sections(state)
  81. assert len(normalized["plot_threads"]["foreshadowing"]) == 1
  82. first = normalized["plot_threads"]["foreshadowing"][0]
  83. assert first["status"] == FORESHADOWING_STATUS_PENDING
  84. assert first["tier"] == FORESHADOWING_TIER_DECOR
  85. assert first["planted_chapter"] == 11
  86. assert first["target_chapter"] == 99
  87. chapter_meta = normalize_chapter_meta(normalized["chapter_meta"])
  88. assert "1" in chapter_meta
  89. assert chapter_meta["1"]["coolpoint_patterns"] == ["打脸", "翻车"]