package award import ( "testing" "hamlog/internal/qso" ) func TestWPXPrefix(t *testing.T) { cases := map[string]string{ "F4BPO": "F4", "EA8ABC": "EA8", "9A1AA": "9A1", "OH2BH": "OH2", "K1ABC": "K1", "RAEM": "RA0", "F4BPO/P": "F4", "F4BPO/9": "F9", "VP8/F4BPO": "VP8", "PA0XYZ": "PA0", } for in, want := range cases { if got := wpxPrefix(in); got != want { t.Errorf("wpxPrefix(%q) = %q, want %q", in, got, want) } } } func ip(n int) *int { return &n } func TestComputeDXCCAndConfirm(t *testing.T) { qsos := []qso.QSO{ {Callsign: "K1ABC", Band: "20m", DXCC: ip(291), State: "MA", LOTWRcvd: "Y"}, {Callsign: "K2DEF", Band: "40m", DXCC: ip(291), State: "NY"}, // worked, not confirmed {Callsign: "DL1XYZ", Band: "20m", DXCC: ip(230), QSLRcvd: "Y"}, // DXCC Germany confirmed {Callsign: "F4BPO", Band: "20m", DXCC: ip(227), Notes: "nice qso D74", EQSLRcvd: "Y"}, // France dept 74 in note {Callsign: "F5ABC", Band: "40m", DXCC: ip(227), Notes: "D2A Corsica", QSLRcvd: "Y"}, // France dept 2A, confirmed } res := Compute(Defaults(), qsos, nil) by := map[string]Result{} for _, r := range res { by[r.Code] = r } dxcc := by["DXCC"] if dxcc.Worked != 3 { // USA, Germany, France t.Errorf("DXCC worked = %d, want 3", dxcc.Worked) } // DXCC confirms on lotw|qsl → USA(lotw) + Germany(qsl) + France(qsl via F5ABC). if dxcc.Confirmed != 3 { t.Errorf("DXCC confirmed = %d, want 3", dxcc.Confirmed) } was := by["WAS"] if was.Worked != 2 { // MA, NY only (France excluded by DXCC filter) t.Errorf("WAS worked = %d, want 2", was.Worked) } // DDFM scans the Note field with pattern D(\d{1,2}[AB]?): 74 and 2A. ddfm := by["DDFM"] if ddfm.Worked != 2 { t.Errorf("DDFM worked = %d, want 2 (refs %v)", ddfm.Worked, refCodes(ddfm)) } if ddfm.Confirmed != 1 { // 2A confirmed via QSL; 74 only eQSL (not accepted) t.Errorf("DDFM confirmed = %d, want 1", ddfm.Confirmed) } } func refCodes(r Result) []string { out := make([]string, 0, len(r.Refs)) for _, rf := range r.Refs { out = append(out, rf.Ref) } return out }