xref: /aosp_15_r20/external/emboss/runtime/cpp/test/emboss_bit_util_test.cc (revision 99e0aae7469b87d12f0ad23e61142c2d74c1ef70)
1 // Copyright 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of 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,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "runtime/cpp/emboss_bit_util.h"
16 
17 #include "gtest/gtest.h"
18 
19 namespace emboss {
20 namespace support {
21 namespace test {
22 
TEST(ByteSwap,ByteSwap)23 TEST(ByteSwap, ByteSwap) {
24   EXPECT_EQ(0x01U, ByteSwap(::std::uint8_t{0x01}));
25   EXPECT_EQ(0x0102U, ByteSwap(::std::uint16_t{0x0201}));
26   EXPECT_EQ(0x01020304U, ByteSwap(::std::uint32_t{0x04030201}));
27   EXPECT_EQ(0x0102030405060708UL,
28             ByteSwap(::std::uint64_t{0x0807060504030201UL}));
29 }
30 
TEST(MaskToNBits,MaskToNBits)31 TEST(MaskToNBits, MaskToNBits) {
32   EXPECT_EQ(0xffU, MaskToNBits(0xffffffffU, 8));
33   EXPECT_EQ(0x00U, MaskToNBits(0xffffff00U, 8));
34   EXPECT_EQ(0x01U, MaskToNBits(0xffffffffU, 1));
35   EXPECT_EQ(0x00U, MaskToNBits(0xfffffffeU, 1));
36   EXPECT_EQ(0xffffffffU, MaskToNBits(0xffffffffU, 32));
37   EXPECT_EQ(0xffffffffffffffffU, MaskToNBits(0xffffffffffffffffU, 64));
38   EXPECT_EQ(0xfU, MaskToNBits(::std::uint8_t{0xff}, 4));
39 }
40 
TEST(IsPowerOfTwo,IsPowerOfTwo)41 TEST(IsPowerOfTwo, IsPowerOfTwo) {
42   EXPECT_TRUE(IsPowerOfTwo(1U));
43   EXPECT_TRUE(IsPowerOfTwo(2U));
44   EXPECT_TRUE(IsPowerOfTwo(1UL << 63));
45   EXPECT_TRUE(IsPowerOfTwo(::std::uint8_t{128}));
46   EXPECT_TRUE(IsPowerOfTwo(1));
47   EXPECT_TRUE(IsPowerOfTwo(2));
48   EXPECT_TRUE(IsPowerOfTwo(1L << 62));
49   EXPECT_TRUE(IsPowerOfTwo(::std::int8_t{64}));
50 
51   EXPECT_FALSE(IsPowerOfTwo(0U));
52   EXPECT_FALSE(IsPowerOfTwo(3U));
53   EXPECT_FALSE(IsPowerOfTwo((1UL << 63) - 1));
54   EXPECT_FALSE(IsPowerOfTwo((1UL << 62) + 1));
55   EXPECT_FALSE(IsPowerOfTwo((3UL << 62)));
56   EXPECT_FALSE(
57       IsPowerOfTwo(::std::numeric_limits</**/ ::std::uint64_t>::max()));
58   EXPECT_FALSE(IsPowerOfTwo(::std::uint8_t{129}));
59   EXPECT_FALSE(IsPowerOfTwo(::std::uint8_t{255}));
60   EXPECT_FALSE(IsPowerOfTwo(-1));
61   EXPECT_FALSE(IsPowerOfTwo(-2));
62   EXPECT_FALSE(IsPowerOfTwo(-3));
63   EXPECT_FALSE(IsPowerOfTwo(::std::numeric_limits</**/ ::std::int64_t>::min()));
64   EXPECT_FALSE(IsPowerOfTwo(::std::numeric_limits</**/ ::std::int64_t>::max()));
65   EXPECT_FALSE(IsPowerOfTwo(0));
66   EXPECT_FALSE(IsPowerOfTwo(3));
67   EXPECT_FALSE(IsPowerOfTwo((1L << 62) - 1));
68   EXPECT_FALSE(IsPowerOfTwo((1L << 61) + 1));
69   EXPECT_FALSE(IsPowerOfTwo((3L << 61)));
70   EXPECT_FALSE(IsPowerOfTwo(::std::int8_t{-1}));
71   EXPECT_FALSE(IsPowerOfTwo(::std::int8_t{-128}));
72   EXPECT_FALSE(IsPowerOfTwo(::std::int8_t{65}));
73   EXPECT_FALSE(IsPowerOfTwo(::std::int8_t{127}));
74 }
75 
76 #if defined(EMBOSS_LITTLE_ENDIAN_TO_NATIVE)
TEST(EndianConversion,LittleEndianToNative)77 TEST(EndianConversion, LittleEndianToNative) {
78   ::std::uint16_t data16 = 0;
79   reinterpret_cast<char *>(&data16)[0] = 0x01;
80   reinterpret_cast<char *>(&data16)[1] = 0x02;
81   EXPECT_EQ(0x0201, EMBOSS_LITTLE_ENDIAN_TO_NATIVE(data16));
82 
83   ::std::uint32_t data32 = 0;
84   reinterpret_cast<char *>(&data32)[0] = 0x01;
85   reinterpret_cast<char *>(&data32)[1] = 0x02;
86   reinterpret_cast<char *>(&data32)[2] = 0x03;
87   reinterpret_cast<char *>(&data32)[3] = 0x04;
88   EXPECT_EQ(0x04030201U, EMBOSS_LITTLE_ENDIAN_TO_NATIVE(data32));
89 
90   ::std::uint64_t data64 = 0;
91   reinterpret_cast<char *>(&data64)[0] = 0x01;
92   reinterpret_cast<char *>(&data64)[1] = 0x02;
93   reinterpret_cast<char *>(&data64)[2] = 0x03;
94   reinterpret_cast<char *>(&data64)[3] = 0x04;
95   reinterpret_cast<char *>(&data64)[4] = 0x05;
96   reinterpret_cast<char *>(&data64)[5] = 0x06;
97   reinterpret_cast<char *>(&data64)[6] = 0x07;
98   reinterpret_cast<char *>(&data64)[7] = 0x08;
99   EXPECT_EQ(0x0807060504030201UL, EMBOSS_LITTLE_ENDIAN_TO_NATIVE(data64));
100 }
101 #endif  // defined(EMBOSS_LITTLE_ENDIAN_TO_NATIVE)
102 
103 #if defined(EMBOSS_BIG_ENDIAN_TO_NATIVE)
TEST(EndianConversion,BigEndianToNative)104 TEST(EndianConversion, BigEndianToNative) {
105   ::std::uint16_t data16 = 0;
106   reinterpret_cast<char *>(&data16)[0] = 0x01;
107   reinterpret_cast<char *>(&data16)[1] = 0x02;
108   EXPECT_EQ(0x0102, EMBOSS_BIG_ENDIAN_TO_NATIVE(data16));
109 
110   ::std::uint32_t data32 = 0;
111   reinterpret_cast<char *>(&data32)[0] = 0x01;
112   reinterpret_cast<char *>(&data32)[1] = 0x02;
113   reinterpret_cast<char *>(&data32)[2] = 0x03;
114   reinterpret_cast<char *>(&data32)[3] = 0x04;
115   EXPECT_EQ(0x01020304U, EMBOSS_BIG_ENDIAN_TO_NATIVE(data32));
116 
117   ::std::uint64_t data64 = 0;
118   reinterpret_cast<char *>(&data64)[0] = 0x01;
119   reinterpret_cast<char *>(&data64)[1] = 0x02;
120   reinterpret_cast<char *>(&data64)[2] = 0x03;
121   reinterpret_cast<char *>(&data64)[3] = 0x04;
122   reinterpret_cast<char *>(&data64)[4] = 0x05;
123   reinterpret_cast<char *>(&data64)[5] = 0x06;
124   reinterpret_cast<char *>(&data64)[6] = 0x07;
125   reinterpret_cast<char *>(&data64)[7] = 0x08;
126   EXPECT_EQ(0x0102030405060708UL, EMBOSS_BIG_ENDIAN_TO_NATIVE(data64));
127 }
128 #endif  // defined(EMBOSS_BIG_ENDIAN_TO_NATIVE)
129 
130 #if defined(EMBOSS_NATIVE_TO_LITTLE_ENDIAN)
TEST(EndianConversion,NativeToLittleEndian)131 TEST(EndianConversion, NativeToLittleEndian) {
132   ::std::uint16_t data16 =
133       EMBOSS_NATIVE_TO_LITTLE_ENDIAN(static_cast</**/ ::std::uint16_t>(0x0201));
134   EXPECT_EQ(0x01, reinterpret_cast<char *>(&data16)[0]);
135   EXPECT_EQ(0x02, reinterpret_cast<char *>(&data16)[1]);
136 
137   ::std::uint32_t data32 = EMBOSS_NATIVE_TO_LITTLE_ENDIAN(
138       static_cast</**/ ::std::uint32_t>(0x04030201));
139   EXPECT_EQ(0x01, reinterpret_cast<char *>(&data32)[0]);
140   EXPECT_EQ(0x02, reinterpret_cast<char *>(&data32)[1]);
141   EXPECT_EQ(0x03, reinterpret_cast<char *>(&data32)[2]);
142   EXPECT_EQ(0x04, reinterpret_cast<char *>(&data32)[3]);
143 
144   ::std::uint64_t data64 = EMBOSS_NATIVE_TO_LITTLE_ENDIAN(
145       static_cast</**/ ::std::uint64_t>(0x0807060504030201));
146   EXPECT_EQ(0x01, reinterpret_cast<char *>(&data64)[0]);
147   EXPECT_EQ(0x02, reinterpret_cast<char *>(&data64)[1]);
148   EXPECT_EQ(0x03, reinterpret_cast<char *>(&data64)[2]);
149   EXPECT_EQ(0x04, reinterpret_cast<char *>(&data64)[3]);
150   EXPECT_EQ(0x05, reinterpret_cast<char *>(&data64)[4]);
151   EXPECT_EQ(0x06, reinterpret_cast<char *>(&data64)[5]);
152   EXPECT_EQ(0x07, reinterpret_cast<char *>(&data64)[6]);
153   EXPECT_EQ(0x08, reinterpret_cast<char *>(&data64)[7]);
154 }
155 #endif  // defined(EMBOSS_NATIVE_TO_LITTLE_ENDIAN)
156 
157 #if defined(EMBOSS_NATIVE_TO_BIG_ENDIAN)
TEST(EndianConversion,NativeToBigEndian)158 TEST(EndianConversion, NativeToBigEndian) {
159   ::std::uint16_t data16 =
160       EMBOSS_NATIVE_TO_BIG_ENDIAN(static_cast</**/ ::std::uint16_t>(0x0102));
161   EXPECT_EQ(0x01, reinterpret_cast<char *>(&data16)[0]);
162   EXPECT_EQ(0x02, reinterpret_cast<char *>(&data16)[1]);
163 
164   ::std::uint32_t data32 = EMBOSS_NATIVE_TO_BIG_ENDIAN(
165       static_cast</**/ ::std::uint32_t>(0x01020304));
166   EXPECT_EQ(0x01, reinterpret_cast<char *>(&data32)[0]);
167   EXPECT_EQ(0x02, reinterpret_cast<char *>(&data32)[1]);
168   EXPECT_EQ(0x03, reinterpret_cast<char *>(&data32)[2]);
169   EXPECT_EQ(0x04, reinterpret_cast<char *>(&data32)[3]);
170 
171   ::std::uint64_t data64 = EMBOSS_NATIVE_TO_BIG_ENDIAN(
172       static_cast</**/ ::std::uint64_t>(0x0102030405060708));
173   EXPECT_EQ(0x01, reinterpret_cast<char *>(&data64)[0]);
174   EXPECT_EQ(0x02, reinterpret_cast<char *>(&data64)[1]);
175   EXPECT_EQ(0x03, reinterpret_cast<char *>(&data64)[2]);
176   EXPECT_EQ(0x04, reinterpret_cast<char *>(&data64)[3]);
177   EXPECT_EQ(0x05, reinterpret_cast<char *>(&data64)[4]);
178   EXPECT_EQ(0x06, reinterpret_cast<char *>(&data64)[5]);
179   EXPECT_EQ(0x07, reinterpret_cast<char *>(&data64)[6]);
180   EXPECT_EQ(0x08, reinterpret_cast<char *>(&data64)[7]);
181 }
182 #endif  // defined(EMBOSS_NATIVE_TO_BIG_ENDIAN)
183 
184 }  // namespace test
185 }  // namespace support
186 }  // namespace emboss
187