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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
package render
import (
"strings"
"testing"
"github.com/lukaszkasprzak/lectio/internal/liturgy"
)
func TestGatherPLDedup(t *testing.T) {
sec := liturgy.Section{
Heading: "Psalm (Ps 1)",
Paragraphs: [][]string{{"stanza one"}, {"refrain"}, {"stanza two"}, {"refrain"}},
}
_, blocks := GatherVersion("pl", sec, "new", "pl")
n := 0
for _, b := range blocks {
if b == "refrain" {
n++
}
}
if n != 1 {
t.Errorf("refrain appears %d times, want 1 (deduped)", n)
}
}
func TestGatherBible(t *testing.T) {
sec := liturgy.Section{Heading: "Ewangelia (J 20, 1. 11-18)"}
label, blocks := GatherVersion("wuj", sec, "new", "pl")
if !strings.Contains(label, "Wujek") {
t.Errorf("label = %q", label)
}
if len(blocks) == 0 || !strings.HasPrefix(blocks[0], "20:1") {
t.Errorf("first block = %q", blocks)
}
}
func TestGatherTraditional(t *testing.T) {
sec := liturgy.Section{Citation: "Luke 7:36-50"}
_, blocks := GatherVersion("vul", sec, "traditional", "pl")
if len(blocks) == 0 || !strings.HasPrefix(blocks[0], "7:36") {
t.Errorf("first block = %q", blocks)
}
}
// TestGatherVersionLabelLang checks that the label's language follows the
// lang parameter -- pl reproduces today's Polish labels exactly, en gives
// the English set from internal/i18n.
func TestGatherVersionLabelLang(t *testing.T) {
sec := liturgy.Section{Heading: "Ewangelia (J 20, 1. 11-18)"}
label, _ := GatherVersion("vul", sec, "new", "pl")
if label != "Wulgata (lac.)" {
t.Errorf(`GatherVersion(..., "pl") label = %q, want "Wulgata (lac.)"`, label)
}
label, _ = GatherVersion("vul", sec, "new", "en")
if label != "Vulgate (Latin)" {
t.Errorf(`GatherVersion(..., "en") label = %q, want "Vulgate (Latin)"`, label)
}
}
// TestCompareLabelLang checks Compare's column-header row follows lang,
// same as GatherVersion (which it wraps via compareSection).
func TestCompareLabelLang(t *testing.T) {
sec := liturgy.Section{Heading: "Ewangelia (J 20, 1. 11-18)"}
out := Compare([]liturgy.Section{sec}, []string{"vul"}, 80, "new", "pl")
if !strings.Contains(out, "Wulgata (lac.)") {
t.Errorf(`Compare(..., "pl") = %q, want it to contain "Wulgata (lac.)"`, out)
}
out = Compare([]liturgy.Section{sec}, []string{"vul"}, 80, "new", "en")
if !strings.Contains(out, "Vulgate (Latin)") {
t.Errorf(`Compare(..., "en") = %q, want it to contain "Vulgate (Latin)"`, out)
}
}
func TestOfflineVersions(t *testing.T) {
got := OfflineVersions([]string{"pl", "wuj", "vul"})
for _, v := range got {
if v == "pl" {
t.Error("pl not dropped offline")
}
}
}
func TestGatherVersesBible(t *testing.T) {
sec := liturgy.Section{Heading: "Ewangelia (J 20, 1. 11-18)"}
label, verses, versified := GatherVerses("wuj", sec, "new", "pl")
if !strings.Contains(label, "Wujek") {
t.Errorf("label = %q", label)
}
if !versified {
t.Error("versified = false, want true for wuj with a resolvable citation")
}
if len(verses) == 0 {
t.Fatal("verses empty")
}
if verses[0].Chapter != 20 || verses[0].Verse != 1 || verses[0].Text == "" {
t.Errorf("verses[0] = %+v", verses[0])
}
}
func TestGatherVersesPL(t *testing.T) {
sec := liturgy.Section{
Heading: "Psalm (Ps 1)",
Paragraphs: [][]string{{"stanza one"}},
}
_, verses, versified := GatherVerses("pl", sec, "new", "pl")
if versified {
t.Error("versified = true, want false for pl (paragraph text, no verse numbers)")
}
if verses != nil {
t.Errorf("verses = %+v, want nil for pl", verses)
}
}
// TestGatherVersesLabelLang checks GatherVerses' label also follows lang,
// same as GatherVersion.
func TestGatherVersesLabelLang(t *testing.T) {
sec := liturgy.Section{Heading: "Ewangelia (J 20, 1. 11-18)"}
label, _, _ := GatherVerses("vul", sec, "new", "en")
if label != "Vulgate (Latin)" {
t.Errorf(`GatherVerses(..., "en") label = %q, want "Vulgate (Latin)"`, label)
}
}
// TestLocalizeHeading covers render.LocalizeHeading's part-label swap
// (brief §3b): the pl label prefix of a modern (niedziela.pl) heading is
// replaced by its en label, the citation kept exactly as scraped, and every
// other case (pl, unknown/traditional partID, prefix mismatch) is a safe
// no-op that returns heading unchanged.
func TestLocalizeHeading(t *testing.T) {
cases := []struct {
name, heading, partID, lang, want string
}{
{"gospel en", "Ewangelia (J 20, 1. 11-18)", "ewangelia", "en", "Gospel (J 20, 1. 11-18)"},
{"first reading en", "1. czytanie (Dz 2, 14. 22-33)", "pierwsze_czytanie", "en", "1st reading (Dz 2, 14. 22-33)"},
{"psalm en", "Psalm (Ps 15)", "psalm", "en", "Psalm (Ps 15)"},
{"acclamation en", "Aklamacja (Alleluja)", "aklamacja", "en", "Acclamation (Alleluja)"},
{"pl unchanged", "Ewangelia (J 20, 1. 11-18)", "ewangelia", "pl", "Ewangelia (J 20, 1. 11-18)"},
{"unknown partID unchanged", "Coś innego (X 1)", "", "en", "Coś innego (X 1)"},
{"already-English heading unchanged (traditional lectionary, no pl prefix to match)", "Gospel (Luke 7:36-50)", "ewangelia", "en", "Gospel (Luke 7:36-50)"},
{"prefix mismatch unchanged", "Nieoczekiwany tytuł (J 1)", "ewangelia", "en", "Nieoczekiwany tytuł (J 1)"},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
got := LocalizeHeading(c.heading, c.partID, c.lang)
if got != c.want {
t.Errorf("LocalizeHeading(%q, %q, %q) = %q, want %q", c.heading, c.partID, c.lang, got, c.want)
}
})
}
}
|