Skip to content

"loaded modules": find also submodules #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 20 additions & 9 deletions src/ReTest.jl
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ using Test: Test,
using InlineTest: @testset, InlineTest, TESTED_MODULES, INLINE_TEST
import InlineTest: retest

include("utils.jl")
include("testset.jl")

using .Testset: Testset, Format
Expand Down Expand Up @@ -718,11 +719,7 @@ end

function computemodules!(modules::Vector{Module}, shuffle)
if isempty(modules)
# TESTED_MODULES is not up-to-date w.r.t. package modules which have
# precompilation, so we have to also look in Base.loaded_modules
# TODO: look recursively in "loaded modules" which use ReTest for sub-modules

# ALSO: TESTED_MODULES might have "duplicate" entries, i.e. modules with the same
# TESTED_MODULES might have "duplicate" entries, i.e. modules with the same
# name, when one overwrites itself by being redefined; in this case,
# let's just delete older entries:
seen = Set{String}()
Expand All @@ -736,10 +733,24 @@ function computemodules!(modules::Vector{Module}, shuffle)
end
filter!(x -> x !== nothing, TESTED_MODULES)

append!(modules, Iterators.flatten((values(Base.loaded_modules), TESTED_MODULES)))
unique!(modules)
# will automatically skip ReTest and ReTest.ReTestTest
filter!(m -> isdefined(m, INLINE_TEST[]) && m ∉ (ReTest, ReTestTest), modules)
# TESTED_MODULES is not up-to-date w.r.t. package modules which have
# precompilation, so we have to also look in Base.loaded_modules
for mod in values(Base.loaded_modules)
mod ∈ (ReTest, Base) && continue # TODO: should exclude stdlibs too
str = string(mod)
if str ∉ seen
push!(seen, str) # probably unnecessary, if str are all unique in this loop
for sub in recsubmodules(mod)
if isdefined(sub, INLINE_TEST[])
push!(TESTED_MODULES, sub)
end
end
end
end

@assert all(m -> m isa Module, TESTED_MODULES)
@assert allunique(TESTED_MODULES)
append!(modules, TESTED_MODULES) # copy! not working on Julia 1.0
else
unique!(modules)
end
Expand Down
18 changes: 18 additions & 0 deletions src/utils.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
issubmodule(m::Module, s) = s isa Module && parentmodule(s) == m && m != s

function submodules(m::Module)
symbols = Core.eval.(Ref(m), filter!(y -> isdefined(m, y), names(m, all=true)))
filter!(x -> issubmodule(m, x), symbols)
end

# list of recursive submodules of m, including m itself
function recsubmodules(m::Module)
subs = submodules(m)
if isempty(subs)
recs = subs
else
recs = mapreduce(recsubmodules, vcat, subs)
end
pushfirst!(recs, m)
recs
end
10 changes: 10 additions & 0 deletions test/FakePackage/src/FakePackage.jl
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,14 @@ end
push!(RUN, 2)
end

module Submodule

using InlineTest

@testset "check that Submodule is noticed by ReTest" begin
@test true
end

end # Submodule

end
3 changes: 3 additions & 0 deletions test/FakePackage/test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@ FakePackage.runtests(r"begin-end")
@test FakePackage.RUN == [1, 2, 1]
FakePackage.runtests(r" for")
@test FakePackage.RUN == [1, 2, 1, 2]

retest(dry=true) # only to update InlineTest.TESTED_MODULES
@test FakePackage.Submodule in ReTest.TESTED_MODULES