1 // Copyright 2019 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "core/fxcrt/byteorder.h"
6 
7 #include "testing/gtest/include/gtest/gtest.h"
8 
9 namespace {
10 
11 // Original code to use as a reference implementation.
12 
13 #define FXWORD_GET_LSBFIRST(p)                                \
14   (static_cast<uint16_t>((static_cast<uint16_t>(p[1]) << 8) | \
15                          (static_cast<uint16_t>(p[0]))))
16 #define FXWORD_GET_MSBFIRST(p)                                \
17   (static_cast<uint16_t>((static_cast<uint16_t>(p[0]) << 8) | \
18                          (static_cast<uint16_t>(p[1]))))
19 #define FXDWORD_GET_LSBFIRST(p)                                                \
20   ((static_cast<uint32_t>(p[3]) << 24) | (static_cast<uint32_t>(p[2]) << 16) | \
21    (static_cast<uint32_t>(p[1]) << 8) | (static_cast<uint32_t>(p[0])))
22 #define FXDWORD_GET_MSBFIRST(p)                                                \
23   ((static_cast<uint32_t>(p[0]) << 24) | (static_cast<uint32_t>(p[1]) << 16) | \
24    (static_cast<uint32_t>(p[2]) << 8) | (static_cast<uint32_t>(p[3])))
25 
26 constexpr uint32_t kTestValues32[] = {
27     0x0,      0x1,        0x2,        0x3,        0x4,       0xfe,
28     0xff,     0x100,      0x101,      0xffff,     0x10000,   0x123456,
29     0x345167, 0x2f3e4a5b, 0xff000000, 0xfffffffe, 0xffffffff};
30 
31 }  // namespace
32 
33 namespace fxcrt {
34 
TEST(ByteOrder,ByteSwapToLE16)35 TEST(ByteOrder, ByteSwapToLE16) {
36   // Since there are so few values, test them all.
37   for (uint32_t v = 0; v < 0x10000; ++v) {
38     const uint16_t v16 = v;
39     uint16_t expected =
40         FXWORD_GET_LSBFIRST(reinterpret_cast<const uint8_t*>(&v16));
41     EXPECT_EQ(expected, ByteSwapToLE16(v16)) << v;
42   }
43 }
44 
TEST(ByteOrder,ByteSwapToLE32)45 TEST(ByteOrder, ByteSwapToLE32) {
46   for (uint32_t v : kTestValues32) {
47     uint32_t expected =
48         FXDWORD_GET_LSBFIRST(reinterpret_cast<const uint8_t*>(&v));
49     EXPECT_EQ(expected, ByteSwapToLE32(v)) << v;
50   }
51 }
52 
TEST(ByteOrder,ByteSwapToBE16)53 TEST(ByteOrder, ByteSwapToBE16) {
54   // Since there are so few values, test them all.
55   for (uint32_t v = 0; v < 0x10000; ++v) {
56     const uint16_t v16 = v;
57     uint16_t expected =
58         FXWORD_GET_MSBFIRST(reinterpret_cast<const uint8_t*>(&v16));
59     EXPECT_EQ(expected, ByteSwapToBE16(v16)) << v;
60   }
61 }
62 
TEST(ByteOrder,ByteSwapToBE32)63 TEST(ByteOrder, ByteSwapToBE32) {
64   for (uint32_t v : kTestValues32) {
65     uint32_t expected =
66         FXDWORD_GET_MSBFIRST(reinterpret_cast<const uint8_t*>(&v));
67     EXPECT_EQ(expected, ByteSwapToBE32(v)) << v;
68   }
69 }
70 
71 }  // namespace fxcrt
72