// Copyright 2024 The Pigweed Authors // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include "pw_build/linker_symbol.h" #include "gtest/gtest.h" namespace pw { namespace { // These symbols are defined in linker_symbol_test.ld extern "C" LinkerSymbol FOO_SYM; extern "C" LinkerSymbol BAR_SYM; // Test template default (uintptr_t) extern "C" LinkerSymbol NEGATIVE_SYM; extern "C" LinkerSymbol CHAR_SYM; enum class MyEnum { kValue7 = 7, }; extern "C" LinkerSymbol ENUM_SYM; TEST(LinkerSymbolTest, ValueWorks) { // You can use value() to get the value as the specified type. auto value = FOO_SYM.value(); static_assert(std::is_same_v); EXPECT_EQ(value, 42); } TEST(LinkerSymbolTest, NegativeValueWorks) { // LinkerSymbol works with negative integers. EXPECT_EQ(NEGATIVE_SYM.value(), -567); } TEST(LinkerSymbolTest, CharValueWorks) { // LinkerSymbol works with characters. EXPECT_EQ(CHAR_SYM.value(), 'a'); } TEST(LinkerSymbolTest, EnumValueWorks) { // LinkerSymbol works with enums. EXPECT_EQ(ENUM_SYM.value(), MyEnum::kValue7); } TEST(LinkerSymbolTest, ValueWorksDefaultType) { // You can use value() to get the value as the default type (uintptr_t). auto value = BAR_SYM.value(); static_assert(std::is_same_v); EXPECT_EQ(value, 0xDEADBEEFu); } TEST(LinkerSymbolTest, CStyleCastWorks) { // You can use a C-style cast, if you insist. EXPECT_EQ((uintptr_t)&FOO_SYM, 42u); } } // namespace } // namespace pw