| |
| // Copyright Catch2 Authors |
| // Distributed under the Boost Software License, Version 1.0. |
| // (See accompanying file LICENSE.txt or copy at |
| // https://www.boost.org/LICENSE_1_0.txt) |
| |
| // SPDX-License-Identifier: BSL-1.0 |
| #ifndef CATCH_SECTION_HPP_INCLUDED |
| #define CATCH_SECTION_HPP_INCLUDED |
| |
| #include <catch2/internal/catch_compiler_capabilities.hpp> |
| #include <catch2/internal/catch_config_static_analysis_support.hpp> |
| #include <catch2/internal/catch_noncopyable.hpp> |
| #include <catch2/catch_section_info.hpp> |
| #include <catch2/catch_timer.hpp> |
| #include <catch2/catch_totals.hpp> |
| #include <catch2/internal/catch_unique_name.hpp> |
| |
| namespace Catch { |
| |
| class Section : Detail::NonCopyable { |
| public: |
| Section( SectionInfo&& info ); |
| Section( SourceLineInfo const& _lineInfo, |
| StringRef _name, |
| const char* const = nullptr ); |
| ~Section(); |
| |
| // This indicates whether the section should be executed or not |
| explicit operator bool() const; |
| |
| private: |
| SectionInfo m_info; |
| |
| Counts m_assertions; |
| bool m_sectionIncluded; |
| Timer m_timer; |
| }; |
| |
| } // end namespace Catch |
| |
| #if !defined(CATCH_CONFIG_EXPERIMENTAL_STATIC_ANALYSIS_SUPPORT) |
| # define INTERNAL_CATCH_SECTION( ... ) \ |
| CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ |
| CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS \ |
| if ( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( \ |
| catch_internal_Section ) = \ |
| Catch::Section( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) \ |
| CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION |
| |
| # define INTERNAL_CATCH_DYNAMIC_SECTION( ... ) \ |
| CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ |
| CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS \ |
| if ( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( \ |
| catch_internal_Section ) = \ |
| Catch::SectionInfo( \ |
| CATCH_INTERNAL_LINEINFO, \ |
| ( Catch::ReusableStringStream() << __VA_ARGS__ ) \ |
| .str() ) ) \ |
| CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION |
| |
| #else |
| |
| // These section definitions imply that at most one section at one level |
| // will be entered (because only one section's __LINE__ can be equal to |
| // the dummy `catchInternalSectionHint` variable from `TEST_CASE`). |
| |
| namespace Catch { |
| namespace Detail { |
| // Intentionally without linkage, as it should only be used as a dummy |
| // symbol for static analysis. |
| // The arguments are used as a dummy for checking warnings in the passed |
| // expressions. |
| int GetNewSectionHint( StringRef, const char* const = nullptr ); |
| } // namespace Detail |
| } // namespace Catch |
| |
| |
| # define INTERNAL_CATCH_SECTION( ... ) \ |
| CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ |
| CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS \ |
| CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS \ |
| if ( [[maybe_unused]] const int catchInternalPreviousSectionHint = \ |
| catchInternalSectionHint, \ |
| catchInternalSectionHint = \ |
| Catch::Detail::GetNewSectionHint(__VA_ARGS__); \ |
| catchInternalPreviousSectionHint == __LINE__ ) \ |
| CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION |
| |
| # define INTERNAL_CATCH_DYNAMIC_SECTION( ... ) \ |
| CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ |
| CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS \ |
| CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS \ |
| if ( [[maybe_unused]] const int catchInternalPreviousSectionHint = \ |
| catchInternalSectionHint, \ |
| catchInternalSectionHint = Catch::Detail::GetNewSectionHint( \ |
| ( Catch::ReusableStringStream() << __VA_ARGS__ ).str()); \ |
| catchInternalPreviousSectionHint == __LINE__ ) \ |
| CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION |
| |
| #endif |
| |
| |
| #endif // CATCH_SECTION_HPP_INCLUDED |