| // Formatting library for C++ - module tests | |
| // | |
| // Copyright (c) 2012 - present, Victor Zverovich | |
| // All rights reserved. | |
| // | |
| // For the license information refer to format.h. | |
| // | |
| // Copyright (c) 2021 - present, Daniela Engert | |
| // All Rights Reserved | |
| // {fmt} module. | |
| import fmt; | |
| // check for macros leaking from BMI | |
| static bool macro_leaked = | |
| #if defined(FMT_CORE_H_) || defined(FMT_FORMAT_H) | |
| true; | |
| #else | |
| false; | |
| #endif | |
| #include "gtest/gtest.h" | |
| // an implicitly exported namespace must be visible [module.interface]/2.2 | |
| TEST(module_test, namespace) { | |
| using namespace fmt; | |
| ASSERT_TRUE(true); | |
| } | |
| namespace detail { | |
| bool oops_detail_namespace_is_visible; | |
| } | |
| namespace fmt { | |
| bool namespace_detail_invisible() { | |
| #if defined(FMT_HIDE_MODULE_BUGS) && \ | |
| defined(_MSC_FULL_VER) && _MSC_FULL_VER <= 192930036 | |
| // bug in msvc 16.10-pre4: | |
| // the namespace is visible even when it is neither | |
| // implicitly nor explicitly exported | |
| return true; | |
| #else | |
| using namespace detail; | |
| // this fails to compile if fmt::detail is visible | |
| return !oops_detail_namespace_is_visible; | |
| #endif | |
| } | |
| } // namespace fmt | |
| // the non-exported namespace 'detail' must be invisible [module.interface]/2 | |
| TEST(module_test, detail_namespace) { | |
| EXPECT_TRUE(fmt::namespace_detail_invisible()); | |
| } | |
| // macros must not be imported from a *named* module [cpp.import]/5.1 | |
| TEST(module_test, macros) { | |
| #if defined(FMT_HIDE_MODULE_BUGS) && \ | |
| defined(_MSC_FULL_VER) && _MSC_FULL_VER <= 192930036 | |
| // bug in msvc 16.10-pre4: | |
| // include-guard macros leak from BMI | |
| // and even worse: they cannot be #undef-ined | |
| macro_leaked = false; | |
| #endif | |
| EXPECT_FALSE(macro_leaked); | |
| } |