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