Module Name: src Committed By: rillig Date: Sat Jan 15 12:35:18 UTC 2022
Modified Files: src/usr.bin/make/unit-tests: directive-for.mk directive-include.mk varmod-indirect.mk varmod-order.mk varname-dot-suffixes.mk Added Files: src/usr.bin/make/unit-tests: check-expect.lua Log Message: tests/make: ensure that the 'expect' comments in tests are correct Based on tests/usr.bin/xlint/check-expect.lua. For now, this extra check needs to be run manually. To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/usr.bin/make/unit-tests/check-expect.lua cvs rdiff -u -r1.12 -r1.13 src/usr.bin/make/unit-tests/directive-for.mk cvs rdiff -u -r1.10 -r1.11 src/usr.bin/make/unit-tests/directive-include.mk \ src/usr.bin/make/unit-tests/varmod-indirect.mk cvs rdiff -u -r1.7 -r1.8 src/usr.bin/make/unit-tests/varmod-order.mk cvs rdiff -u -r1.1 -r1.2 src/usr.bin/make/unit-tests/varname-dot-suffixes.mk Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/make/unit-tests/directive-for.mk diff -u src/usr.bin/make/unit-tests/directive-for.mk:1.12 src/usr.bin/make/unit-tests/directive-for.mk:1.13 --- src/usr.bin/make/unit-tests/directive-for.mk:1.12 Sat Jan 8 10:22:03 2022 +++ src/usr.bin/make/unit-tests/directive-for.mk Sat Jan 15 12:35:18 2022 @@ -1,4 +1,4 @@ -# $NetBSD: directive-for.mk,v 1.12 2022/01/08 10:22:03 rillig Exp $ +# $NetBSD: directive-for.mk,v 1.13 2022/01/15 12:35:18 rillig Exp $ # # Tests for the .for directive. # @@ -157,10 +157,10 @@ var= outer # An empty list of variables to the left of the 'in' is a parse error. -.for in value # expect: no iteration variables in for +.for in value # expect+0: no iteration variables in for # XXX: The loop body is evaluated once, even with the parse error above. -. error # expect: Missing argument for ".error" -.endfor # expect: for-less endfor +. error # expect+0: Missing argument for ".error" +.endfor # expect+0: for-less endfor # An empty list of iteration values to the right of the 'in' is accepted. # Unlike in the shell, it is not a parse error. @@ -184,7 +184,7 @@ var= outer # is processed. .for var in value . if 0 -.endfor # expect: 1 open conditional +.endfor # expect+0: 1 open conditional # If there are no iteration values, the loop body is not processed, and the # check for mismatched conditionals is not performed. @@ -200,8 +200,8 @@ var= outer .if 0 . for var in value # does not need a corresponding .endfor .endif -.endfor # expect: for-less endfor -.endif # expect: if-less endif +.endfor # expect+0: for-less endfor +.endif # expect+0: if-less endif # When a .for without the corresponding .endfor occurs in an active branch of @@ -209,7 +209,7 @@ var= outer # without looking at any other directives. .if 1 . for var in value -. endif # expect: if-less endif +. endif # expect+0: if-less endif . endfor # no 'for-less endfor' .endif # no 'if-less endif' Index: src/usr.bin/make/unit-tests/directive-include.mk diff -u src/usr.bin/make/unit-tests/directive-include.mk:1.10 src/usr.bin/make/unit-tests/directive-include.mk:1.11 --- src/usr.bin/make/unit-tests/directive-include.mk:1.10 Fri Jan 7 08:20:00 2022 +++ src/usr.bin/make/unit-tests/directive-include.mk Sat Jan 15 12:35:18 2022 @@ -1,4 +1,4 @@ -# $NetBSD: directive-include.mk,v 1.10 2022/01/07 08:20:00 rillig Exp $ +# $NetBSD: directive-include.mk,v 1.11 2022/01/15 12:35:18 rillig Exp $ # # Tests for the .include directive, which includes another file. @@ -62,7 +62,7 @@ include /dev/null /dev/null include # XXX: trailing whitespace in diagnostic, missing quotes around filename -### expect+1: Could not find +### TODO: expect+1: Could not find # The following include directive behaves differently, depending on whether # the current file has a slash or is a relative filename. In the first case, # make opens the directory of the current file and tries to read from it, Index: src/usr.bin/make/unit-tests/varmod-indirect.mk diff -u src/usr.bin/make/unit-tests/varmod-indirect.mk:1.10 src/usr.bin/make/unit-tests/varmod-indirect.mk:1.11 --- src/usr.bin/make/unit-tests/varmod-indirect.mk:1.10 Sat Jan 8 20:21:34 2022 +++ src/usr.bin/make/unit-tests/varmod-indirect.mk Sat Jan 15 12:35:18 2022 @@ -1,4 +1,4 @@ -# $NetBSD: varmod-indirect.mk,v 1.10 2022/01/08 20:21:34 rillig Exp $ +# $NetBSD: varmod-indirect.mk,v 1.11 2022/01/15 12:35:18 rillig Exp $ # # Tests for indirect variable modifiers, such as in ${VAR:${M_modifiers}}. # These can be used for very basic purposes like converting a string to either @@ -15,7 +15,7 @@ # The following expression generates a parse error since its indirect # modifier contains more than a sole variable expression. # -# expect+1: Unknown modifier '$' +# expect+1: Unknown modifier "${" .if ${value:L:${:US}${:U,value,replacement,}} != "S,value,replacement,}" . warning unexpected .endif @@ -47,7 +47,7 @@ # error. Because of this parse error, this feature cannot be used reasonably # in practice. # -# expect+2: Unknown modifier '$' +# expect+2: Unknown modifier "${" #.MAKEFLAGS: -dvc .if ${value:L:${:UM*}S,value,replaced,} == "M*S,value,replaced,}" . warning FIXME: this expression should have resulted in a parse $\ Index: src/usr.bin/make/unit-tests/varmod-order.mk diff -u src/usr.bin/make/unit-tests/varmod-order.mk:1.7 src/usr.bin/make/unit-tests/varmod-order.mk:1.8 --- src/usr.bin/make/unit-tests/varmod-order.mk:1.7 Tue Aug 3 04:46:49 2021 +++ src/usr.bin/make/unit-tests/varmod-order.mk Sat Jan 15 12:35:18 2022 @@ -1,4 +1,4 @@ -# $NetBSD: varmod-order.mk,v 1.7 2021/08/03 04:46:49 rillig Exp $ +# $NetBSD: varmod-order.mk,v 1.8 2022/01/15 12:35:18 rillig Exp $ # # Tests for the :O variable modifier and its variants, which either sort the # words of the value or shuffle them. @@ -24,7 +24,7 @@ _:= ${NUMBERS:Onr # Shuffling numerically doesn't make sense, so don't allow 'x' and 'n' to be # combined. # -# expect-text: Bad modifier ":Oxn" for variable "NUMBERS" +# expect: make: Bad modifier ":Oxn" for variable "NUMBERS" # expect+1: Malformed conditional (${NUMBERS:Oxn}) .if ${NUMBERS:Oxn} . error @@ -35,7 +35,7 @@ _:= ${NUMBERS:Onr # Extra characters after ':On' are detected and diagnosed. # TODO: Add line number information to the "Bad modifier" diagnostic. # -# expect-text: Bad modifier ":On_typo" for variable "NUMBERS" +# expect: make: Bad modifier ":On_typo" for variable "NUMBERS" .if ${NUMBERS:On_typo} . error .else @@ -44,7 +44,7 @@ _:= ${NUMBERS:Onr # Extra characters after ':Onr' are detected and diagnosed. # -# expect-text: Bad modifier ":Onr_typo" for variable "NUMBERS" +# expect: make: Bad modifier ":Onr_typo" for variable "NUMBERS" .if ${NUMBERS:Onr_typo} . error .else @@ -53,7 +53,7 @@ _:= ${NUMBERS:Onr # Extra characters after ':Orn' are detected and diagnosed. # -# expect+1: Bad modifier ":Orn_typo" for variable "NUMBERS" +# expect: make: Bad modifier ":Orn_typo" for variable "NUMBERS" .if ${NUMBERS:Orn_typo} . error .else @@ -64,7 +64,7 @@ _:= ${NUMBERS:Onr # criteria are fixed, not computed, therefore allowing this redundancy does # not make sense. # -# expect-text: Bad modifier ":Onn" for variable "NUMBERS" +# expect: make: Bad modifier ":Onn" for variable "NUMBERS" .if ${NUMBERS:Onn} . error .else @@ -73,7 +73,7 @@ _:= ${NUMBERS:Onr # Repeating the 'r' is not supported as well, for the same reasons as above. # -# expect-text: Bad modifier ":Onrr" for variable "NUMBERS" +# expect: make: Bad modifier ":Onrr" for variable "NUMBERS" .if ${NUMBERS:Onrr} . error .else @@ -82,7 +82,7 @@ _:= ${NUMBERS:Onr # Repeating the 'r' is not supported as well, for the same reasons as above. # -# expect-text: Bad modifier ":Orrn" for variable "NUMBERS" +# expect: make: Bad modifier ":Orrn" for variable "NUMBERS" .if ${NUMBERS:Orrn} . error .else Index: src/usr.bin/make/unit-tests/varname-dot-suffixes.mk diff -u src/usr.bin/make/unit-tests/varname-dot-suffixes.mk:1.1 src/usr.bin/make/unit-tests/varname-dot-suffixes.mk:1.2 --- src/usr.bin/make/unit-tests/varname-dot-suffixes.mk:1.1 Sun Dec 12 22:16:48 2021 +++ src/usr.bin/make/unit-tests/varname-dot-suffixes.mk Sat Jan 15 12:35:18 2022 @@ -1,4 +1,4 @@ -# $NetBSD: varname-dot-suffixes.mk,v 1.1 2021/12/12 22:16:48 rillig Exp $ +# $NetBSD: varname-dot-suffixes.mk,v 1.2 2022/01/15 12:35:18 rillig Exp $ # # Tests for the special "variable" .SUFFIXES, which lists the suffixes that # have been registered for use in suffix transformation rules. Suffixes are @@ -67,7 +67,7 @@ .SUFFIXES+= append # expect: Global: .SUFFIXES = assign ignored (read-only) _:= ${.SUFFIXES::=assign} -# expect: Command: .SUFFIXES = preserve ignored (read-only) +# expect: Global: .SUFFIXES = preserve ignored (read-only) _:= ${preserve:L:_=.SUFFIXES} .MAKEFLAGS: -d0 @@ -96,6 +96,8 @@ _:= ${preserve:L:_=.SUFFIXES} .MAKEFLAGS: -dv # expect: Command: .SUFFIXES = 1 ignored (read-only) # expect: Command: .SUFFIXES = 2 ignored (read-only) +# XXX: Missing space after ':' +# expect: Command:delete .SUFFIXES (not found) .if ${1 2:L:@.SUFFIXES@${.SUFFIXES}@} != ".c .o .1 .err .tar.gz .c .o .1 .err .tar.gz" . error .endif Added files: Index: src/usr.bin/make/unit-tests/check-expect.lua diff -u /dev/null src/usr.bin/make/unit-tests/check-expect.lua:1.1 --- /dev/null Sat Jan 15 12:35:19 2022 +++ src/usr.bin/make/unit-tests/check-expect.lua Sat Jan 15 12:35:18 2022 @@ -0,0 +1,112 @@ +#! /usr/bin/lua +-- $NetBSD: check-expect.lua,v 1.1 2022/01/15 12:35:18 rillig Exp $ + +--[[ + +usage: lua ./check-expect.lua *.mk + +Check that each text from an '# expect: ...' comment in the .mk source files +occurs in the corresponding .exp file, in the same order as in the .mk file. + +Check that each text from an '# expect[+-]offset: ...' comment in the .mk +source files occurs in the corresponding .exp file and refers back to the +correct line in the .mk file. + +]] + + +local had_errors = false +---@param fmt string +function print_error(fmt, ...) + print(fmt:format(...)) + had_errors = true +end + + +---@return nil | string[] +local function load_lines(fname) + local lines = {} + + local f = io.open(fname, "r") + if f == nil then return nil end + + for line in f:lines() do + table.insert(lines, line) + end + f:close() + + return lines +end + + +---@param exp_lines string[] +local function collect_lineno_diagnostics(exp_lines) + ---@type table<string, string[]> + local by_location = {} + + for _, line in ipairs(exp_lines) do + ---@type string | nil, string, string + local l_fname, l_lineno, l_msg = + line:match("^make: \"([^\"]+)\" line (%d+): (.*)") + if l_fname ~= nil then + local location = ("%s:%d"):format(l_fname, l_lineno) + if by_location[location] == nil then + by_location[location] = {} + end + table.insert(by_location[location], l_msg) + end + end + + return by_location +end + + +local function check_mk(mk_fname) + local exp_fname = mk_fname:gsub("%.mk$", ".exp") + local mk_lines = load_lines(mk_fname) + local exp_lines = load_lines(exp_fname) + if exp_lines == nil then return end + local by_location = collect_lineno_diagnostics(exp_lines) + local prev_expect_line = 0 + + for mk_lineno, mk_line in ipairs(mk_lines) do + for text in mk_line:gmatch("#%s*expect:%s*(.*)") do + local i = prev_expect_line + while i < #exp_lines and text ~= exp_lines[i + 1] do + i = i + 1 + end + if i < #exp_lines then + prev_expect_line = i + 1 + else + print_error("error: %s:%d: '%s:%d+' must contain '%s'", + mk_fname, mk_lineno, exp_fname, prev_expect_line + 1, text) + end + end + + ---@param text string + for offset, text in mk_line:gmatch("#%s*expect([+%-]%d+):%s*(.*)") do + local location = ("%s:%d"):format(mk_fname, mk_lineno + tonumber(offset)) + + local found = false + if by_location[location] ~= nil then + for i, message in ipairs(by_location[location]) do + if message ~= "" and message:find(text, 1, true) then + by_location[location][i] = "" + found = true + break + end + end + end + + if not found then + print_error("error: %s:%d: %s must contain '%s'", + mk_fname, mk_lineno, exp_fname, text) + end + end + end +end + +for _, fname in ipairs(arg) do + check_mk(fname) +end +os.exit(not had_errors)