package decode import ( "testing" "gitea.lab.audasmedia.com.au/sam/compass_teams_nhs/internal/store" ) func testCodes() store.CodeMap { return store.CodeMap{ Subject: map[string]string{"7SCF": "Year 7 Science", "11MGMAC2": "Year 11 General Maths"}, Room: map[string]string{"H14LAB": "Room H14LAB", "B11": "Room B11"}, Teacher: map[string]string{"KNI": "Mr KNI", "GT": "Mr GT"}, Period: map[string]string{"C": "Connect"}, } } // TestPeriodDecodesKnownCodes proves FR-17: a lesson reads as plain English. func TestPeriodDecodesKnownCodes(t *testing.T) { cases := map[string]string{ "1 - 7SCF - H14LAB - KNI": "Period 1 — Year 7 Science — Room H14LAB — Mr KNI", "3 - 11MGMAC2 - B11 - GT": "Period 3 — Year 11 General Maths — Room B11 — Mr GT", "C - 11MGMAC2 - B11 - GT": "Connect — Year 11 General Maths — Room B11 — Mr GT", "RLE GROUP D - IM1 - RLE": "RLE GROUP D — IM1 — RLE", "5 - 11HLEGB5 - D8": "Period 5 — 11HLEGB5 — D8", "2 - 11HLEGB5": "Period 2 — 11HLEGB5", } for raw, want := range cases { if got := Period(raw, testCodes()); got != want { t.Errorf("Period(%q) = %q, want %q", raw, got, want) } } } // TestPeriodUnknownCodesRenderRaw proves the fallback: a code that is not in // the editable map renders as the raw code, never blank (FR-17). func TestPeriodUnknownCodesRenderRaw(t *testing.T) { got := Period("1 - 7ZZZ - Z99 - ZZZ", testCodes()) want := "Period 1 — 7ZZZ — Z99 — ZZZ" if got != want { t.Errorf("Period = %q, want %q", got, want) } } // TestPeriodLeavesEventsAlone proves a school event is not mangled by the // lesson decoder. func TestPeriodLeavesEventsAlone(t *testing.T) { raw := "End of Year Senior Music Concert - HALL - KSH, CFR" if got := Period(raw, testCodes()); got != raw { t.Errorf("Period = %q, want the event unchanged", got) } } // TestLabelDecodesEventsAndLessons proves FR-17 covers timetable events too: an // ensemble or a concert reads as plain English, its room and teachers decoded, // while the event name is kept as the school wrote it. A single-part label is // returned unchanged and an unmapped code stays raw. func TestLabelDecodesEventsAndLessons(t *testing.T) { codes := testCodes() codes.Room["THEATRE"] = "Theatre" codes.Room["ENS"] = "Ensemble Room" codes.Room["IM3"] = "Room IM3" codes.Teacher["HHL"] = "Mr HHL" codes.Teacher["OFG"] = "Mr OFG" codes.Teacher["KWO"] = "Mr KWO" cases := map[string]string{ "1 - 7SCF - H14LAB - KNI": "Period 1 — Year 7 Science — Room H14LAB — Mr KNI", "JUNIOR GUITAR ENSEMBLE - THEATRE - HHL, OFG": "JUNIOR GUITAR ENSEMBLE — Theatre — Mr HHL / Mr OFG", "JAZZ ENSEMBLE - ENS - KWO": "JAZZ ENSEMBLE — Ensemble Room — Mr KWO", "HHL GUITAR E - IM3 - HHL": "HHL GUITAR E — Room IM3 — Mr HHL", "Curriculum Day": "Curriculum Day", "Concert - HALL": "Concert — HALL", } for raw, want := range cases { if got := Label(raw, codes); got != want { t.Errorf("Label(%q) = %q, want %q", raw, got, want) } } }