pkgsrc/pkgtools/pkglint/files/line_test.go
rillig 1d1d611496 pkgtools/pkglint: update to 21.2.1
Changes since 21.2.0:

Files whose names ends in '~' are ignored by pkglint since they are
ignored by CVS as well.

Variables with name BUILDLINK_TRANSFORM.* may contain '-Wl,-rpath,'
directly in commands of the form 'rm:*', just like their counterpart
BUILDLINK_TRANSFORM without a package name in the variable name.

Several new tests.
2021-06-25 14:15:00 +00:00

282 lines
6.4 KiB
Go

package pkglint
import (
"gopkg.in/check.v1"
"netbsd.org/pkglint/regex"
)
func (s *Suite) Test_RawLine_Orig(c *check.C) {
t := s.Init(c)
line := t.NewLine("filename", 123, "text")
t.CheckEquals(line.raw[0].orignl, "text\n")
t.CheckEquals(line.raw[0].Orig(), "text")
}
func (s *Suite) Test_NewLocation(c *check.C) {
t := s.Init(c)
loc := NewLocation("subdir/filename", 123)
t.CheckEquals(loc.Filename, NewCurrPathString("subdir/filename"))
t.CheckEquals(loc.lineno, 123)
}
func (s *Suite) Test_Location_Lineno(c *check.C) {
t := s.Init(c)
loc := NewLocation("subdir/filename", 123)
t.CheckEquals(loc.Lineno(0), 123)
}
func (s *Suite) Test_Location_File(c *check.C) {
t := s.Init(c)
loc := NewLocation("subdir/filename", 123)
t.CheckEquals(loc.File("other"), NewCurrPathString("subdir/other"))
}
func (s *Suite) Test_NewLine__assertion(c *check.C) {
t := s.Init(c)
t.ExpectAssert(func() { NewLine("filename", 123, "text", nil) })
}
func (s *Suite) Test_NewLineMulti(c *check.C) {
t := s.Init(c)
line := NewLineMulti("subdir/filename", 123, "", []*RawLine{nil, nil, nil})
t.CheckEquals(line.Filename(), NewCurrPathString("subdir/filename"))
t.CheckEquals(line.Linenos(), "123--125")
}
func (s *Suite) Test_NewLineEOF(c *check.C) {
t := s.Init(c)
line := NewLineEOF("subdir/filename")
t.CheckEquals(line.Filename(), NewCurrPathString("subdir/filename"))
t.CheckEquals(line.Linenos(), "EOF")
}
func (s *Suite) Test_NewLineWhole(c *check.C) {
t := s.Init(c)
line := NewLineWhole("subdir/filename")
t.CheckEquals(line.Filename(), NewCurrPathString("subdir/filename"))
t.CheckEquals(line.Linenos(), "")
}
func (s *Suite) Test_Line_Filename(c *check.C) {
t := s.Init(c)
line := t.NewLine("subdir/filename", 123, "")
t.CheckEquals(line.Filename(), NewCurrPathString("subdir/filename"))
}
func (s *Suite) Test_Line_File(c *check.C) {
t := s.Init(c)
line := t.NewLine("subdir/filename", 123, "")
t.CheckEquals(line.File("subsub/nested"),
NewCurrPathString("subdir/subsub/nested"))
}
func (s *Suite) Test_Line_Linenos(c *check.C) {
t := s.Init(c)
single := t.NewLine("filename", 123, "")
whole := NewLineWhole("filename")
multi := NewLineMulti("filename", 123, "text", []*RawLine{nil, nil, nil})
t.CheckEquals(single.Linenos(), "123")
t.CheckEquals(whole.Linenos(), "")
t.CheckEquals(multi.Linenos(), "123--125")
}
func (s *Suite) Test_Line_RelLine__assertion(c *check.C) {
t := s.Init(c)
line := t.NewLine("filename", 123, "")
whole := NewLineWhole("filename")
t.ExpectAssert(func() { line.RelLine(whole) })
}
func (s *Suite) Test_Line_RelLocation__assertion(c *check.C) {
t := s.Init(c)
line := t.NewLine("filename", 123, "")
whole := NewLineWhole("filename")
t.ExpectAssert(func() { line.RelLocation(whole.Location) })
}
func (s *Suite) Test_Line_Rel(c *check.C) {
t := s.Init(c)
t.Chdir(".")
line1 := t.NewLine("subdir/filename", 123, "from")
rel := line1.Rel("other/filename")
t.CheckEquals(rel, NewRelPathString("../other/filename"))
}
func (s *Suite) Test_Line_IsMultiline(c *check.C) {
t := s.Init(c)
t.CheckEquals(t.NewLine("filename", 123, "text").IsMultiline(), false)
t.CheckEquals(NewLineEOF("filename").IsMultiline(), false)
multi := NewLineMulti("filename", 123, "text", []*RawLine{nil, nil, nil})
t.CheckEquals(multi.IsMultiline(), true)
}
func (s *Suite) Test_Line_RawText(c *check.C) {
t := s.Init(c)
t.SetUpCommandLine("--show-autofix")
line := t.NewLine("filename", 123, "text")
t.CheckEquals(line.RawText(0), "text")
fix := line.Autofix()
fix.Notef("Replacing.")
fix.Replace("text", "replaced")
fix.Apply()
t.CheckEquals(line.RawText(0), "replaced")
t.CheckOutputLines(
"NOTE: filename:123: Replacing.",
"AUTOFIX: filename:123: Replacing \"text\" with \"replaced\".")
}
func (s *Suite) Test_Line_IsCvsID(c *check.C) {
t := s.Init(c)
test := func(text string, prefix regex.Pattern, expectedID bool, expectedExpanded bool) {
line := t.NewLine("filename", 123, text)
id, expanded := line.IsCvsID(prefix)
t.CheckEquals(id, expectedID)
t.CheckEquals(expanded, expectedExpanded)
}
test(CvsID, ``, true, false)
test("$"+"NetBSD: ... $", ``, true, true)
}
func (s *Suite) Test_Line_Errorf(c *check.C) {
t := s.Init(c)
line := t.NewLine("filename", 123, "text")
line.Errorf("For your information.")
t.CheckOutputLines(
"ERROR: filename:123: For your information.")
}
func (s *Suite) Test_Line_Warnf(c *check.C) {
t := s.Init(c)
line := t.NewLine("filename", 123, "text")
line.Warnf("For your information.")
t.CheckOutputLines(
"WARN: filename:123: For your information.")
}
func (s *Suite) Test_Line_Notef(c *check.C) {
t := s.Init(c)
line := t.NewLine("filename", 123, "text")
line.Notef("For your information.")
t.CheckOutputLines(
"NOTE: filename:123: For your information.")
}
func (s *Suite) Test_Line_Explain(c *check.C) {
t := s.Init(c)
t.SetUpCommandLine("--explain")
line := t.NewLine("filename", 123, "text")
line.Notef("For your information.")
line.Explain(
"First line",
"continues.")
t.CheckOutputLines(
"NOTE: filename:123: For your information.",
"",
"\tFirst line continues.",
"")
}
func (s *Suite) Test_Line_Explain__without_diagnostic(c *check.C) {
t := s.Init(c)
t.SetUpCommandLine("--explain")
line := t.NewLine("filename", 123, "text")
// It is unusual to have an explanation without any preceding
// diagnostic.
line.Explain(
"First line",
"continues.")
// There is no empty line above the explanation since that is the
// job of the SeparatorWriter, which only steps in if there is a
// diagnostic above the explanation.
t.CheckOutputLines(
"\tFirst line continues.",
"")
}
func (s *Suite) Test_Line_String(c *check.C) {
t := s.Init(c)
line := t.NewLine("filename", 123, "text")
t.CheckEquals(line.String(), "filename:123: text")
// Since Line.String is only used for debugging purposes, trailing
// whitespace is OK.
t.CheckEquals(NewLineEOF("filename").String(), "filename:EOF: ")
multi := NewLineMulti("filename", 123, "text", []*RawLine{nil, nil, nil})
t.CheckEquals(multi.String(), "filename:123--125: text")
}
func (s *Suite) Test_Line_Autofix__reuse_incomplete(c *check.C) {
t := s.Init(c)
line := t.NewLine("filename.mk", 1, "")
fix := line.Autofix()
fix.Warnf("Warning.")
// For some reason, the other required calls are left out.
t.ExpectAssert(func() { _ = line.Autofix() })
// Properly finish the standard call sequence for an Autofix.
fix.Apply()
t.CheckOutputLines(
"WARN: filename.mk:1: Warning.")
}