Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

80 linhas
2.4KB

  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. }