From 15d39e640a2b8165b5e2656820382dcf9ae8c2ea Mon Sep 17 00:00:00 2001 From: Umputun Date: Sat, 31 Oct 2026 08:12:23 -0500 Subject: [PATCH 1/2] Skip _test.go files when parsing enum constants Parse grouped every package in the directory and kept the name of whichever came last in map order. With a black-box test file (package foo_test) next to the enum, the generated file got "package foo_test" in most runs and broke the build. Constants from test files also leaked into the enum, though the generated non-test file can never reference them. Test files are now ignored. Two fixtures fed to Parse were named *_test.go and are renamed to plain .go files. Related to https://github.com/go-pkgz/enum/discussions/11 --- internal/generator/generator.go | 3 ++- internal/generator/generator_test.go | 26 ++++++++++++++++++- .../testdata/{order_test.go => order.go} | 0 3 files changed, 27 insertions(+), 2 deletions(-) rename internal/generator/testdata/{order_test.go => order.go} (100%) diff --git a/internal/generator/generator.go b/internal/generator/generator.go index 9743bf4..0bb1357 100644 --- a/internal/generator/generator.go +++ b/internal/generator/generator.go @@ -107,7 +107,8 @@ func (g *Generator) Parse(dir string) error { // group parsed files by package name; mirrors the behaviour of the deprecated parser.ParseDir pkgFiles := map[string][]*ast.File{} for _, entry := range entries { - if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".go") { + // the generated file is not a test file, so it can't reference anything declared in tests + if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".go") || strings.HasSuffix(entry.Name(), "_test.go") { continue } file, err := parser.ParseFile(fset, filepath.Join(dir, entry.Name()), nil, parser.ParseComments) diff --git a/internal/generator/generator_test.go b/internal/generator/generator_test.go index b47bc22..d4a949d 100644 --- a/internal/generator/generator_test.go +++ b/internal/generator/generator_test.go @@ -372,6 +372,30 @@ func TestGenerator(t *testing.T) { }) } +func TestParseSkipsTestFiles(t *testing.T) { + // regression: a black-box test package next to the enum made the package clause random + tmpDir := t.TempDir() + files := map[string]string{ + "status.go": "package p1\ntype status int\nconst (\n\tstatusUnknown status = iota\n\tstatusActive\n)\n", + "status_internal_test.go": "package p1\nconst statusFromInternalTest status = 10\n", + "status_external_test.go": "package p1_test\nconst statusFromExternalTest = 20\n", + } + for name, body := range files { + require.NoError(t, os.WriteFile(filepath.Join(tmpDir, name), []byte(body), 0o600)) + } + + gen, err := New("status", tmpDir) + require.NoError(t, err) + require.NoError(t, gen.Parse(tmpDir)) + + assert.Equal(t, "p1", gen.pkgName) + values := map[string]int64{} + for name := range gen.values { + values[name] = constVal(t, gen, name) + } + assert.Equal(t, map[string]int64{"statusUnknown": 0, "statusActive": 1}, values) +} + func TestGeneratorValues(t *testing.T) { tmpDir := t.TempDir() @@ -665,7 +689,7 @@ const ( func TestNoLinterWarningsForUnusedConstants(t *testing.T) { tmpDir := t.TempDir() - err := os.WriteFile(filepath.Join(tmpDir, "linter_test.go"), []byte(` + err := os.WriteFile(filepath.Join(tmpDir, "linter.go"), []byte(` package test type linterTest uint8 const ( diff --git a/internal/generator/testdata/order_test.go b/internal/generator/testdata/order.go similarity index 100% rename from internal/generator/testdata/order_test.go rename to internal/generator/testdata/order.go From b904be5d7918cdad84c9a50aaeb93283c36dcae6 Mon Sep 17 00:00:00 2001 From: Umputun Date: Sat, 31 Oct 2026 12:29:06 -0500 Subject: [PATCH 2/2] Add backlog items for package selection and test-file docs A //go:build ignore file of another package in the enum directory still makes Parse pick the package clause at random. README does not say that _test.go files are skipped. Related to https://github.com/go-pkgz/enum/discussions/11 --- docs/backlog/build-ignore-file-mixes-packages.md | 15 +++++++++++++++ docs/backlog/readme-test-files-ignored.md | 11 +++++++++++ 2 files changed, 26 insertions(+) create mode 100644 docs/backlog/build-ignore-file-mixes-packages.md create mode 100644 docs/backlog/readme-test-files-ignored.md diff --git a/docs/backlog/build-ignore-file-mixes-packages.md b/docs/backlog/build-ignore-file-mixes-packages.md new file mode 100644 index 0000000..0bb6f64 --- /dev/null +++ b/docs/backlog/build-ignore-file-mixes-packages.md @@ -0,0 +1,15 @@ +--- +worth: maybe +where: internal/generator/generator.go:Parse +added: 2026-10-31 +--- +# build-ignored file of another package makes the package clause random + +`Parse` reads every non-test `.go` file in the directory without evaluating build constraints, groups +them by package and keeps whichever package the map visits last. A `//go:build ignore` helper of +`package main` next to the enum (a common pattern for generator scripts) gives the generated file +`package main` in some runs: 2 of 6 in a probe after the `_test.go` skip landed. + +Two shapes are open: honour build constraints (`go/build` or `build.Default.MatchFile`), or pick the +package the enum type is declared in instead of the last one seen. Surfaced reviewing +https://github.com/go-pkgz/enum/discussions/11. diff --git a/docs/backlog/readme-test-files-ignored.md b/docs/backlog/readme-test-files-ignored.md new file mode 100644 index 0000000..f644b6d --- /dev/null +++ b/docs/backlog/readme-test-files-ignored.md @@ -0,0 +1,11 @@ +--- +worth: later +where: README.md +added: 2026-10-31 +--- +# README does not say _test.go files are ignored + +`Parse` skips `_test.go` files, so enum constants declared in tests are never collected. The README +describes which constants are picked up but says nothing about test files, so someone declaring an +enum in a test file gets "no const values found" with no hint why. One line in the constants section +covers it.