1081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson/* 2081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson * Copyright (C) 2011 The Android Open Source Project 3081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson * 4081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson * you may not use this file except in compliance with the License. 6081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson * You may obtain a copy of the License at 7081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson * 8081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson * 10081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson * Unless required by applicable law or agreed to in writing, software 11081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson * See the License for the specific language governing permissions and 14081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson * limitations under the License. 15081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson */ 16081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson 17081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilsonpackage com.android.dx.util; 18081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson 19fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilsonimport com.android.dex.util.ByteArrayByteInput; 20fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilsonimport com.android.dex.Leb128; 21081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilsonimport java.io.IOException; 22081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilsonimport java.util.Arrays; 23081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilsonimport junit.framework.TestCase; 24081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson 25081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilsonpublic final class Leb128UtilsTest extends TestCase { 26081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson 27081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson public void testDecodeUnsignedLeb() throws IOException { 28fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilson assertEquals(0, Leb128.readUnsignedLeb128(new ByteArrayByteInput((byte) 0))); 29fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilson assertEquals(1, Leb128.readUnsignedLeb128(new ByteArrayByteInput((byte) 1))); 30fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilson assertEquals(127, Leb128.readUnsignedLeb128(new ByteArrayByteInput((byte) 0x7f))); 31fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilson assertEquals(16256, Leb128.readUnsignedLeb128( 32bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson new ByteArrayByteInput((byte) 0x80, (byte) 0x7f))); 33081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson } 34081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson 35081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson public void testEncodeUnsignedLeb() throws IOException { 36081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson assertEquals(new byte[] { 0 }, encodeUnsignedLeb(0)); 37081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson assertEquals(new byte[] { 1 }, encodeUnsignedLeb(1)); 38bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson assertEquals(new byte[] { 0x7f }, encodeUnsignedLeb(127)); 39bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson assertEquals(new byte[] { (byte) 0x80, 0x7f }, encodeUnsignedLeb(16256)); 40081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson assertEquals(new byte[] { (byte) 0xb4, 0x07 }, encodeUnsignedLeb(0x3b4)); 41081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson assertEquals(new byte[] { (byte) 0x8c, 0x08 }, encodeUnsignedLeb(0x40c)); 42bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson assertEquals(new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 0xf }, 43bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson encodeUnsignedLeb(0xffffffff)); 44081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson } 45081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson 46081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson public void testDecodeSignedLeb() throws IOException { 47fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilson assertEquals(0, Leb128.readSignedLeb128(new ByteArrayByteInput((byte) 0))); 48fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilson assertEquals(1, Leb128.readSignedLeb128(new ByteArrayByteInput((byte) 1))); 49fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilson assertEquals(-1, Leb128.readSignedLeb128(new ByteArrayByteInput((byte) 0x7f))); 50fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilson assertEquals(0x3c, Leb128.readSignedLeb128(new ByteArrayByteInput((byte) 0x3c))); 51fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilson assertEquals(-128, Leb128.readSignedLeb128( 52bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson new ByteArrayByteInput((byte) 0x80, (byte) 0x7f))); 53081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson } 54081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson 55081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson public void testEncodeSignedLeb() throws IOException { 56081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson assertEquals(new byte[] { 0 }, encodeSignedLeb(0)); 57081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson assertEquals(new byte[] { 1 }, encodeSignedLeb(1)); 58bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson assertEquals(new byte[] { 0x7f }, encodeSignedLeb(-1)); 59bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson assertEquals(new byte[] { (byte) 0x80, 0x7f }, encodeSignedLeb(-128)); 60081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson } 61081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson 62081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson private byte[] encodeSignedLeb(int value) { 63bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson ByteArrayAnnotatedOutput out = new ByteArrayAnnotatedOutput(5); 64fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilson Leb128.writeSignedLeb128(out, value); 65bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson return out.toByteArray(); 66081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson } 67081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson 68081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson private byte[] encodeUnsignedLeb(int value) { 69bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson ByteArrayAnnotatedOutput out = new ByteArrayAnnotatedOutput(5); 70fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilson Leb128.writeUnsignedLeb128(out, value); 71bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson return out.toByteArray(); 72081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson } 73081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson 74081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson private void assertEquals(byte[] expected, byte[] actual) { 75bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson assertTrue(Arrays.toString(actual), Arrays.equals(expected, actual)); 76081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson } 77081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson} 78