15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- implTest.cpp -------------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/LEB128.h"
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "LEB128Test.h"
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/SystemUtils.h"
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <ctime>
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <cstdlib>
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcldtest;
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Constructor can do set-up work for all test here.
2037b74a387bb3993387029859c2d9d051c41c724eStephen HinesLEB128Test::LEB128Test() {
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // Initialize the seed for random number generator using during the tests.
22f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  sys::SetRandomSeed(::time(NULL));
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Destructor can do clean-up work that doesn't throw exceptions here.
2637b74a387bb3993387029859c2d9d051c41c724eStephen HinesLEB128Test::~LEB128Test() {
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// SetUp() will be called immediately before each test.
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid LEB128Test::SetUp() {
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// TearDown() will be called immediately after each test.
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid LEB128Test::TearDown() {
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//==========================================================================//
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Testcases
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4137b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LEB128Test, EncodeULEB_Example_from_Dwarf3_Figure22_Using_32bits) {
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[2];
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  leb128::ByteType* result;
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 2);
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 2);
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 127);
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 127);
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 128);
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0 + 0x80);
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 129);
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1 + 0x80);
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 130);
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 2 + 0x80);
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 12857);
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 57 + 0x80);
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 100);
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8737b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LEB128Test, EncodeULEB_Example_from_Dwarf3_Figure22_Using_64bits) {
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[2];
8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  leb128::ByteType* result;
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 2);
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 2);
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 127);
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 127);
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 128);
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0 + 0x80);
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 129);
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1 + 0x80);
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 130);
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 2 + 0x80);
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 12857);
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 57 + 0x80);
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 100);
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
13337b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LEB128Test, EncodeSLEB_Example_from_Dwarf3_Figure22) {
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[2];
13537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  leb128::ByteType* result;
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, 2);
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 2);
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, -2);
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x7e);
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, 127);
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 127 + 0x80);
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0);
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, -127);
1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1 + 0x80);
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x7f);
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
16222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, 128);
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0 + 0x80);
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, -128);
1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0 + 0x80);
1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x7f);
1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, 129);
1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1 + 0x80);
1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, -129);
1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x7f + 0x80);
1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x7e);
1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
19337b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LEB128Test, DecodeULEB_Example_from_Dwarf3_Figure22) {
1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[2];
1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 2;
1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0;
19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 2);
20022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 127;
2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0;
20422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 127);
20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 0 + 0x80;
2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 1;
20922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 128);
21022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 1 + 0x80;
2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 1;
21422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 129);
21522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 2 + 0x80;
2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 1;
21922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 130);
22022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 57 + 0x80;
2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 100;
22422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 12857);
22522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
22837b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LEB128Test, DecodeSLEB_Example_from_Dwarf3_Figure22) {
2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[2];
2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 2;
2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0;
2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), 2);
23522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 0x7e;
2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0;
2395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), -2);
24022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 127 + 0x80;
2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0;
2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), 127);
24522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 1 + 0x80;
2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0x7f;
2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), -127);
25022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 0 + 0x80;
2535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 1;
2545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), 128);
25522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
2565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 0 + 0x80;
2585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0x7f;
2595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), -128);
26022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
2615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 1 + 0x80;
2635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 1;
2645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), 129);
26522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
2665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 0x7f + 0x80;
2685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0x7e;
2695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), -129);
27022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
2715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
27337b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LEB128Test, DecodeULEB_Tests_Found_in_Android_dalvik_dx) {
2745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType content[2];
27537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const leb128::ByteType* p;
2765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[0] = 0;
2785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  p = content;
27922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(leb128::decode<uint64_t>(p) == 0);
2805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, content + 1);
2815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[0] = 1;
2835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  p = content;
28422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(leb128::decode<uint64_t>(p) == 1);
2855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, content + 1);
2865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[0] = 0x80;
2885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[1] = 0x7f;
2895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  p = content;
29022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(leb128::decode<uint64_t>(p) == 16256);
2915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, content + 2);
2925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
29437b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LEB128Test, EncodeULEB_Tests_Found_in_Android_dalvik_dx) {
2955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[5];
29637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  leb128::ByteType* result;
2975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
2985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 0);
3015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0);
3025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
30322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
3045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 0);
3075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0);
3085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
30922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
3105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 1);
3135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1);
3145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
31522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
3165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 1);
3195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1);
3205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
32122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
3225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 16256);
3255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x80);
3265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x7f);
3275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
32822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
3295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 16256);
3325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x80);
3335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x7f);
3345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
33522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
3365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 0x3b4);
3395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0xb4);
3405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x07);
3415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
34222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
3435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 0x3b4);
3465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0xb4);
3475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x07);
3485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
34922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
3505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 0x40c);
3535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x8c);
3545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x08);
3555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
35622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
3575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 0x40c);
3605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x8c);
3615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x08);
3625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
36322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 2);
3645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 0xffffffff);
3675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0xff);
3685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0xff);
3695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[2], 0xff);
3705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[3], 0xff);
3715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[4], 0xf);
3725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 5);
37322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 5);
3745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 0xffffffff);
3775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0xff);
3785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0xff);
3795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[2], 0xff);
3805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[3], 0xff);
3815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[4], 0xf);
3825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 5);
38322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 5);
3845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
3855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
38637b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LEB128Test, DecodeSLEB_Tests_Found_in_Android_dalvik_dx) {
3875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType content[2];
38837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const leb128::ByteType* p;
3895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[0] = 0;
3915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  p = content;
3925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(p), 0);
3935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, content + 1);
3945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[0] = 1;
3965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  p = content;
3975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(p), 1);
3985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, content + 1);
3995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[0] = 0x7f;
4015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  p = content;
4025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(p), -1);
4035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, content + 1);
4045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[0] = 0x3c;
4065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  p = content;
4075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(p), 0x3c);
4085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, content + 1);
4095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
4105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
41137b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LEB128Test, EncodeSLEB_Tests_Found_in_Android_dalvik_dx) {
4125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[5];
41337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  leb128::ByteType* result;
4145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
4155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
4175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, 0);
4185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0);
4195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
42022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
4215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
4235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int64_t>(result, 0);
4245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0);
4255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
42622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
4275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
4295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, 1);
4305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1);
4315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
43222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
4335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
4355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int64_t>(result, 1);
4365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1);
4375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
43822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
4395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
4415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, -1);
4425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x7f);
4435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
44422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
4455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
4475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int64_t>(result, -1);
4485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x7f);
4495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
45022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 1);
4515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
4525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
45337b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LEB128Test, Random_Regression_Test) {
454affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  leb128::ByteType buffer[9];
4555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for (int i = 0; i < 20; i++) {
457f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    unsigned long int value = sys::GetRandomNum();
4585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    uint64_t value2 = value * value;
45922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    int64_t value3 = value * value;
46037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    leb128::ByteType* result;
4615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    size_t encode_size, decode_size;
4625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Test encode<uint32_t> and decode<uint64_t> on value
4645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    result = buffer;
4655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    encode_size = leb128::encode<uint32_t>(result, value);
4665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(result, buffer + encode_size);
4675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(leb128::decode<uint64_t>(buffer, decode_size), value);
4685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(encode_size, decode_size);
4695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Test encode<uint64_t> and decode<uint64_t> on (value * value)
4715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    result = buffer;
4725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    encode_size = leb128::encode<uint64_t>(result, value2);
4735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(result, buffer + encode_size);
4745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(leb128::decode<uint64_t>(buffer, decode_size), value2);
4755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(encode_size, decode_size);
4765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Test encode<uint64_t> and decode<uint64_t> on (value * value)
4785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    result = buffer;
47922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    encode_size = leb128::encode<int64_t>(result, value3);
4805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(result, buffer + encode_size);
48122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    ASSERT_EQ(leb128::decode<int64_t>(buffer, decode_size), value3);
4825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(encode_size, decode_size);
4835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Test encode<uint64_t> and decode<uint64_t> on -(value * value)
4855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    result = buffer;
48622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    encode_size = leb128::encode<int64_t>(result, -value3);
4875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(result, buffer + encode_size);
48822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    ASSERT_EQ(leb128::decode<int64_t>(buffer, decode_size), -value3);
4895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(encode_size, decode_size);
4905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
4915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
4925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
49337b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LEB128Test, Other_Test) {
4945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[5];
49537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  leb128::ByteType* result;
4965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
4975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
4995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::encode<uint64_t>(result, 154452);
5005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 3);
5015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0xd4);
5025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0xb6);
5035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[2], 0x9);
5045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
50522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 154452);
50622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 3);
5075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
5085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
50937b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LEB128Test, Type_Conversion_Test) {
5105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  char buffer[5];
51137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  char* result;
5125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
5135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
5155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::encode<uint64_t>(result, 154452);
5165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 3);
5175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], '\xd4');
5185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], '\xb6');
5195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[2], '\x09');
5205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
52122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 154452);
52222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(size == 3);
5235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
52437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const char* p = buffer;
52522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(leb128::decode<uint64_t>(p) == 154452);
52622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(p == (buffer + 3));
5275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
528