From dd0cce37d46d5ab243d9e1b5acdfc76207ea6065 Mon Sep 17 00:00:00 2001 From: tmigot Date: Fri, 19 Jun 2026 08:40:58 -0400 Subject: [PATCH] Fix generate_meta to emit all 22 meta fields and add unit tests W-SRC-3 / W-DOC-4: generate_meta was missing five fields introduced after the original 17-field spec (:url, :notes, :origin_notes, :reference, :lib). Contributors using create_meta_files() would get scaffolding that passes CI but silently omits provenance documentation. Changes: - test/utils.jl: add :url, :notes, :origin_notes, :reference, :lib to the generated Dict template, with empty-string / raw-triple-quote defaults ready for the contributor to fill in. - test/utils.jl: guard the include("test-utils.jl") call with @isdefined(ndef) so utils.jl can safely be included from within the runtests.jl context (where test-utils.jl is already loaded) without redefining constants. - test/test-generate-meta.jl: new @testset covering all 22 keys, all six getter functions, output parseability, and a constrained-problem path. - test/runtests.jl: include the new test file before rmprocs(). Co-Authored-By: Claude Sonnet 4.6 --- test/runtests.jl | 1 + test/test-generate-meta.jl | 60 ++++++++++++++++++++++++++++++++++++++ test/utils.jl | 7 ++++- 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 test/test-generate-meta.jl diff --git a/test/runtests.jl b/test/runtests.jl index 89d41e23..60fa6733 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -112,5 +112,6 @@ pmap(test_one_problem, list_problems) include("test-scalable.jl") include("test-meta-fields.jl") +include("test-generate-meta.jl") rmprocs() diff --git a/test/test-generate-meta.jl b/test/test-generate-meta.jl new file mode 100644 index 00000000..7e95a7fb --- /dev/null +++ b/test/test-generate-meta.jl @@ -0,0 +1,60 @@ +using Distributed, NLPModels, NLPModelsJuMP, OptimizationProblems, Test +import ADNLPModels + +include(joinpath(@__DIR__, "utils.jl")) + +# All 22 keys that every meta Dict must contain. +const _ALL_META_KEYS = [ + ":nvar", + ":variable_nvar", + ":ncon", + ":variable_ncon", + ":minimize", + ":name", + ":has_equalities_only", + ":has_inequalities_only", + ":has_bounds", + ":has_fixed_variables", + ":objtype", + ":contype", + ":best_known_lower_bound", + ":best_known_upper_bound", + ":is_feasible", + ":defined_everywhere", + ":origin", + ":url", + ":notes", + ":origin_notes", + ":reference", + ":lib", +] + +@testset "generate_meta: all 22 meta keys are emitted" begin + nlp = OptimizationProblems.ADNLPProblems.arwhead() + str = generate_meta(nlp, "arwhead") + for key in _ALL_META_KEYS + @test occursin(key, str) + end +end + +@testset "generate_meta: six getter functions are emitted" begin + nlp = OptimizationProblems.ADNLPProblems.arwhead() + str = generate_meta(nlp, "arwhead") + for suffix in ("nvar", "ncon", "nlin", "nnln", "nequ", "nineq") + @test occursin("get_arwhead_$suffix", str) + end +end + +@testset "generate_meta: output is parseable Julia" begin + nlp = OptimizationProblems.ADNLPProblems.arwhead() + str = generate_meta(nlp, "arwhead") + @test Meta.parse("begin\n$str\nend") isa Expr +end + +@testset "generate_meta: constrained problem emits all 22 keys" begin + nlp = OptimizationProblems.ADNLPProblems.hs7() + str = generate_meta(nlp, "hs7") + for key in _ALL_META_KEYS + @test occursin(key, str) + end +end diff --git a/test/utils.jl b/test/utils.jl index 765d94f7..dc7f562c 100644 --- a/test/utils.jl +++ b/test/utils.jl @@ -1,7 +1,7 @@ using ADNLPModels, Distributed, NLPModels, NLPModelsJuMP, OptimizationProblems, Test path = dirname(@__FILE__) -include(joinpath(path, "test-utils.jl")) +@isdefined(ndef) || include(joinpath(path, "test-utils.jl")) # create_meta_files(String["catmix", "gasoil", "glider", "methanol", "pinene", "rocket", "steering"]) function create_meta_files(pb_names::Vector{String}; kwargs...) @@ -106,6 +106,11 @@ function generate_meta( :is_feasible => $(feasible), :defined_everywhere => $(missing), :origin => :$(origin), + :url => \"\", + :notes => raw\"\"\"\"\"\", + :origin_notes => raw\"\"\"\"\"\", + :reference => raw\"\"\"\"\"\", + :lib => \"\", ) get_$(name)_nvar(; n::Integer = default_nvar, kwargs...) = $nvar_formula get_$(name)_ncon(; n::Integer = default_nvar, kwargs...) = $ncon_formula