suite check: заголовок правила больше не разбирается как ссылка
- заголовок правило объявляет, а не ссылается на него: при опечатке в префиксе одна ошибка формы давала вторую находку о неразрешённой ссылке - числительные в итоге согласованы с существительным
This commit is contained in:
@@ -106,6 +106,20 @@ func TestCleanSuite(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestRuleHeadingIsNotAReference держит границу между объявлением и ссылкой.
|
||||||
|
// Заголовок с чужим префиксом — ошибка формы, и только она: разрешать заголовок
|
||||||
|
// по манифесту не к чему, иначе одна опечатка даёт две находки о разном.
|
||||||
|
func TestRuleHeadingIsNotAReference(t *testing.T) {
|
||||||
|
f := base()
|
||||||
|
f["conventions/time.md"] = strings.Replace(baseTime, "### TIME-1.", "### GTIM-1.", 1)
|
||||||
|
|
||||||
|
for _, got := range run(t, f) {
|
||||||
|
if got.Family == check.Links {
|
||||||
|
t.Errorf("заголовок разобран как ссылка: %s", got.Msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// rule собирает правило целиком, чтобы тесты не повторяли его форму.
|
// rule собирает правило целиком, чтобы тесты не повторяли его форму.
|
||||||
func rule(id, title, norm, rationale string) string {
|
func rule(id, title, norm, rationale string) string {
|
||||||
return "\n### " + id + ". " + title + "\n\n**ДОЛЖЕН.** " + norm + "\n\n**ПОЧЕМУ.** " + rationale + "\n"
|
return "\n### " + id + ". " + title + "\n\n**ДОЛЖЕН.** " + norm + "\n\n**ПОЧЕМУ.** " + rationale + "\n"
|
||||||
|
|||||||
@@ -26,10 +26,17 @@ type Ref struct {
|
|||||||
// бэктиках идентификатор стоит образцом записи, а не ссылкой на утверждение, —
|
// бэктиках идентификатор стоит образцом записи, а не ссылкой на утверждение, —
|
||||||
// иначе строка «на конкретное правило ссылаются идентификатором (`SLOG-27`)»
|
// иначе строка «на конкретное правило ссылаются идентификатором (`SLOG-27`)»
|
||||||
// требовала бы, чтобы правило SLOG-27 существовало.
|
// требовала бы, чтобы правило SLOG-27 существовало.
|
||||||
|
//
|
||||||
|
// Заголовки правил пропускаются: заголовок правило объявляет, а не ссылается
|
||||||
|
// на него, и разрешать его по манифесту не к чему.
|
||||||
func refsIn(d *doc.Document, from, to int) []Ref {
|
func refsIn(d *doc.Document, from, to int) []Ref {
|
||||||
|
heading := make(map[int]bool, len(d.Rules))
|
||||||
|
for _, r := range d.Rules {
|
||||||
|
heading[r.Line] = true
|
||||||
|
}
|
||||||
var out []Ref
|
var out []Ref
|
||||||
for n := from; n <= to; n++ {
|
for n := from; n <= to; n++ {
|
||||||
if d.Fenced(n) {
|
if d.Fenced(n) || heading[n] {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
out = append(out, refsInLine(n, doc.StripInline(d.Line(n)))...)
|
out = append(out, refsInLine(n, doc.StripInline(d.Line(n)))...)
|
||||||
|
|||||||
@@ -77,8 +77,10 @@ func printReport(w io.Writer, rep *check.Report, s *suite.Suite, quiet bool) {
|
|||||||
if len(findings) > 0 {
|
if len(findings) > 0 {
|
||||||
fmt.Fprintln(w)
|
fmt.Fprintln(w)
|
||||||
}
|
}
|
||||||
fmt.Fprintf(w, "набор: %d файлов, %d тем, версия языка %d (%s)\n",
|
fmt.Fprintf(w, "набор: %s, %s, версия языка %d (%s)\n",
|
||||||
len(s.Docs), len(s.Manifest.LiveTopics()), s.Manifest.Language.Version, s.Manifest.Language.Lang)
|
plural(len(s.Docs), "файл", "файла", "файлов"),
|
||||||
|
plural(len(s.Manifest.LiveTopics()), "тема", "темы", "тем"),
|
||||||
|
s.Manifest.Language.Version, s.Manifest.Language.Lang)
|
||||||
switch {
|
switch {
|
||||||
case rep.Errors() > 0:
|
case rep.Errors() > 0:
|
||||||
fmt.Fprintf(w, "ошибок: %d, предупреждений: %d\n", rep.Errors(), rep.Warnings())
|
fmt.Fprintf(w, "ошибок: %d, предупреждений: %d\n", rep.Errors(), rep.Warnings())
|
||||||
@@ -89,6 +91,19 @@ func printReport(w io.Writer, rep *check.Report, s *suite.Suite, quiet bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// plural согласует существительное с числом: 1 файл, 2 файла, 5 файлов.
|
||||||
|
func plural(n int, one, few, many string) string {
|
||||||
|
word := many
|
||||||
|
switch {
|
||||||
|
case n%100 >= 11 && n%100 <= 14:
|
||||||
|
case n%10 == 1:
|
||||||
|
word = one
|
||||||
|
case n%10 >= 2 && n%10 <= 4:
|
||||||
|
word = few
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%d %s", n, word)
|
||||||
|
}
|
||||||
|
|
||||||
func label(s check.Severity) string {
|
func label(s check.Severity) string {
|
||||||
if s == check.Warning {
|
if s == check.Warning {
|
||||||
return "предупреждение"
|
return "предупреждение"
|
||||||
|
|||||||
Reference in New Issue
Block a user