aboutsummaryrefslogtreecommitdiff
path: root/internal/calendar/precedence_ef_test.go
blob: d5e254f5bd27755d28c7d141b0129cbddf44d3a4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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)
	}
}