blob: a3a7ed0eac5a45b91b2db722cdce834e7179258e [file] [log] [blame]
Brian Silverman41cdd3e2019-01-19 19:48:58 -08001/*----------------------------------------------------------------------------*/
2/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
3/* Open Source Software - may be modified and shared by FRC teams. The code */
4/* must be accompanied by the FIRST BSD license file in the root directory of */
5/* the project. */
6/*----------------------------------------------------------------------------*/
7
8//===- llvm/unittest/Support/LEB128Test.cpp - LEB128 function tests -------===//
9//
10// The LLVM Compiler Infrastructure
11//
12// This file is distributed under the University of Illinois Open Source
13// License. See LICENSE.TXT for details.
14//
15//===----------------------------------------------------------------------===//
16
17#include <stdint.h>
18
19#include <string>
20
21#include "gtest/gtest.h"
22#include "wpi/SmallString.h"
23#include "wpi/StringRef.h"
24#include "wpi/leb128.h"
25#include "wpi/raw_istream.h"
26
27namespace wpi {
28
29TEST(LEB128Test, WriteUleb128) {
30#define EXPECT_ULEB128_EQ(EXPECTED, VALUE, PAD) \
31 do { \
32 StringRef expected(EXPECTED, sizeof(EXPECTED) - 1); \
33 SmallString<32> buf; \
34 size_t size = WriteUleb128(buf, VALUE); \
35 EXPECT_EQ(size, buf.size()); \
36 EXPECT_EQ(expected, buf.str()); \
37 } while (0)
38
39 // Write ULEB128
40 EXPECT_ULEB128_EQ("\x00", 0, 0);
41 EXPECT_ULEB128_EQ("\x01", 1, 0);
42 EXPECT_ULEB128_EQ("\x3f", 63, 0);
43 EXPECT_ULEB128_EQ("\x40", 64, 0);
44 EXPECT_ULEB128_EQ("\x7f", 0x7f, 0);
45 EXPECT_ULEB128_EQ("\x80\x01", 0x80, 0);
46 EXPECT_ULEB128_EQ("\x81\x01", 0x81, 0);
47 EXPECT_ULEB128_EQ("\x90\x01", 0x90, 0);
48 EXPECT_ULEB128_EQ("\xff\x01", 0xff, 0);
49 EXPECT_ULEB128_EQ("\x80\x02", 0x100, 0);
50 EXPECT_ULEB128_EQ("\x81\x02", 0x101, 0);
51
52#undef EXPECT_ULEB128_EQ
53}
54
55TEST(LEB128Test, ReadUleb128) {
56#define EXPECT_READ_ULEB128_EQ(EXPECTED, VALUE) \
57 do { \
58 uint64_t val = 0; \
59 size_t size = ReadUleb128(VALUE, &val); \
60 EXPECT_EQ(sizeof(VALUE) - 1, size); \
61 EXPECT_EQ(EXPECTED, val); \
62 } while (0)
63
64 // Read ULEB128
65 EXPECT_READ_ULEB128_EQ(0u, "\x00");
66 EXPECT_READ_ULEB128_EQ(1u, "\x01");
67 EXPECT_READ_ULEB128_EQ(63u, "\x3f");
68 EXPECT_READ_ULEB128_EQ(64u, "\x40");
69 EXPECT_READ_ULEB128_EQ(0x7fu, "\x7f");
70 EXPECT_READ_ULEB128_EQ(0x80u, "\x80\x01");
71 EXPECT_READ_ULEB128_EQ(0x81u, "\x81\x01");
72 EXPECT_READ_ULEB128_EQ(0x90u, "\x90\x01");
73 EXPECT_READ_ULEB128_EQ(0xffu, "\xff\x01");
74 EXPECT_READ_ULEB128_EQ(0x100u, "\x80\x02");
75 EXPECT_READ_ULEB128_EQ(0x101u, "\x81\x02");
76 EXPECT_READ_ULEB128_EQ(8320u, "\x80\xc1\x80\x80\x10");
77
78#undef EXPECT_READ_ULEB128_EQ
79}
80
81TEST(LEB128Test, SizeUleb128) {
82 // Testing Plan:
83 // (1) 128 ^ n ............ need (n+1) bytes
84 // (2) 128 ^ n * 64 ....... need (n+1) bytes
85 // (3) 128 ^ (n+1) - 1 .... need (n+1) bytes
86
87 EXPECT_EQ(1u, SizeUleb128(0)); // special case
88
89 EXPECT_EQ(1u, SizeUleb128(0x1UL));
90 EXPECT_EQ(1u, SizeUleb128(0x40UL));
91 EXPECT_EQ(1u, SizeUleb128(0x7fUL));
92
93 EXPECT_EQ(2u, SizeUleb128(0x80UL));
94 EXPECT_EQ(2u, SizeUleb128(0x2000UL));
95 EXPECT_EQ(2u, SizeUleb128(0x3fffUL));
96
97 EXPECT_EQ(3u, SizeUleb128(0x4000UL));
98 EXPECT_EQ(3u, SizeUleb128(0x100000UL));
99 EXPECT_EQ(3u, SizeUleb128(0x1fffffUL));
100
101 EXPECT_EQ(4u, SizeUleb128(0x200000UL));
102 EXPECT_EQ(4u, SizeUleb128(0x8000000UL));
103 EXPECT_EQ(4u, SizeUleb128(0xfffffffUL));
104
105 EXPECT_EQ(5u, SizeUleb128(0x10000000UL));
106 EXPECT_EQ(5u, SizeUleb128(0x40000000UL));
107 EXPECT_EQ(5u, SizeUleb128(0x7fffffffUL));
108
109 EXPECT_EQ(5u, SizeUleb128(UINT32_MAX));
110}
111
112} // namespace wpi