diff --git a/Makefile b/Makefile index 784d9bd..fbdcc93 100644 --- a/Makefile +++ b/Makefile @@ -14,8 +14,10 @@ PRETTIER := prettier --tab-width 4 --prose-wrap always # git-ignored. Targets that write outside it can commit their output. BUILD_DIR := build BIN := $(BUILD_DIR)/rogue +COVERPROF := $(BUILD_DIR)/coverage.out +COVERHTML := $(BUILD_DIR)/coverage.html -.PHONY: build check fmt fmt-check lint test +.PHONY: build check cover cover-html fmt fmt-check lint test # Format, lint, and test — the full local pre-commit gate. Keep this list # to targets that write nothing into the working tree. @@ -27,6 +29,19 @@ build: @mkdir -p $(BUILD_DIR) go build -o $(BIN) ./cmd/rogue +# Per-function coverage, for finding which functions are untested. The +# percentage `make test` prints is a per-package total and cannot answer +# that. Writes files, so it stays out of `check`. +cover: + @mkdir -p $(BUILD_DIR) + go test -timeout 30s -coverprofile=$(COVERPROF) $(GO_PKGS) + go tool cover -func=$(COVERPROF) + +# Render the same profile as annotated source. +cover-html: cover + go tool cover -html=$(COVERPROF) -o $(COVERHTML) + @echo "wrote $(COVERHTML)" + # Format Go and Markdown in place. fmt: gofmt -w . diff --git a/README.md b/README.md index 2c22419..b7b5ece 100644 --- a/README.md +++ b/README.md @@ -80,8 +80,10 @@ For development, the `Makefile` wraps the toolchain: `make fmt` (gofmt + prettier), `make lint` (`script/lint`, which runs golangci-lint inside the pinned container built from `Dockerfile.lint` — it is never installed on the host, so docker is required), `make test` (the suite, under the race detector -with coverage and a timeout), `make check` (all three), and `make build` (the -executable, into the git-ignored `build/`). Use the targets rather than the +with coverage and a timeout), `make check` (all three), `make build` (the +executable), and `make cover` / `make cover-html` (per-function coverage, and +the same profile as annotated source at `build/coverage.html`). Everything they +generate lands in the git-ignored `build/`. Use the targets rather than the toolchain directly — they carry the flags the project relies on. ## License diff --git a/TODO.md b/TODO.md index d67db14..7d2bc01 100644 --- a/TODO.md +++ b/TODO.md @@ -35,6 +35,16 @@ is finished. # Completed Steps +- 2026-08-10 `make cover` added (https://git.eeqj.de/sneak/rgoue/issues/17). + `make cover` writes `build/coverage.out` and prints the per-function report; + `make cover-html` renders the same profile to `build/coverage.html`. The + per-package percentage `make test` prints cannot say _which_ function is + untested, which is how the coverage gaps closed so far had to be found — by + grepping test files for identifiers. + + Neither target is in `check`, and neither may be added to it: both write + files, and `make check` must not modify the working tree. + - 2026-08-10 `make build` added (https://git.eeqj.de/sneak/rgoue/issues/19). The executable is built to `build/rogue`; `README.md` no longer contains a raw `go` invocation anywhere. `build` is in neither `check` nor `test` —