1 // Copyright 2020 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 #include "pw_polyfill/language_feature_macros.h"
16 #include "pw_polyfill/standard.h"
17 #include "pw_unit_test/framework.h"
18
19 namespace pw {
20 namespace polyfill {
21 namespace {
22
TEST(CppStandardMacro,MacroIsTrueUpToCpp14SincePigweedRequiresCpp14)23 TEST(CppStandardMacro, MacroIsTrueUpToCpp14SincePigweedRequiresCpp14) {
24 static_assert(PW_CXX_STANDARD_IS_SUPPORTED(98),
25 "Macro must be true since Pigweed requires support for C++98");
26 static_assert(PW_CXX_STANDARD_IS_SUPPORTED(11),
27 "Macro must be true since Pigweed requires support for C++11");
28 static_assert(PW_CXX_STANDARD_IS_SUPPORTED(14),
29 "Macro must be true since Pigweed requires support for C++14");
30 }
31
TEST(CppStandardMacro,MacroIsTrueIfSpecifiedStandardIsSupported)32 TEST(CppStandardMacro, MacroIsTrueIfSpecifiedStandardIsSupported) {
33 static_assert(PW_CXX_STANDARD_IS_SUPPORTED(17) == (__cplusplus >= 201703L),
34 "PW_CXX_STANDARD_IS_SUPPORTED() should match __cplusplus");
35 static_assert(PW_CXX_STANDARD_IS_SUPPORTED(20) == (__cplusplus >= 202002L),
36 "PW_CXX_STANDARD_IS_SUPPORTED() should match __cplusplus");
37 static_assert(PW_CXX_STANDARD_IS_SUPPORTED(23) == (__cplusplus >= 202302L),
38 "PW_CXX_STANDARD_IS_SUPPORTED() should match __cplusplus");
39 }
40
TEST(CStandardMacro,MacroIsFalseSinceThisIsACppFile)41 TEST(CStandardMacro, MacroIsFalseSinceThisIsACppFile) {
42 static_assert(!PW_C_STANDARD_IS_SUPPORTED(89),
43 "PW_C_STANDARD_IS_SUPPORTED() must always be false in C++");
44 static_assert(!PW_C_STANDARD_IS_SUPPORTED(99),
45 "PW_C_STANDARD_IS_SUPPORTED() must always be false in C++");
46 static_assert(!PW_C_STANDARD_IS_SUPPORTED(11),
47 "PW_C_STANDARD_IS_SUPPORTED() must always be false in C++");
48 static_assert(!PW_C_STANDARD_IS_SUPPORTED(17),
49 "PW_C_STANDARD_IS_SUPPORTED() must always be false in C++");
50 static_assert(!PW_C_STANDARD_IS_SUPPORTED(23),
51 "PW_C_STANDARD_IS_SUPPORTED() must always be false in C++");
52 }
53
54 // Check that consteval is at least equivalent to constexpr.
ConstevalFunction()55 PW_CONSTEVAL int ConstevalFunction() { return 123; }
56 static_assert(ConstevalFunction() == 123,
57 "Function should work in static_assert");
58
59 PW_CONSTINIT bool mutable_value = true;
60
TEST(Constinit,ValueIsMutable)61 TEST(Constinit, ValueIsMutable) {
62 ASSERT_TRUE(mutable_value);
63 mutable_value = false;
64 ASSERT_FALSE(mutable_value);
65 mutable_value = true;
66 }
67
68 } // namespace
69 } // namespace polyfill
70 } // namespace pw
71