LEB128Test.cpp revision affc150dc44fab1911775a49636d0ce85333b634
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//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/LEB128.h>
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "LEB128Test.h"
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <ctime>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <cstdlib>
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcldtest;
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Constructor can do set-up work for all test here.
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoLEB128Test::LEB128Test()
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao	// Initialize the seed for random number generator using during the tests.
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ::srandom(::time(NULL));
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Destructor can do clean-up work that doesn't throw exceptions here.
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoLEB128Test::~LEB128Test()
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// SetUp() will be called immediately before each test.
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid LEB128Test::SetUp()
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// TearDown() will be called immediately after each test.
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid LEB128Test::TearDown()
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//==========================================================================//
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Testcases
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( LEB128Test, EncodeULEB_Example_from_Dwarf3_Figure22_Using_32bits) {
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[2];
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType *result;
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 2);
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 2);
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 127);
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 127);
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 128);
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0 + 0x80);
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 129);
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1 + 0x80);
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 130);
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 2 + 0x80);
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 12857);
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 57 + 0x80);
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 100);
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( LEB128Test, EncodeULEB_Example_from_Dwarf3_Figure22_Using_64bits) {
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[2];
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType *result;
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 2);
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 2);
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 127);
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 127);
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 128);
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0 + 0x80);
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 129);
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1 + 0x80);
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 130);
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 2 + 0x80);
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 12857);
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 57 + 0x80);
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 100);
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( LEB128Test, EncodeSLEB_Example_from_Dwarf3_Figure22) {
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[2];
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType *result;
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, 2);
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 2);
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, -2);
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x7e);
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, 127);
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 127 + 0x80);
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0);
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, -127);
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1 + 0x80);
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x7f);
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, 128);
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0 + 0x80);
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, -128);
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0 + 0x80);
1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x7f);
1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, 129);
1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1 + 0x80);
1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 1);
1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, -129);
1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x7f + 0x80);
1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x7e);
1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( LEB128Test, DecodeULEB_Example_from_Dwarf3_Figure22) {
1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[2];
1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 2;
2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0;
2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<uint64_t>(buffer, size), 2);
2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 127;
2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0;
2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<uint64_t>(buffer, size), 127);
2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 0 + 0x80;
2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 1;
2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<uint64_t>(buffer, size), 128);
2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 1 + 0x80;
2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 1;
2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<uint64_t>(buffer, size), 129);
2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 2 + 0x80;
2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 1;
2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<uint64_t>(buffer, size), 130);
2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 57 + 0x80;
2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 100;
2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<uint64_t>(buffer, size), 12857);
2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( LEB128Test, DecodeSLEB_Example_from_Dwarf3_Figure22) {
2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[2];
2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 2;
2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0;
2395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), 2);
2405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 0x7e;
2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0;
2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), -2);
2455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 127 + 0x80;
2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0;
2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), 127);
2505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 1 + 0x80;
2535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0x7f;
2545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), -127);
2555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
2565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 0 + 0x80;
2585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 1;
2595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), 128);
2605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
2615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 0 + 0x80;
2635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0x7f;
2645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), -128);
2655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
2665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 1 + 0x80;
2685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 1;
2695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), 129);
2705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
2715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[0] = 0x7f + 0x80;
2735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  buffer[1] = 0x7e;
2745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(buffer, size), -129);
2755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
2765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( LEB128Test, DecodeULEB_Tests_Found_in_Android_dalvik_dx) {
2795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType content[2];
2805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const leb128::ByteType *p;
2815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[0] = 0;
2835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  p = content;
2845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<uint64_t>(p), 0);
2855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, content + 1);
2865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[0] = 1;
2885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  p = content;
2895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<uint64_t>(p), 1);
2905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, content + 1);
2915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[0] = 0x80;
2935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[1] = 0x7f;
2945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  p = content;
2955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<uint64_t>(p), 16256);
2965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, content + 2);
2975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( LEB128Test, EncodeULEB_Tests_Found_in_Android_dalvik_dx) {
3005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[5];
3015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType *result;
3025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
3035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 0);
3065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0);
3075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
3085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
3095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 0);
3125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0);
3135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
3145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
3155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 1);
3185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1);
3195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
3205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
3215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 1);
3245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1);
3255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
3265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
3275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 16256);
3305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x80);
3315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x7f);
3325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
3335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
3345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 16256);
3375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x80);
3385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x7f);
3395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
3405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
3415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 0x3b4);
3445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0xb4);
3455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x07);
3465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
3475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
3485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 0x3b4);
3515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0xb4);
3525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x07);
3535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
3545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
3555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 0x40c);
3585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x8c);
3595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x08);
3605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
3615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
3625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 0x40c);
3655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x8c);
3665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0x08);
3675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 2);
3685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 2);
3695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint32_t>(result, 0xffffffff);
3725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0xff);
3735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0xff);
3745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[2], 0xff);
3755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[3], 0xff);
3765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[4], 0xf);
3775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 5);
3785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 5);
3795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
3815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<uint64_t>(result, 0xffffffff);
3825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0xff);
3835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0xff);
3845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[2], 0xff);
3855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[3], 0xff);
3865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[4], 0xf);
3875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 5);
3885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 5);
3895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
3905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( LEB128Test, DecodeSLEB_Tests_Found_in_Android_dalvik_dx) {
3925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType content[2];
3935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const leb128::ByteType *p;
3945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[0] = 0;
3965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  p = content;
3975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(p), 0);
3985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, content + 1);
3995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[0] = 1;
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] = 0x7f;
4065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  p = content;
4075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(p), -1);
4085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, content + 1);
4095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  content[0] = 0x3c;
4115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  p = content;
4125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<int64_t>(p), 0x3c);
4135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, content + 1);
4145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
4155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( LEB128Test, EncodeSLEB_Tests_Found_in_Android_dalvik_dx) {
4175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[5];
4185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType *result;
4195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
4205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
4225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, 0);
4235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0);
4245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
4255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
4265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
4285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int64_t>(result, 0);
4295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0);
4305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
4315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
4325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
4345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, 1);
4355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1);
4365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
4375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
4385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
4405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int64_t>(result, 1);
4415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 1);
4425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
4435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
4445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
4465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int32_t>(result, -1);
4475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x7f);
4485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
4495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
4505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
4525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size = leb128::encode<int64_t>(result, -1);
4535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0x7f);
4545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 1);
4555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 1);
4565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
4575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( LEB128Test, Random_Regression_Test) {
459affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  leb128::ByteType buffer[9];
4605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for (int i = 0; i < 20; i++) {
4625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    long int value = random();
4635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    uint64_t value2 = value * value;
4645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    leb128::ByteType *result;
4655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    size_t encode_size, decode_size;
4665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Test encode<uint32_t> and decode<uint64_t> on value
4685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    result = buffer;
4695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    encode_size = leb128::encode<uint32_t>(result, value);
4705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(result, buffer + encode_size);
4715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(leb128::decode<uint64_t>(buffer, decode_size), value);
4725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(encode_size, decode_size);
4735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Test encode<uint64_t> and decode<uint64_t> on (value * value)
4755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    result = buffer;
4765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    encode_size = leb128::encode<uint64_t>(result, value2);
4775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(result, buffer + encode_size);
4785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(leb128::decode<uint64_t>(buffer, decode_size), value2);
4795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(encode_size, decode_size);
4805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Test encode<uint64_t> and decode<uint64_t> on (value * value)
4825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    result = buffer;
4835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    encode_size = leb128::encode<int64_t>(result, value2);
4845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(result, buffer + encode_size);
4855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(leb128::decode<int64_t>(buffer, decode_size), value2);
4865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(encode_size, decode_size);
4875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Test encode<uint64_t> and decode<uint64_t> on -(value * value)
4895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    result = buffer;
4905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    encode_size = leb128::encode<int64_t>(result, -value2);
4915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(result, buffer + encode_size);
4925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(leb128::decode<int64_t>(buffer, decode_size), -value2);
4935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ASSERT_EQ(encode_size, decode_size);
4945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
4955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
4965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( LEB128Test, Other_Test) {
4985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType buffer[5];
4995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::ByteType *result;
5005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
5015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
5035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::encode<uint64_t>(result, 154452);
5045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 3);
5055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], 0xd4);
5065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], 0xb6);
5075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[2], 0x9);
5085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<uint64_t>(buffer, size), 154452);
5105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 3);
5115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
5125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( LEB128Test, Type_Conversion_Test) {
5145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  char buffer[5];
5155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  char *result;
5165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t size;
5175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  result = buffer;
5195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  leb128::encode<uint64_t>(result, 154452);
5205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(result, buffer + 3);
5215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[0], '\xd4');
5225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[1], '\xb6');
5235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(buffer[2], '\x09');
5245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<uint64_t>(buffer, size), 154452);
5265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(size, 3);
5275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const char *p = buffer;
5295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(leb128::decode<uint64_t>(p), 154452);
5305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_EQ(p, buffer + 3);
5315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
532