@@ -1004,7 +1004,6 @@ end
1004
1004
A simple fallback test set that throws immediately on a failure.
1005
1005
"""
1006
1006
struct FallbackTestSet <: AbstractTestSet end
1007
- fallback_testset = FallbackTestSet ()
1008
1007
1009
1008
struct FallbackTestSetException <: Exception
1010
1009
msg:: String
@@ -1639,22 +1638,11 @@ function testset_context(args, ex, source)
1639
1638
else
1640
1639
error (" Malformed `let` expression is given" )
1641
1640
end
1642
- reverse! (contexts)
1643
-
1644
- test_ex = ex. args[2 ]
1645
-
1646
- ex. args[2 ] = quote
1647
- $ (map (contexts) do context
1648
- :($ push_testset ($ (ContextTestSet)($ (QuoteNode (context)), $ context; $ options... )))
1649
- end ... )
1650
- try
1651
- $ (test_ex)
1652
- finally
1653
- $ (map (_-> :($ pop_testset ()), contexts)... )
1654
- end
1641
+ test_ex = esc (ex. args[2 ])
1642
+ for context in reverse (contexts)
1643
+ test_ex = :(@with_testset (ContextTestSet ($ (QuoteNode (context)), $ (esc (context)); $ (esc (options)). .. ), $ test_ex))
1655
1644
end
1656
-
1657
- return esc (ex)
1645
+ return test_ex
1658
1646
end
1659
1647
1660
1648
"""
@@ -1687,35 +1675,34 @@ function testset_beginend_call(args, tests, source)
1687
1675
else
1688
1676
$ (testsettype)($ desc; $ options... )
1689
1677
end
1690
- push_testset (ts)
1691
- # we reproduce the logic of guardseed, but this function
1692
- # cannot be used as it changes slightly the semantic of @testset,
1693
- # by wrapping the body in a function
1694
- local default_rng_orig = copy (default_rng ())
1695
- local tls_seed_orig = copy (Random. get_tls_seed ())
1696
- try
1697
- # default RNG is reset to its state from last `seed!()` to ease reproduce a failed test
1698
- copy! (Random. default_rng (), tls_seed_orig)
1699
- let
1700
- $ (esc (tests))
1701
- end
1702
- catch err
1703
- err isa InterruptException && rethrow ()
1704
- # something in the test block threw an error. Count that as an
1705
- # error in this test set
1706
- trigger_test_failure_break (err)
1707
- if err isa FailFastError
1708
- get_testset_depth () > 1 ? rethrow () : failfast_print ()
1709
- else
1710
- record (ts, Error (:nontest_error , Expr (:tuple ), err, Base. current_exceptions (), $ (QuoteNode (source))))
1678
+ @with_testset ts begin
1679
+ # we reproduce the logic of guardseed, but this function
1680
+ # cannot be used as it changes slightly the semantic of @testset,
1681
+ # by wrapping the body in a function
1682
+ local default_rng_orig = copy (default_rng ())
1683
+ local tls_seed_orig = copy (Random. get_tls_seed ())
1684
+ try
1685
+ # default RNG is reset to its state from last `seed!()` to ease reproduce a failed test
1686
+ copy! (Random. default_rng (), tls_seed_orig)
1687
+ let
1688
+ $ (esc (tests))
1689
+ end
1690
+ catch err
1691
+ err isa InterruptException && rethrow ()
1692
+ # something in the test block threw an error. Count that as an
1693
+ # error in this test set
1694
+ trigger_test_failure_break (err)
1695
+ if err isa FailFastError
1696
+ get_testset_depth () > 1 ? rethrow () : failfast_print ()
1697
+ else
1698
+ record (ts, Error (:nontest_error , Expr (:tuple ), err, Base. current_exceptions (), $ (QuoteNode (source))))
1699
+ end
1700
+ finally
1701
+ copy! (default_rng (), default_rng_orig)
1702
+ copy! (Random. get_tls_seed (), tls_seed_orig)
1711
1703
end
1712
- finally
1713
- copy! (default_rng (), default_rng_orig)
1714
- copy! (Random. get_tls_seed (), tls_seed_orig)
1715
- pop_testset ()
1716
- ret = finish (ts)
1717
1704
end
1718
- ret
1705
+ ts
1719
1706
end
1720
1707
# preserve outer location if possible
1721
1708
if tests isa Expr && tests. head === :block && ! isempty (tests. args) && tests. args[1 ] isa LineNumberNode
@@ -1771,52 +1758,38 @@ function testset_forloop(args, testloop, source)
1771
1758
_check_testset ($ testsettype, $ (QuoteNode (testsettype. args[1 ])))
1772
1759
# Trick to handle `break` and `continue` in the test code before
1773
1760
# they can be handled properly by `finally` lowering.
1774
- if ! first_iteration
1775
- pop_testset ()
1776
- finish_errored = true
1777
- push! (arr, finish (ts))
1778
- finish_errored = false
1779
- copy! (default_rng (), tls_seed_orig)
1780
- end
1781
1761
ts = if ($ testsettype === $ DefaultTestSet) && $ (isa (source, LineNumberNode))
1782
1762
$ (testsettype)($ desc; source= $ (QuoteNode (source. file)), $ options... )
1783
1763
else
1784
1764
$ (testsettype)($ desc; $ options... )
1785
1765
end
1786
- push_testset (ts)
1787
- first_iteration = false
1788
- try
1789
- $ (esc (tests))
1790
- catch err
1791
- err isa InterruptException && rethrow ()
1792
- # Something in the test block threw an error. Count that as an
1793
- # error in this test set
1794
- trigger_test_failure_break (err)
1795
- if ! isa (err, FailFastError)
1796
- record (ts, Error (:nontest_error , Expr (:tuple ), err, Base. current_exceptions (), $ (QuoteNode (source))))
1766
+ @with_testset ts begin
1767
+ try
1768
+ # default RNG is reset to its state from last `seed!()` to ease reproduce a failed test
1769
+ copy! (Random. default_rng (), tls_seed_orig)
1770
+ $ (esc (tests))
1771
+ catch err
1772
+ err isa InterruptException && rethrow ()
1773
+ # Something in the test block threw an error. Count that as an
1774
+ # error in this test set
1775
+ trigger_test_failure_break (err)
1776
+ if ! isa (err, FailFastError)
1777
+ record (ts, Error (:nontest_error , Expr (:tuple ), err, Base. current_exceptions (), $ (QuoteNode (source))))
1778
+ end
1779
+ finally
1780
+ copy! (default_rng (), default_rng_orig)
1781
+ copy! (Random. get_tls_seed (), tls_seed_orig)
1782
+ push! (arr, ts)
1797
1783
end
1798
1784
end
1799
1785
end
1800
1786
quote
1801
1787
local arr = Vector {Any} ()
1802
- local first_iteration = true
1803
- local ts
1804
- local finish_errored = false
1805
1788
local default_rng_orig = copy (default_rng ())
1806
1789
local tls_seed_orig = copy (Random. get_tls_seed ())
1807
- copy! (Random. default_rng (), tls_seed_orig)
1808
- try
1809
- let
1810
- $ (Expr (:for , Expr (:block , [esc (v) for v in loopvars]. .. ), blk))
1811
- end
1812
- finally
1813
- # Handle `return` in test body
1814
- if ! first_iteration && ! finish_errored
1815
- pop_testset ()
1816
- push! (arr, finish (ts))
1817
- end
1818
- copy! (default_rng (), default_rng_orig)
1819
- copy! (Random. get_tls_seed (), tls_seed_orig)
1790
+ local ts
1791
+ let
1792
+ $ (Expr (:for , Expr (:block , [esc (v) for v in loopvars]. .. ), blk))
1820
1793
end
1821
1794
arr
1822
1795
end
@@ -1855,39 +1828,27 @@ end
1855
1828
# -----------------------------------------------------------------------
1856
1829
# Various helper methods for test sets
1857
1830
1831
+ const CURRENT_TESTSET = ScopedValue {AbstractTestSet} (FallbackTestSet ())
1832
+ const TESTSET_DEPTH = ScopedValue {Int} (0 )
1833
+
1834
+ macro with_testset (ts, expr)
1835
+ quote
1836
+ ts = $ (esc (ts))
1837
+ Expr (:tryfinally ,
1838
+ @with (CURRENT_TESTSET => ts, TESTSET_DEPTH => get_testset_depth () + 1 , $ (esc (expr))),
1839
+ finish (ts)
1840
+ )
1841
+ end
1842
+ end
1843
+
1858
1844
"""
1859
1845
get_testset()
1860
1846
1861
1847
Retrieve the active test set from the task's local storage. If no
1862
1848
test set is active, use the fallback default test set.
1863
1849
"""
1864
1850
function get_testset ()
1865
- testsets = get (task_local_storage (), :__BASETESTNEXT__ , AbstractTestSet[])
1866
- return isempty (testsets) ? fallback_testset : testsets[end ]
1867
- end
1868
-
1869
- """
1870
- push_testset(ts::AbstractTestSet)
1871
-
1872
- Adds the test set to the `task_local_storage`.
1873
- """
1874
- function push_testset (ts:: AbstractTestSet )
1875
- testsets = get (task_local_storage (), :__BASETESTNEXT__ , AbstractTestSet[])
1876
- push! (testsets, ts)
1877
- setindex! (task_local_storage (), testsets, :__BASETESTNEXT__ )
1878
- end
1879
-
1880
- """
1881
- pop_testset()
1882
-
1883
- Pops the last test set added to the `task_local_storage`. If there are no
1884
- active test sets, returns the fallback default test set.
1885
- """
1886
- function pop_testset ()
1887
- testsets = get (task_local_storage (), :__BASETESTNEXT__ , AbstractTestSet[])
1888
- ret = isempty (testsets) ? fallback_testset : pop! (testsets)
1889
- setindex! (task_local_storage (), testsets, :__BASETESTNEXT__ )
1890
- return ret
1851
+ something (Base. ScopedValues. get (CURRENT_TESTSET))
1891
1852
end
1892
1853
1893
1854
"""
@@ -1896,10 +1857,10 @@ end
1896
1857
Return the number of active test sets, not including the default test set
1897
1858
"""
1898
1859
function get_testset_depth ()
1899
- testsets = get (task_local_storage (), :__BASETESTNEXT__ , AbstractTestSet[])
1900
- return length (testsets)
1860
+ something (Base. ScopedValues. get (TESTSET_DEPTH))
1901
1861
end
1902
1862
1863
+
1903
1864
_args_and_call (args... ; kwargs... ) = (args[1 : end - 1 ], kwargs, args[end ](args[1 : end - 1 ]. .. ; kwargs... ))
1904
1865
_materialize_broadcasted (f, args... ) = Broadcast. materialize (Broadcast. broadcasted (f, args... ))
1905
1866
0 commit comments