1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package domain_test
4
5import (
6 "strings"
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10 "github.com/stretchr/testify/require"
11
12 "bnema.dev/ermite/internal/domain"
13)
14
15func an(level domain.AnnotationLevel, step int32, msg string) domain.CIAnnotation {
16 return domain.CIAnnotation{Level: level, Step: step, Message: msg}
17}
18
19func TestCheckAnnotationsLimits(t *testing.T) {
20 t.Parallel()
21 n, w, f := domain.AnnotationNotice, domain.AnnotationWarning, domain.AnnotationFailure
22 same := func(level domain.AnnotationLevel, step int32, count int) []domain.CIAnnotation {
23 var out []domain.CIAnnotation
24 for range count {
25 out = append(out, an(level, step, "m"))
26 }
27 return out
28 }
29 valid := map[string][]domain.CIAnnotation{
30 "none": nil,
31 "ten of a level": same(n, 1, 10),
32 "ten of each level": append(append(same(n, 1, 10), same(w, 1, 10)...), same(f, 1, 10)...),
33 "ten per level, two steps": append(same(n, 1, 10), same(n, 2, 10)...),
34 "4096 characters, 8 KiB": {an(n, 1, strings.Repeat("é", 4096))},
35 "title 255, file 1024": {{Level: n, Step: 1, Message: "m", Title: strings.Repeat("é", 255), File: strings.Repeat("é", 1024)}},
36 "step 1000": {an(n, 1000, "m")},
37 "end line equal to start": {{Level: n, Step: 1, Message: "m", StartLine: 3, EndLine: 3}},
38 "end line without start": {{Level: n, Step: 1, Message: "m", EndLine: 3}},
39 }
40 for name, anns := range valid {
41 assert.NoError(t, domain.CheckAnnotations(anns), name)
42 }
43 invalid := map[string][]domain.CIAnnotation{
44 "eleven of a level": same(w, 4, 11),
45 "no level": {{Step: 1, Message: "m"}},
46 "unknown level": {{Level: "debug", Step: 1, Message: "m"}},
47 "no message": {an(n, 1, "")},
48 "message 4097": {an(n, 1, strings.Repeat("é", 4097))},
49 "title 256": {{Level: n, Step: 1, Message: "m", Title: strings.Repeat("t", 256)}},
50 "file 1025": {{Level: n, Step: 1, Message: "m", File: strings.Repeat("f", 1025)}},
51 "step 0": {an(n, 0, "m")},
52 "step 1001": {an(n, 1001, "m")},
53 "negative line": {{Level: n, Step: 1, Message: "m", StartLine: -1}},
54 "negative column": {{Level: n, Step: 1, Message: "m", EndColumn: -1}},
55 "end before start": {{Level: n, Step: 1, Message: "m", StartLine: 4, EndLine: 3}},
56 "invalid utf-8": {an(n, 1, "a\xffb")},
57 "one bad among good": append(same(n, 1, 3), an(n, 1, "")),
58 }
59 for name, anns := range invalid {
60 err := domain.CheckAnnotations(anns)
61 require.Error(t, err, name)
62 assert.ErrorIs(t, err, domain.ErrInvalid, name)
63 }
64}
65
66func TestGroupAnnotationsKeepsTheOrderOfAStep(t *testing.T) {
67 t.Parallel()
68 by, steps := domain.GroupAnnotations([]domain.CIAnnotation{
69 an(domain.AnnotationNotice, 10, "ten-a"), an(domain.AnnotationNotice, 2, "two-a"), an(domain.AnnotationFailure, 10, "ten-b"),
70 })
71 assert.Equal(t, []int32{2, 10}, steps)
72 assert.Equal(t, "ten-a", by[10][0].Message)
73 assert.Equal(t, "ten-b", by[10][1].Message)
74}