Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

119 рядки
3.6KB

  1. package pipeline
  2. import (
  3. "testing"
  4. "sdr-wideband-suite/internal/classifier"
  5. )
  6. func TestDecideSignalAction(t *testing.T) {
  7. policy := Policy{AutoRecordClasses: []string{"WFM"}, AutoDecodeClasses: []string{"RDS", "WFM"}}
  8. cls := &classifier.Classification{ModType: classifier.ClassWFM}
  9. decision := DecideSignalAction(policy, Candidate{ID: 1, Hint: "WFM"}, cls)
  10. if !decision.ShouldRecord {
  11. t.Fatalf("expected record decision")
  12. }
  13. if !decision.ShouldAutoDecode {
  14. t.Fatalf("expected auto decode decision")
  15. }
  16. }
  17. func TestDecideSignalActionUsesHintWithoutClass(t *testing.T) {
  18. policy := Policy{AutoRecordClasses: []string{"WFM"}, AutoDecodeClasses: []string{"FT8"}}
  19. decision := DecideSignalAction(policy, Candidate{ID: 2, Hint: "WFM"}, nil)
  20. if !decision.ShouldRecord {
  21. t.Fatalf("expected record decision from hint")
  22. }
  23. if decision.ShouldAutoDecode {
  24. t.Fatalf("unexpected auto decode decision from hint")
  25. }
  26. if decision.Reason == "" {
  27. t.Fatalf("expected reason for hint-based decision")
  28. }
  29. }
  30. func TestDecideSignalActionWindowAutoRecord(t *testing.T) {
  31. policy := Policy{
  32. MonitorWindows: finalizeMonitorWindows([]MonitorWindow{{
  33. Label: "record-zone",
  34. StartHz: 100,
  35. EndHz: 200,
  36. CenterHz: 150,
  37. SpanHz: 100,
  38. AutoRecord: true,
  39. }}),
  40. }
  41. decision := DecideSignalAction(policy, Candidate{ID: 3, CenterHz: 150}, nil)
  42. if !decision.ShouldRecord {
  43. t.Fatalf("expected window auto record decision")
  44. }
  45. if decision.Reason != DecisionReasonRecordWindow {
  46. t.Fatalf("expected window record reason, got %q", decision.Reason)
  47. }
  48. if decision.RecordWindow == nil || decision.RecordWindow.Label != "record-zone" {
  49. t.Fatalf("expected record window match to be set")
  50. }
  51. }
  52. func TestDecideSignalActionWindowAutoDecode(t *testing.T) {
  53. policy := Policy{
  54. MonitorWindows: finalizeMonitorWindows([]MonitorWindow{{
  55. Label: "decode-zone",
  56. StartHz: 300,
  57. EndHz: 350,
  58. CenterHz: 325,
  59. SpanHz: 50,
  60. AutoDecode: true,
  61. }}),
  62. }
  63. decision := DecideSignalAction(policy, Candidate{ID: 4, CenterHz: 325}, nil)
  64. if !decision.ShouldAutoDecode {
  65. t.Fatalf("expected window auto decode decision")
  66. }
  67. if decision.Reason != DecisionReasonDecodeWindow {
  68. t.Fatalf("expected window decode reason, got %q", decision.Reason)
  69. }
  70. if decision.DecodeWindow == nil || decision.DecodeWindow.Label != "decode-zone" {
  71. t.Fatalf("expected decode window match to be set")
  72. }
  73. }
  74. func TestDecideSignalActionOverlappingRecordDecodeWindows(t *testing.T) {
  75. policy := Policy{
  76. MonitorWindows: finalizeMonitorWindows([]MonitorWindow{
  77. {
  78. Label: "record-zone",
  79. StartHz: 100,
  80. EndHz: 200,
  81. CenterHz: 150,
  82. SpanHz: 100,
  83. AutoRecord: true,
  84. },
  85. {
  86. Label: "decode-zone",
  87. StartHz: 140,
  88. EndHz: 260,
  89. CenterHz: 200,
  90. SpanHz: 120,
  91. AutoDecode: true,
  92. },
  93. }),
  94. }
  95. decision := DecideSignalAction(policy, Candidate{ID: 5, CenterHz: 150}, nil)
  96. if !decision.ShouldRecord {
  97. t.Fatalf("expected record decision from overlapping window")
  98. }
  99. if !decision.ShouldAutoDecode {
  100. t.Fatalf("expected decode decision from overlapping window")
  101. }
  102. if decision.RecordWindow == nil || decision.RecordWindow.Label != "record-zone" {
  103. t.Fatalf("expected record window match to be record-zone")
  104. }
  105. if decision.DecodeWindow == nil || decision.DecodeWindow.Label != "decode-zone" {
  106. t.Fatalf("expected decode window match to be decode-zone")
  107. }
  108. if decision.MonitorDetail == nil || decision.MonitorDetail.Label != "record-zone" {
  109. t.Fatalf("expected record-zone to be preferred monitor detail, got %+v", decision.MonitorDetail)
  110. }
  111. }