// Copyright 2022 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_bytes/bit.h" #include #include #include "pw_unit_test/framework.h" namespace pw::bytes { namespace { // SignExtend unsigned integer values into signed integers. constexpr uint32_t kNegative24Bits = 0x00FACADE; constexpr int32_t kExtendedNegative24Bits = SignExtend<24>(kNegative24Bits); static_assert(kExtendedNegative24Bits == static_cast(0xFFFACADE)); constexpr uint32_t kPositive20Bits = 0x00000ACE; constexpr int32_t kExtendedPositive20Bits = SignExtend<20>(kPositive20Bits); static_assert(kExtendedPositive20Bits == static_cast(0x00000ACE)); constexpr uint32_t kNegative12Bits = 0x00000ACE; constexpr int32_t kExtendedNegative12Bits = SignExtend<12>(kNegative12Bits); static_assert(kExtendedNegative12Bits == static_cast(0xFFFFFACE)); constexpr uint32_t k32Bits = 0b10100000101000001010000010100000; // ExtractBits: extract single bit. constexpr uint8_t kZeroBit = ExtractBits(k32Bits); static_assert(kZeroBit == 0); constexpr uint8_t kOneBit = ExtractBits(k32Bits); static_assert(kOneBit == 1); // ExtractBits: extract 16 bits from uint32_t to uint16_t. constexpr uint16_t kExtracted16Bits = 0b1010000010100000; constexpr uint16_t k15To0Bits = ExtractBits(k32Bits); static_assert(k15To0Bits == kExtracted16Bits); constexpr uint16_t k23To8Bits = ExtractBits(k32Bits); static_assert(k23To8Bits == kExtracted16Bits); constexpr uint16_t k31To16Bits = ExtractBits(k32Bits); static_assert(k31To16Bits == kExtracted16Bits); // ExtractBits: extract 31 bits. constexpr uint32_t kExtracted31Bits = 0b1010000010100000101000001010000; constexpr uint32_t k31To1Bits = ExtractBits(k32Bits); static_assert(k31To1Bits == kExtracted31Bits); // ExtractBits: extract all bits. constexpr uint32_t k31To0Bits = ExtractBits(k32Bits); static_assert(k31To0Bits == k32Bits); TEST(Endian, NativeIsBigOrLittle) { EXPECT_TRUE(endian::native == endian::little || endian::native == endian::big); } TEST(Endian, NativeIsCorrect) { constexpr uint32_t kInteger = 0x11223344u; int8_t bytes[sizeof(kInteger)] = {}; std::memcpy(bytes, &kInteger, sizeof(kInteger)); if (endian::native == endian::little) { EXPECT_EQ(bytes[0], 0x44); EXPECT_EQ(bytes[1], 0x33); EXPECT_EQ(bytes[2], 0x22); EXPECT_EQ(bytes[3], 0x11); } else { EXPECT_EQ(bytes[0], 0x11); EXPECT_EQ(bytes[1], 0x22); EXPECT_EQ(bytes[2], 0x33); EXPECT_EQ(bytes[3], 0x44); } } } // namespace } // namespace pw::bytes