Skip to content

Commit f5f1d01

Browse files
authored
"loaded modules": find also submodules (#7)
We use `Base.loaded_modules` to find modules using `ReTest` which didn't have a chance to register themselves in `InlineTest.TESTED_MODULES`. Here we look also for submodules using `ReTest`.
1 parent fe4c62f commit f5f1d01

File tree

4 files changed

+51
-9
lines changed

4 files changed

+51
-9
lines changed

src/ReTest.jl

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ using Test: Test,
2424
using InlineTest: @testset, InlineTest, TESTED_MODULES, INLINE_TEST
2525
import InlineTest: retest
2626

27+
include("utils.jl")
2728
include("testset.jl")
2829

2930
using .Testset: Testset, Format
@@ -718,11 +719,7 @@ end
718719

719720
function computemodules!(modules::Vector{Module}, shuffle)
720721
if isempty(modules)
721-
# TESTED_MODULES is not up-to-date w.r.t. package modules which have
722-
# precompilation, so we have to also look in Base.loaded_modules
723-
# TODO: look recursively in "loaded modules" which use ReTest for sub-modules
724-
725-
# ALSO: TESTED_MODULES might have "duplicate" entries, i.e. modules with the same
722+
# TESTED_MODULES might have "duplicate" entries, i.e. modules with the same
726723
# name, when one overwrites itself by being redefined; in this case,
727724
# let's just delete older entries:
728725
seen = Set{String}()
@@ -736,10 +733,24 @@ function computemodules!(modules::Vector{Module}, shuffle)
736733
end
737734
filter!(x -> x !== nothing, TESTED_MODULES)
738735

739-
append!(modules, Iterators.flatten((values(Base.loaded_modules), TESTED_MODULES)))
740-
unique!(modules)
741-
# will automatically skip ReTest and ReTest.ReTestTest
742-
filter!(m -> isdefined(m, INLINE_TEST[]) && m (ReTest, ReTestTest), modules)
736+
# TESTED_MODULES is not up-to-date w.r.t. package modules which have
737+
# precompilation, so we have to also look in Base.loaded_modules
738+
for mod in values(Base.loaded_modules)
739+
mod (ReTest, Base) && continue # TODO: should exclude stdlibs too
740+
str = string(mod)
741+
if str seen
742+
push!(seen, str) # probably unnecessary, if str are all unique in this loop
743+
for sub in recsubmodules(mod)
744+
if isdefined(sub, INLINE_TEST[])
745+
push!(TESTED_MODULES, sub)
746+
end
747+
end
748+
end
749+
end
750+
751+
@assert all(m -> m isa Module, TESTED_MODULES)
752+
@assert allunique(TESTED_MODULES)
753+
append!(modules, TESTED_MODULES) # copy! not working on Julia 1.0
743754
else
744755
unique!(modules)
745756
end

src/utils.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
issubmodule(m::Module, s) = s isa Module && parentmodule(s) == m && m != s
2+
3+
function submodules(m::Module)
4+
symbols = Core.eval.(Ref(m), filter!(y -> isdefined(m, y), names(m, all=true)))
5+
filter!(x -> issubmodule(m, x), symbols)
6+
end
7+
8+
# list of recursive submodules of m, including m itself
9+
function recsubmodules(m::Module)
10+
subs = submodules(m)
11+
if isempty(subs)
12+
recs = subs
13+
else
14+
recs = mapreduce(recsubmodules, vcat, subs)
15+
end
16+
pushfirst!(recs, m)
17+
recs
18+
end

test/FakePackage/src/FakePackage.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,14 @@ end
1919
push!(RUN, 2)
2020
end
2121

22+
module Submodule
23+
24+
using InlineTest
25+
26+
@testset "check that Submodule is noticed by ReTest" begin
27+
@test true
28+
end
29+
30+
end # Submodule
31+
2232
end

test/FakePackage/test/runtests.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ FakePackage.runtests(r"begin-end")
77
@test FakePackage.RUN == [1, 2, 1]
88
FakePackage.runtests(r" for")
99
@test FakePackage.RUN == [1, 2, 1, 2]
10+
11+
retest(dry=true) # only to update InlineTest.TESTED_MODULES
12+
@test FakePackage.Submodule in ReTest.TESTED_MODULES

0 commit comments

Comments
 (0)