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