1 | //===- unittests/Support/EndianStreamTest.cpp - EndianStream.h tests ------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "llvm/Support/EndianStream.h" |
10 | #include "llvm/ADT/SmallString.h" |
11 | #include "llvm/Support/DataTypes.h" |
12 | #include "gtest/gtest.h" |
13 | using namespace llvm; |
14 | using namespace support; |
15 | |
16 | namespace { |
17 | |
18 | TEST(EndianStream, WriteInt32LE) { |
19 | SmallString<16> data; |
20 | |
21 | { |
22 | raw_svector_ostream OS(data); |
23 | endian::Writer LE(OS, llvm::endianness::little); |
24 | LE.write(Val: static_cast<int32_t>(-1362446643)); |
25 | } |
26 | |
27 | EXPECT_EQ(static_cast<uint8_t>(data[0]), 0xCD); |
28 | EXPECT_EQ(static_cast<uint8_t>(data[1]), 0xB6); |
29 | EXPECT_EQ(static_cast<uint8_t>(data[2]), 0xCA); |
30 | EXPECT_EQ(static_cast<uint8_t>(data[3]), 0xAE); |
31 | } |
32 | |
33 | TEST(EndianStream, WriteInt32BE) { |
34 | SmallVector<char, 16> data; |
35 | |
36 | { |
37 | raw_svector_ostream OS(data); |
38 | endian::Writer BE(OS, llvm::endianness::big); |
39 | BE.write(Val: static_cast<int32_t>(-1362446643)); |
40 | } |
41 | |
42 | EXPECT_EQ(static_cast<uint8_t>(data[0]), 0xAE); |
43 | EXPECT_EQ(static_cast<uint8_t>(data[1]), 0xCA); |
44 | EXPECT_EQ(static_cast<uint8_t>(data[2]), 0xB6); |
45 | EXPECT_EQ(static_cast<uint8_t>(data[3]), 0xCD); |
46 | } |
47 | |
48 | |
49 | TEST(EndianStream, WriteFloatLE) { |
50 | SmallString<16> data; |
51 | |
52 | { |
53 | raw_svector_ostream OS(data); |
54 | endian::Writer LE(OS, llvm::endianness::little); |
55 | LE.write(Val: 12345.0f); |
56 | } |
57 | |
58 | EXPECT_EQ(static_cast<uint8_t>(data[0]), 0x00); |
59 | EXPECT_EQ(static_cast<uint8_t>(data[1]), 0xE4); |
60 | EXPECT_EQ(static_cast<uint8_t>(data[2]), 0x40); |
61 | EXPECT_EQ(static_cast<uint8_t>(data[3]), 0x46); |
62 | } |
63 | |
64 | TEST(EndianStream, WriteFloatBE) { |
65 | SmallVector<char, 16> data; |
66 | |
67 | { |
68 | raw_svector_ostream OS(data); |
69 | endian::Writer BE(OS, llvm::endianness::big); |
70 | BE.write(Val: 12345.0f); |
71 | } |
72 | |
73 | EXPECT_EQ(static_cast<uint8_t>(data[0]), 0x46); |
74 | EXPECT_EQ(static_cast<uint8_t>(data[1]), 0x40); |
75 | EXPECT_EQ(static_cast<uint8_t>(data[2]), 0xE4); |
76 | EXPECT_EQ(static_cast<uint8_t>(data[3]), 0x00); |
77 | } |
78 | |
79 | TEST(EndianStream, WriteInt64LE) { |
80 | SmallString<16> data; |
81 | |
82 | { |
83 | raw_svector_ostream OS(data); |
84 | endian::Writer LE(OS, llvm::endianness::little); |
85 | LE.write(Val: static_cast<int64_t>(-136244664332342323)); |
86 | } |
87 | |
88 | EXPECT_EQ(static_cast<uint8_t>(data[0]), 0xCD); |
89 | EXPECT_EQ(static_cast<uint8_t>(data[1]), 0xAB); |
90 | EXPECT_EQ(static_cast<uint8_t>(data[2]), 0xED); |
91 | EXPECT_EQ(static_cast<uint8_t>(data[3]), 0x1B); |
92 | EXPECT_EQ(static_cast<uint8_t>(data[4]), 0x33); |
93 | EXPECT_EQ(static_cast<uint8_t>(data[5]), 0xF6); |
94 | EXPECT_EQ(static_cast<uint8_t>(data[6]), 0x1B); |
95 | EXPECT_EQ(static_cast<uint8_t>(data[7]), 0xFE); |
96 | } |
97 | |
98 | TEST(EndianStream, WriteInt64BE) { |
99 | SmallVector<char, 16> data; |
100 | |
101 | { |
102 | raw_svector_ostream OS(data); |
103 | endian::Writer BE(OS, llvm::endianness::big); |
104 | BE.write(Val: static_cast<int64_t>(-136244664332342323)); |
105 | } |
106 | |
107 | EXPECT_EQ(static_cast<uint8_t>(data[0]), 0xFE); |
108 | EXPECT_EQ(static_cast<uint8_t>(data[1]), 0x1B); |
109 | EXPECT_EQ(static_cast<uint8_t>(data[2]), 0xF6); |
110 | EXPECT_EQ(static_cast<uint8_t>(data[3]), 0x33); |
111 | EXPECT_EQ(static_cast<uint8_t>(data[4]), 0x1B); |
112 | EXPECT_EQ(static_cast<uint8_t>(data[5]), 0xED); |
113 | EXPECT_EQ(static_cast<uint8_t>(data[6]), 0xAB); |
114 | EXPECT_EQ(static_cast<uint8_t>(data[7]), 0xCD); |
115 | } |
116 | |
117 | TEST(EndianStream, WriteDoubleLE) { |
118 | SmallString<16> data; |
119 | |
120 | { |
121 | raw_svector_ostream OS(data); |
122 | endian::Writer LE(OS, llvm::endianness::little); |
123 | LE.write(Val: -2349214918.58107); |
124 | } |
125 | |
126 | EXPECT_EQ(static_cast<uint8_t>(data[0]), 0x20); |
127 | EXPECT_EQ(static_cast<uint8_t>(data[1]), 0x98); |
128 | EXPECT_EQ(static_cast<uint8_t>(data[2]), 0xD2); |
129 | EXPECT_EQ(static_cast<uint8_t>(data[3]), 0x98); |
130 | EXPECT_EQ(static_cast<uint8_t>(data[4]), 0xC5); |
131 | EXPECT_EQ(static_cast<uint8_t>(data[5]), 0x80); |
132 | EXPECT_EQ(static_cast<uint8_t>(data[6]), 0xE1); |
133 | EXPECT_EQ(static_cast<uint8_t>(data[7]), 0xC1); |
134 | } |
135 | |
136 | TEST(EndianStream, WriteDoubleBE) { |
137 | SmallVector<char, 16> data; |
138 | |
139 | { |
140 | raw_svector_ostream OS(data); |
141 | endian::Writer BE(OS, llvm::endianness::big); |
142 | BE.write(Val: -2349214918.58107); |
143 | } |
144 | |
145 | EXPECT_EQ(static_cast<uint8_t>(data[0]), 0xC1); |
146 | EXPECT_EQ(static_cast<uint8_t>(data[1]), 0xE1); |
147 | EXPECT_EQ(static_cast<uint8_t>(data[2]), 0x80); |
148 | EXPECT_EQ(static_cast<uint8_t>(data[3]), 0xC5); |
149 | EXPECT_EQ(static_cast<uint8_t>(data[4]), 0x98); |
150 | EXPECT_EQ(static_cast<uint8_t>(data[5]), 0xD2); |
151 | EXPECT_EQ(static_cast<uint8_t>(data[6]), 0x98); |
152 | EXPECT_EQ(static_cast<uint8_t>(data[7]), 0x20); |
153 | } |
154 | |
155 | TEST(EndianStream, WriteArrayLE) { |
156 | SmallString<16> Data; |
157 | |
158 | { |
159 | raw_svector_ostream OS(Data); |
160 | endian::Writer LE(OS, llvm::endianness::little); |
161 | LE.write<uint16_t>(Val: {0x1234, 0x5678}); |
162 | } |
163 | |
164 | EXPECT_EQ(static_cast<uint8_t>(Data[0]), 0x34); |
165 | EXPECT_EQ(static_cast<uint8_t>(Data[1]), 0x12); |
166 | EXPECT_EQ(static_cast<uint8_t>(Data[2]), 0x78); |
167 | EXPECT_EQ(static_cast<uint8_t>(Data[3]), 0x56); |
168 | } |
169 | |
170 | TEST(EndianStream, WriteVectorLE) { |
171 | SmallString<16> Data; |
172 | |
173 | { |
174 | raw_svector_ostream OS(Data); |
175 | endian::Writer LE(OS, llvm::endianness::little); |
176 | std::vector<uint16_t> Vec{0x1234, 0x5678}; |
177 | LE.write<uint16_t>(Val: Vec); |
178 | } |
179 | |
180 | EXPECT_EQ(static_cast<uint8_t>(Data[0]), 0x34); |
181 | EXPECT_EQ(static_cast<uint8_t>(Data[1]), 0x12); |
182 | EXPECT_EQ(static_cast<uint8_t>(Data[2]), 0x78); |
183 | EXPECT_EQ(static_cast<uint8_t>(Data[3]), 0x56); |
184 | } |
185 | |
186 | TEST(EndianStream, WriteFloatArrayLE) { |
187 | SmallString<16> Data; |
188 | |
189 | { |
190 | raw_svector_ostream OS(Data); |
191 | endian::Writer LE(OS, llvm::endianness::little); |
192 | LE.write<float>(Val: {12345.0f, 12346.0f}); |
193 | } |
194 | |
195 | EXPECT_EQ(static_cast<uint8_t>(Data[0]), 0x00); |
196 | EXPECT_EQ(static_cast<uint8_t>(Data[1]), 0xE4); |
197 | EXPECT_EQ(static_cast<uint8_t>(Data[2]), 0x40); |
198 | EXPECT_EQ(static_cast<uint8_t>(Data[3]), 0x46); |
199 | |
200 | EXPECT_EQ(static_cast<uint8_t>(Data[4]), 0x00); |
201 | EXPECT_EQ(static_cast<uint8_t>(Data[5]), 0xE8); |
202 | EXPECT_EQ(static_cast<uint8_t>(Data[6]), 0x40); |
203 | EXPECT_EQ(static_cast<uint8_t>(Data[7]), 0x46); |
204 | } |
205 | |
206 | |
207 | } // end anon namespace |
208 | |