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