комментарии и сообщения переведены на английский
- комментарии, тексты ошибок, вывод CLI и сообщения тестов теперь на английском - по-русски остались только литералы словаря ru и содержимое фикстур: это данные под проверкой, а не текст инструмента - согласование числительных в итоге упростилось до английского plural
This commit is contained in:
@@ -5,9 +5,9 @@ import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
// Набор с двумя слоями одной темы: базовый арх-слой и языковой поверх него.
|
||||
// На нём проверяется всё, что про оси, extends и границу самодостаточности
|
||||
// нормы, — на одном слое эти проверки выразить нечем.
|
||||
// A suite with two layers of one topic: a base architectural layer and a
|
||||
// language layer on top of it. Everything about axes, extends and the boundary
|
||||
// of a self-sufficient norm is checked here — a single layer cannot express it.
|
||||
|
||||
const layeredManifest = `
|
||||
[language]
|
||||
@@ -104,7 +104,7 @@ func layered() files {
|
||||
|
||||
func TestLayeredSuiteIsClean(t *testing.T) {
|
||||
if got := run(t, layered()); len(got) != 0 {
|
||||
t.Fatalf("исправный многослойный набор дал находки:\n%s", messages(got))
|
||||
t.Fatalf("a sound layered suite produced findings:\n%s", messages(got))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,27 +114,27 @@ func TestLayeredChecks(t *testing.T) {
|
||||
setup func(files)
|
||||
want string
|
||||
}{{
|
||||
name: "ось в шапке расходится с путём",
|
||||
name: "axis in the front matter diverges from the path",
|
||||
setup: func(f files) {
|
||||
f["conventions/lang/go/time.md"] = strings.Replace(goTime, "lang: go", "lang: python", 1)
|
||||
},
|
||||
want: `путь кладёт файл на ось lang=go, а шапка объявляет lang="python"`,
|
||||
want: `the path puts the file on axis lang=go, while the front matter declares lang="python"`,
|
||||
}, {
|
||||
name: "extends ведёт в чужую тему",
|
||||
name: "extends leads into a foreign topic",
|
||||
setup: func(f files) {
|
||||
f["conventions/lang/go/time.md"] = strings.Replace(goTime,
|
||||
"extends: arch/time.md", "extends: arch/logging.md", 1)
|
||||
},
|
||||
want: `с темой "logging", а файл несёт тему "time"`,
|
||||
want: `with topic "logging", while the file carries topic "time"`,
|
||||
}, {
|
||||
name: "extends ведёт в несуществующий файл",
|
||||
name: "extends leads into a file that does not exist",
|
||||
setup: func(f files) {
|
||||
f["conventions/lang/go/time.md"] = strings.Replace(goTime,
|
||||
"extends: arch/time.md", "extends: arch/clocks.md", 1)
|
||||
},
|
||||
want: `а такого файла в наборе нет`,
|
||||
want: `and the suite holds no such file`,
|
||||
}, {
|
||||
name: "у темы два слоя без ключей оси",
|
||||
name: "topic with two layers lacking axis keys",
|
||||
setup: func(f files) {
|
||||
f["suite.toml"] = strings.Replace(layeredManifest,
|
||||
`GTIM = "conventions/lang/go/time.md"`,
|
||||
@@ -144,23 +144,23 @@ func TestLayeredChecks(t *testing.T) {
|
||||
strings.Replace(goTime, "lang: go\n", "", 1),
|
||||
"extends: arch/time.md\n", "", 1)
|
||||
},
|
||||
want: "больше одного слоя без ключей оси",
|
||||
want: "more than one layer without axis keys",
|
||||
}, {
|
||||
name: "норма ссылается на префикс чужой темы",
|
||||
name: "norm references the prefix of a foreign topic",
|
||||
setup: func(f files) {
|
||||
f["conventions/lang/go/time.md"] = strings.Replace(goTime,
|
||||
"**ДОЛЖЕН.** Текущее время приходит из store.Now().",
|
||||
"**ДОЛЖЕН.** Текущее время приходит из store.Now() и пишется по SLOG-1.", 1)
|
||||
},
|
||||
want: `ссылается на SLOG-1 из чужой темы "logging"`,
|
||||
want: `refers to SLOG-1 from the foreign topic "logging"`,
|
||||
}, {
|
||||
name: "норма ссылается на неба́зовый слой своей темы",
|
||||
name: "norm references a non-base layer of its own topic",
|
||||
setup: func(f files) {
|
||||
f["conventions/arch/time.md"] = strings.Replace(archTime,
|
||||
"**ДОЛЖЕН.** Момент времени записывается с суффиксом Z.",
|
||||
"**ДОЛЖЕН.** Момент времени записывается с суффиксом Z, как требует GTIM-1.", 1)
|
||||
},
|
||||
want: "слой своей темы, но не базовый",
|
||||
want: "a layer of its own topic but not the base one",
|
||||
}}
|
||||
|
||||
for _, tc := range cases {
|
||||
@@ -169,55 +169,55 @@ func TestLayeredChecks(t *testing.T) {
|
||||
tc.setup(f)
|
||||
got := messages(run(t, f))
|
||||
if !strings.Contains(got, tc.want) {
|
||||
t.Fatalf("проверка не сработала\nждали: %s\nполучили:\n%s", tc.want, got)
|
||||
t.Fatalf("the check did not fire\nwanted: %s\ngot:\n%s", tc.want, got)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// TestNoFalsePositives собирает случаи, в которых проверка обязана промолчать.
|
||||
// Ложное срабатывание здесь дороже пропуска: проверку, которая краснеет на
|
||||
// исправном файле, выключают целиком.
|
||||
// TestNoFalsePositives gathers the cases where a check must stay silent. A
|
||||
// false positive costs more here than a miss: a check that goes red on a sound
|
||||
// file gets switched off altogether.
|
||||
func TestNoFalsePositives(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
setup func(files)
|
||||
}{{
|
||||
name: "идентификатор в бэктиках — образец записи, а не ссылка",
|
||||
name: "an identifier in backticks is a sample of notation, not a reference",
|
||||
setup: func(f files) {
|
||||
f["conventions/arch/time.md"] = strings.Replace(archTime,
|
||||
"Без явного смещения",
|
||||
"На правило ссылаются идентификатором (`TIME-99`). Без явного смещения", 1)
|
||||
},
|
||||
}, {
|
||||
name: "модальное слово внутри огороженного блока кода",
|
||||
name: "a modal word inside a fenced code block",
|
||||
setup: func(f files) {
|
||||
f["conventions/arch/time.md"] = archTime +
|
||||
"\n## Связано\n\n```\nДОЛЖЕН это не норма, а строка примера\n```\n"
|
||||
},
|
||||
}, {
|
||||
name: "заглавное SQL-слово в примере кода",
|
||||
name: "an uppercase SQL keyword in a code sample",
|
||||
setup: func(f files) {
|
||||
f["conventions/arch/time.md"] = strings.Replace(archTime,
|
||||
"**ПОЧЕМУ.** Без явного смещения не видно, в какой зоне запись сделана.",
|
||||
"**ПОЧЕМУ.** Без явного смещения не видно зоны.\n\n```sql\nSELECT 1 WHERE a AND b OR c\n```", 1)
|
||||
},
|
||||
}, {
|
||||
name: "норма языкового слоя ссылается на базовый слой своей темы",
|
||||
name: "a language layer's norm references the base layer of its own topic",
|
||||
setup: func(f files) {
|
||||
f["conventions/lang/go/time.md"] = strings.Replace(goTime,
|
||||
"**ДОЛЖЕН.** Текущее время приходит из store.Now().",
|
||||
"**ДОЛЖЕН.** Текущее время приходит из store.Now() в форме TIME-1.", 1)
|
||||
},
|
||||
}, {
|
||||
name: "упоминание ступени в обосновании — не вторая норма",
|
||||
name: "a mention of a step in the rationale is not a second norm",
|
||||
setup: func(f files) {
|
||||
f["conventions/arch/time.md"] = strings.Replace(archTime,
|
||||
"**ПОЧЕМУ.** Без явного смещения не видно, в какой зоне запись сделана.",
|
||||
"**ПОЧЕМУ.** Для ступени СЛЕДУЕТ это было бы честно, но здесь ломается сортировка.", 1)
|
||||
},
|
||||
}, {
|
||||
name: "заглушка снятого правила с датой и причиной",
|
||||
name: "a stub of a retired rule with a date and a reason",
|
||||
setup: func(f files) {
|
||||
f["conventions/arch/time.md"] = archTime +
|
||||
"\n### TIME-2. Ширина строки фиксируется\n\n**СНЯТО 2026-07-26.** Правило переехало в GTIM-1.\n"
|
||||
@@ -229,7 +229,7 @@ func TestNoFalsePositives(t *testing.T) {
|
||||
f := layered()
|
||||
tc.setup(f)
|
||||
if got := run(t, f); len(got) != 0 {
|
||||
t.Fatalf("проверка сработала там, где не должна:\n%s", messages(got))
|
||||
t.Fatalf("a check fired where it must not:\n%s", messages(got))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user