Reported on 3 cm. cat.BandFromHz stopped at 23 cm, so a 10 GHz frequency came back EMPTY — and an empty band is not cosmetic: the QSO is logged without one, counts in no award slot, and exports with no BAND field. The low end was short too (2190m / 630m / 560m). Four band tables had to be extended because four exist: the CAT one, the award plan in app.go, the cluster spot classifier, and the frontend's. Plus the places that LIST bands — the QSO editor and award-definition pickers (you could not set 3 cm by hand either), the statistics axis, and the award band ORDER, where a missing band sorts to the end instead of in frequency order. Ranges and names are ADIF 3.1.7, which is what an export has to carry. A test now pins one frequency per band across the Go tables and asserts they agree — that is what was missing, four hand-maintained copies with nothing checking them. It also pins that an out-of-band frequency stays empty rather than snapping to the nearest band, which would file a QSO under a band the operator never used.
74 lines
2.2 KiB
Go
74 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"hamlog/internal/cat"
|
|
)
|
|
|
|
// Three band tables exist in Go — cat.BandFromHz (the rig/CAT one), bandForHz
|
|
// (awards) and the cluster's own — plus one in App.tsx. They must agree, and
|
|
// nothing checked it: the CAT one stopped at 23 cm, so a 10 GHz QSO came back
|
|
// with an EMPTY band. An empty band is not a cosmetic problem — it is not
|
|
// logged, not counted in any award slot, and exports without a BAND field.
|
|
//
|
|
// One frequency per band, taken inside the range, plus the edges that used to be
|
|
// missing entirely.
|
|
func TestBandPlansAgree(t *testing.T) {
|
|
cases := []struct {
|
|
hz int64
|
|
want string
|
|
}{
|
|
{137000, "2190m"},
|
|
{475000, "630m"},
|
|
{1840000, "160m"},
|
|
{3650000, "80m"},
|
|
{7100000, "40m"},
|
|
{10120000, "30m"},
|
|
{14200000, "20m"},
|
|
{18100000, "17m"},
|
|
{21200000, "15m"},
|
|
{24940000, "12m"},
|
|
{28400000, "10m"},
|
|
{50150000, "6m"},
|
|
{70200000, "4m"},
|
|
{144300000, "2m"},
|
|
{223500000, "1.25m"},
|
|
{432000000, "70cm"},
|
|
{1296000000, "23cm"},
|
|
// The microwave bands that were missing. 3 cm is the one an operator
|
|
// reported: 10 GHz is worked and spotted, and resolved to nothing.
|
|
{2320000000, "13cm"},
|
|
{3400000000, "9cm"},
|
|
{5760000000, "6cm"},
|
|
{10368000000, "3cm"},
|
|
{24048000000, "1.25cm"},
|
|
{47088000000, "6mm"},
|
|
{76032000000, "4mm"},
|
|
{122250000000, "2.5mm"},
|
|
{134928000000, "2mm"},
|
|
{241920000000, "1mm"},
|
|
}
|
|
for _, c := range cases {
|
|
if got := cat.BandFromHz(c.hz); got != c.want {
|
|
t.Errorf("cat.BandFromHz(%d) = %q, want %q", c.hz, got, c.want)
|
|
}
|
|
if got := bandForHz(c.hz); got != c.want {
|
|
t.Errorf("bandForHz(%d) = %q, want %q — the award band plan disagrees with the CAT one", c.hz, got, c.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// A frequency in no amateur band must resolve to "" everywhere, not to the
|
|
// nearest band: guessing here would put a QSO in a band the operator never used.
|
|
func TestBandPlanRejectsOutOfBand(t *testing.T) {
|
|
for _, hz := range []int64{100_000_000, 1_000_000_000, 15_000_000_000} {
|
|
if got := cat.BandFromHz(hz); got != "" {
|
|
t.Errorf("cat.BandFromHz(%d) = %q, want empty", hz, got)
|
|
}
|
|
if got := bandForHz(hz); got != "" {
|
|
t.Errorf("bandForHz(%d) = %q, want empty", hz, got)
|
|
}
|
|
}
|
|
}
|