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