Skip to content

Commit 8567a3a

Browse files
Test: Fix failfast for for loops (#58695)
1 parent da00451 commit 8567a3a

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

stdlib/Test/src/Test.jl

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1726,6 +1726,10 @@ end
17261726
trigger_test_failure_break(@nospecialize(err)) =
17271727
ccall(:jl_test_failure_breakpoint, Cvoid, (Any,), err)
17281728

1729+
is_failfast_error(err::FailFastError) = true
1730+
is_failfast_error(err::LoadError) = is_failfast_error(err.error) # handle `include` barrier
1731+
is_failfast_error(err) = false
1732+
17291733
"""
17301734
Generate the code for an `@testset` with a `let` argument.
17311735
"""
@@ -1837,7 +1841,7 @@ function testset_beginend_call(args, tests, source)
18371841
# something in the test block threw an error. Count that as an
18381842
# error in this test set
18391843
trigger_test_failure_break(err)
1840-
if err isa FailFastError
1844+
if is_failfast_error(err)
18411845
get_testset_depth() > 1 ? rethrow() : failfast_print()
18421846
else
18431847
record(ts, Error(:nontest_error, Expr(:tuple), err, Base.current_exceptions(), $(QuoteNode(source))))
@@ -1925,7 +1929,9 @@ function testset_forloop(args, testloop, source)
19251929
# Something in the test block threw an error. Count that as an
19261930
# error in this test set
19271931
trigger_test_failure_break(err)
1928-
if !isa(err, FailFastError)
1932+
if is_failfast_error(err)
1933+
get_testset_depth() > 1 ? rethrow() : failfast_print()
1934+
else
19291935
record(ts, Error(:nontest_error, Expr(:tuple), err, Base.current_exceptions(), $(QuoteNode(source))))
19301936
end
19311937
end

stdlib/Test/test/runtests.jl

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1394,7 +1394,7 @@ end
13941394
@test occursin(expected, result)
13951395
end
13961396
end
1397-
@testset "failfast" begin
1397+
@testset "failfast begin-end" begin
13981398
expected = r"""
13991399
Test Summary: \| Fail Total +Time
14001400
Foo \| 1 1 \s*\d*\.\ds
@@ -1419,6 +1419,32 @@ end
14191419
@test occursin(expected, result)
14201420
end
14211421
end
1422+
@testset "failfast for-loop" begin
1423+
expected = r"""
1424+
Test Summary: \| Fail Total +Time
1425+
Foo \| 1 1 \s*\d*\.\ds
1426+
1 \| 1 1 \s*\d*\.\ds
1427+
"""
1428+
mktemp() do f, _
1429+
write(f,
1430+
"""
1431+
using Test
1432+
1433+
@testset "Foo" failfast=true begin
1434+
@testset "\$x" for x in 1:2
1435+
@test false
1436+
end
1437+
@testset "Bar" begin
1438+
@test false
1439+
@test true
1440+
end
1441+
end
1442+
""")
1443+
cmd = `$(Base.julia_cmd()) --startup-file=no --color=no $f`
1444+
result = read(pipeline(ignorestatus(cmd), stderr=devnull), String)
1445+
@test occursin(expected, result)
1446+
end
1447+
end
14221448
@testset "failfast passes to child testsets" begin
14231449
expected = r"""
14241450
Test Summary: \| Fail Total +Time

0 commit comments

Comments
 (0)