From 1f67d1acad5552f783cd2b4bc8e1ca1a0a6a0045 Mon Sep 17 00:00:00 2001 From: Steve Kelly Date: Mon, 10 Apr 2023 15:08:57 -0400 Subject: [PATCH] fix definition availability when `Gtk` is absent (#38) * fix definition availability when Gtk.jl is not present When running tests in environments without Gtk.jl, this gives undefined errors. This change should allow the "auto" path to be run in these environments without error, and warn is requestign "popup" without Gtk.jl present. * relax tolerance * relax tolerance --------- Co-authored-by: t-bltg --- src/gui.jl | 10 ---------- src/imgcomp.jl | 4 ++++ src/utils.jl | 10 ++++++++++ test/FuncPlotTest.png | Bin 12349 -> 12846 bytes test/runtests.jl | 2 +- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/gui.jl b/src/gui.jl index 93cbf68..fe27144 100644 --- a/src/gui.jl +++ b/src/gui.jl @@ -7,16 +7,6 @@ function image_widget(fn) vbox end -function replace_refimg(tmpfn, reffn) - try - mkpath(reffn) - catch - # skip - end - cp(tmpfn, reffn, force = true) - @info "Replaced reference image $reffn with $tmpfn" -end - "Show a Gtk popup with both images and a confirmation whether we should replace the new image with the old one" function replace_refimg_dialog(tmpfn, reffn_old; reffn_new = reffn_old) # add the images diff --git a/src/imgcomp.jl b/src/imgcomp.jl index d8140c3..5c44610 100644 --- a/src/imgcomp.jl +++ b/src/imgcomp.jl @@ -37,6 +37,10 @@ function test_images(testfn::AbstractString, reffn::AbstractString; popup=isinte if auto # auto-magically override `newfn` with `testfn`, knowing what we are doing replace_refimg(testfn, newfn) elseif popup + if !isdefined(Main, :Gtk) + @warn "Cannot prompt for image replacement without Gtk.jl" + return result + end # open a popup and give us a chance to examine the images, # then ask to replace the reference @warn "Should we make this the new reference image?" diff --git a/src/utils.jl b/src/utils.jl index 67a2778..fe7499b 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -26,3 +26,13 @@ function blurdiff(A::AbstractArray, B::AbstractArray, sigma) diffpct end + +function replace_refimg(tmpfn, reffn) + try + mkpath(reffn) + catch + # skip + end + cp(tmpfn, reffn, force = true) + @info "Replaced reference image $reffn with $tmpfn" +end \ No newline at end of file diff --git a/test/FuncPlotTest.png b/test/FuncPlotTest.png index e5328351fc1a32bb59eb3fb309174bc5bf57cd1a..affa884685cf447b4ee4c058f6af00e1e548ff37 100644 GIT binary patch literal 12846 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 x7~2wVU)y*NBk~Rx;UE8JDip-=|KITZk FileIO.save(fn, img) @testset "Macros" begin @visualtest func "VisualTest.png" !isci() - @plottest plot([1.,2.,3.]) "PlotTest.png" !isci() + @plottest plot([1.,2.,3.]) "PlotTest.png" !isci() 5e-3 @plottest begin plot([1.,2.,3.])