package calendar import "testing" func efCand(rank Rank, temporal bool) candidate { return candidate{Cel: Celebration{Rank: rank}, Temporal: temporal} } // efTemporalCand builds a temporal candidate with the season/Sunday flags // precedenceEF's tie-break actually reads, so a test claiming to exercise // "a Sunday" or "a Lenten feria" genuinely sets those fields rather than // happening to pass for an unrelated reason (e.g. a class difference alone). func efTemporalCand(rank Rank, season Season, sunday bool) candidate { return candidate{Cel: Celebration{Rank: rank}, Temporal: true, Season: season, Sunday: sunday} } func TestPrecedenceEF(t *testing.T) { c1 := efCand(RankClass1, false) c3 := efCand(RankClass3, false) c4 := efCand(RankClass4, false) comm := efCand(RankCommemoration, false) if !(precedenceEF(c1) < precedenceEF(c3) && precedenceEF(c3) < precedenceEF(c4) && precedenceEF(c4) < precedenceEF(comm)) { t.Error("EF class ordering broken (class-1 > class-3 > class-4 > commemoration)") } // a I-class feast beats a II-class Sunday (RG 91 entry 11 vs entry 15 -- // different classes, so this holds regardless of the tie-break, but the // candidate is still marked Sunday so the test means what its name says). sunday2 := efTemporalCand(RankClass2, TimeAfterPentecost, true) feast1 := efCand(RankClass1, false) obs, others := pickEF([]candidate{sunday2, feast1}) if obs.Cel.Rank != RankClass1 || len(others) != 1 { t.Errorf("I-class feast should win over II-class Sunday, got %+v", obs.Cel) } } // TestPrecedenceEFClass2SundayVsFeria: RG 91 entries 15/16/18 -- at class 2, // a SUNDAY wins its tie against an equal-class feast (entry 15 above 16), but // a privileged FERIA (the Ember days, the late-Advent 17-23 Dec ferias, entry // 18) YIELDS to one (entry 16 above 18) -- the opposite of the Sunday case. // This is defect 2's own witness: before the fix, precedenceEF treated every // non-ordinaryFeria temporal candidate the same way, so an Ember/late-Advent // feria wrongly won its tie exactly like a Sunday does. func TestPrecedenceEFClass2SundayVsFeria(t *testing.T) { saint := efCand(RankClass2, false) sunday := efTemporalCand(RankClass2, TimeAfterPentecost, true) obsSunday, _ := pickEF([]candidate{saint, sunday}) if !obsSunday.Temporal { t.Errorf("a II-class Sunday should win its tie against an equal-class feast, got %+v observed", obsSunday.Cel) } emberFeria := efTemporalCand(RankClass2, TimeAfterPentecost, false) // e.g. the September Ember Wednesday obsFeria, _ := pickEF([]candidate{saint, emberFeria}) if obsFeria.Temporal { t.Errorf("a II-class privileged feria should yield its tie to an equal-class feast, got %+v observed (temporal)", obsFeria.Cel) } } // TestPrecedenceEFClass3FeriaSeason: the pre-existing rule (unchanged by // defect 2's fix), stated explicitly rather than left implicit: an ORDINARY // III/IV-class feria (per annum, Advent to 16 Dec, Septuagesima) yields to an // equal-class feast; the ferias of Lent and Passiontide are privileged and // win instead. func TestPrecedenceEFClass3FeriaSeason(t *testing.T) { saint := efCand(RankClass3, false) ordinary := efTemporalCand(RankClass3, Advent, false) obsOrdinary, _ := pickEF([]candidate{saint, ordinary}) if obsOrdinary.Temporal { t.Errorf("an ordinary Advent feria should yield to an equal-class feast, got %+v observed (temporal)", obsOrdinary.Cel) } lenten := efTemporalCand(RankClass3, Lent, false) obsLenten, _ := pickEF([]candidate{saint, lenten}) if !obsLenten.Temporal { t.Errorf("a Lenten feria should win its tie against an equal-class feast, got %+v observed", obsLenten.Cel) } }