17dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver/*
27dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * Copyright 2012, Google Inc.
37dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * All rights reserved.
47dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver *
57dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * Redistribution and use in source and binary forms, with or without
67dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * modification, are permitted provided that the following conditions are
77dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * met:
87dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver *
97dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver *     * Redistributions of source code must retain the above copyright
107dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * notice, this list of conditions and the following disclaimer.
117dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver *     * Redistributions in binary form must reproduce the above
127dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * copyright notice, this list of conditions and the following disclaimer
137dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * in the documentation and/or other materials provided with the
147dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * distribution.
157dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver *     * Neither the name of Google Inc. nor the names of its
167dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * contributors may be used to endorse or promote products derived from
177dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * this software without specific prior written permission.
187dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver *
197dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
207dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
217dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
227dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
237dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
247dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
257dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
267dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
277dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
287dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
297dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
307dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver */
317dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
327dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruverpackage org.jf.dexlib2.writer;
337dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
347dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruverimport junit.framework.Assert;
357dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruverimport org.jf.util.NakedByteArrayOutputStream;
367dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruverimport org.junit.Test;
377dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
387dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruverimport java.io.IOException;
397dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
407dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruverpublic class DexWriterSleb128Test {
417dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver    private NakedByteArrayOutputStream output = new NakedByteArrayOutputStream();
427dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver    private int startPosition;
431bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    private DexDataWriter writer;
447dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
457dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver    public void setup() throws IOException {
467dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        output.reset();
477dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        startPosition = 123;
487dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        int bufferSize = 256;
491bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer = new DexDataWriter(output, startPosition, bufferSize);
507dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver    }
517dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
527dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver    @Test
537dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver    public void testSleb128() throws IOException {
547dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x0, new byte[]{0x0, 0x11}, 1);
557dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x1, new byte[]{0x1, 0x11}, 1);
567dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x3f, new byte[]{0x3f, 0x11}, 1);
577dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xffffffc0, new byte[]{0x40, 0x11}, 1);
587dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfffffff0, new byte[]{0x70, 0x11}, 1);
597dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xffffffff, new byte[]{0x7f, 0x11}, 1);
607dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
617dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x80, new byte[]{(byte)0x80, 0x1, 0x11}, 2);
627dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x100, new byte[]{(byte)0x80, 0x2, 0x11}, 2);
637dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x800, new byte[]{(byte)0x80, 0x10, 0x11}, 2);
647dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x1f80, new byte[]{(byte)0x80, 0x3f, 0x11}, 2);
657dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xffffe000, new byte[]{(byte)0x80, 0x40, 0x11}, 2);
667dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xffffe080, new byte[]{(byte)0x80, 0x41, 0x11}, 2);
677dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfffff800, new byte[]{(byte)0x80, 0x70, 0x11}, 2);
687dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xffffff80, new byte[]{(byte)0x80, 0x7f, 0x11}, 2);
697dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
707dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xff, new byte[]{(byte)0xff, 0x1, 0x11}, 2);
717dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x17f, new byte[]{(byte)0xff, 0x2, 0x11}, 2);
727dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x87f, new byte[]{(byte)0xff, 0x10, 0x11}, 2);
737dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x1fff, new byte[]{(byte)0xff, 0x3f, 0x11}, 2);
747dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xffffe07f, new byte[]{(byte)0xff, 0x40, 0x11}, 2);
757dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xffffe0ff, new byte[]{(byte)0xff, 0x41, 0x11}, 2);
767dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfffff87f, new byte[]{(byte)0xff, 0x70, 0x11}, 2);
777dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
787dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x4000, new byte[]{(byte)0x80, (byte)0x80, 0x1, 0x11}, 3);
797dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x8000, new byte[]{(byte)0x80, (byte)0x80, 0x2, 0x11}, 3);
807dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x40000, new byte[]{(byte)0x80, (byte)0x80, 0x10, 0x11}, 3);
817dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfc000, new byte[]{(byte)0x80, (byte)0x80, 0x3f, 0x11}, 3);
827dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfff00000, new byte[]{(byte)0x80, (byte)0x80, 0x40, 0x11}, 3);
837dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfff04000, new byte[]{(byte)0x80, (byte)0x80, 0x41, 0x11}, 3);
847dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfffc0000, new byte[]{(byte)0x80, (byte)0x80, 0x70, 0x11}, 3);
857dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xffffc000, new byte[]{(byte)0x80, (byte)0x80, 0x7f, 0x11}, 3);
867dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
877dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x7fff, new byte[]{(byte)0xff, (byte)0xff, 0x1, 0x11}, 3);
887dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xbfff, new byte[]{(byte)0xff, (byte)0xff, 0x2, 0x11}, 3);
897dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x43fff, new byte[]{(byte)0xff, (byte)0xff, 0x10, 0x11}, 3);
907dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfffff, new byte[]{(byte)0xff, (byte)0xff, 0x3f, 0x11}, 3);
917dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfff03fff, new byte[]{(byte)0xff, (byte)0xff, 0x40, 0x11}, 3);
927dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfff07fff, new byte[]{(byte)0xff, (byte)0xff, 0x41, 0x11}, 3);
937dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfffc3fff, new byte[]{(byte)0xff, (byte)0xff, 0x70, 0x11}, 3);
947dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
957dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x200000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x1, 0x11}, 4);
967dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x400000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x2, 0x11}, 4);
977dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x2000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x10, 0x11}, 4);
987dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x7e00000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x3f, 0x11}, 4);
997dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xf8000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x40, 0x11}, 4);
1007dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xf8200000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x41, 0x11}, 4);
1017dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfe000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x70, 0x11}, 4);
1027dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xffe00000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x7f, 0x11}, 4);
1037dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
1047dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x3fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x1, 0x11}, 4);
1057dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x5fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x2, 0x11}, 4);
1067dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x21fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x10, 0x11}, 4);
1077dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x7ffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x3f, 0x11}, 4);
1087dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xf81fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x40, 0x11}, 4);
1097dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xf83fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x41, 0x11}, 4);
1107dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfe1fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x70, 0x11}, 4);
1117dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
1127dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x10000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x1, 0x11}, 5);
1137dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x20000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x2, 0x11}, 5);
1147dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x70000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x7, 0x11}, 5);
1157dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x80000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x8, 0x11}, 5);
1167dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xe0000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0xe, 0x11}, 5);
1177dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xf0000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0xf, 0x11}, 5);
1187dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
1197dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x1fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x1, 0x11}, 5);
1207dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x2fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x2, 0x11}, 5);
1217dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x7fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x7, 0x11}, 5);
1227dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x8fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x8, 0x11}, 5);
1237dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xefffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0xe, 0x11}, 5);
1247dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
1257dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x8197d2, new byte[]{(byte)0xd2, (byte)0xaf, (byte)0x86, 0x4});
1267dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x3cc8eb78, new byte[]{(byte)0xf8, (byte)0xd6, (byte)0xa3, (byte)0xe6, 0x3});
1277dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x51307f32, new byte[]{(byte)0xb2, (byte)0xfe, (byte)0xc1, (byte)0x89, 0x5});
1287dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x8893, new byte[]{(byte)0x93, (byte)0x91, 0x2});
1297dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x80fb, new byte[]{(byte)0xfb, (byte)0x81, 0x2});
1307dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x3d, new byte[]{0x3d});
1317dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x987c, new byte[]{(byte)0xfc, (byte)0xb0, 0x2});
1327dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x5b2478, new byte[]{(byte)0xf8, (byte)0xc8, (byte)0xec, 0x2});
1337dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x65350ed9, new byte[]{(byte)0xd9, (byte)0x9d, (byte)0xd4, (byte)0xa9, 0x6});
1347dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x3e, new byte[]{0x3e});
1357dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x7b1e, new byte[]{(byte)0x9e, (byte)0xf6, 0x1});
1367dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xb5, new byte[]{(byte)0xb5, 0x1});
1377dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x96, new byte[]{(byte)0x96, 0x1});
1387dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xa1, new byte[]{(byte)0xa1, 0x1});
1397dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x4d50a85d, new byte[]{(byte)0xdd, (byte)0xd0, (byte)0xc2, (byte)0xea, 0x4});
1407dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xc419, new byte[]{(byte)0x99, (byte)0x88, 0x3});
1417dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xcf34, new byte[]{(byte)0xb4, (byte)0x9e, 0x3});
1427dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x527d, new byte[]{(byte)0xfd, (byte)0xa4, 0x1});
1437dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x5a2894, new byte[]{(byte)0x94, (byte)0xd1, (byte)0xe8, 0x2});
1447dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xa6, new byte[]{(byte)0xa6, 0x1});
1457dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x3e05, new byte[]{(byte)0x85, (byte)0xfc, 0x0});
1467dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x5f, new byte[]{(byte)0xdf, 0x0});
1477dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xe2d9af, new byte[]{(byte)0xaf, (byte)0xb3, (byte)0x8b, 0x7});
1487dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xa853fe14, new byte[]{(byte)0x94, (byte)0xfc, (byte)0xcf, (byte)0xc2, 0xa});
1497dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xa853fe14, new byte[]{(byte)0x94, (byte)0xfc, (byte)0xcf, (byte)0xc2, 0x7a});
1507dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x117de731, new byte[]{(byte)0xb1, (byte)0xce, (byte)0xf7, (byte)0x8b, 0x1});
1517dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xb7c9, new byte[]{(byte)0xc9, (byte)0xef, 0x2});
1527dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xb1, new byte[]{(byte)0xb1, 0x1});
1537dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x4f194d, new byte[]{(byte)0xcd, (byte)0xb2, (byte)0xbc, 0x2});
1547dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x8d5733, new byte[]{(byte)0xb3, (byte)0xae, (byte)0xb5, 0x4});
1557dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x2824e9ae, new byte[]{(byte)0xae, (byte)0xd3, (byte)0x93, (byte)0xc1, 0x2});
1567dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x792e, new byte[]{(byte)0xae, (byte)0xf2, 0x1});
1577dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xadef, new byte[]{(byte)0xef, (byte)0xdb, 0x2});
1587dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x5c, new byte[]{(byte)0xdc, 0x0});
1597dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x14f9ccf8, new byte[]{(byte)0xf8, (byte)0x99, (byte)0xe7, (byte)0xa7, 0x1});
1607dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xd1, new byte[]{(byte)0xd1, 0x1});
1617dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xba787ecd, new byte[]{(byte)0xcd, (byte)0xfd, (byte)0xe1, (byte)0xd3, 0x7b});
1627dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x4f, new byte[]{(byte)0xcf, 0x0});
1637dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfb03, new byte[]{(byte)0x83, (byte)0xf6, 0x3});
1647dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xee3f7cd8, new byte[]{(byte)0xd8, (byte)0xf9, (byte)0xfd, (byte)0xf1, 0x7e});
1657dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x9a6e, new byte[]{(byte)0xee, (byte)0xb4, 0x2});
1667dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x8f0983, new byte[]{(byte)0x83, (byte)0x93, (byte)0xbc, 0x4});
1677dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x3a00e01f, new byte[]{(byte)0x9f, (byte)0xc0, (byte)0x83, (byte)0xd0, 0x3});
1687dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x7f532d93, new byte[]{(byte)0x93, (byte)0xdb, (byte)0xcc, (byte)0xfa, 0x7});
1697dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x179d8d, new byte[]{(byte)0x8d, (byte)0xbb, (byte)0xde, 0x0});
1707dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfc5, new byte[]{(byte)0xc5, 0x1f});
1717dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x11, new byte[]{0x11});
1727dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xc9b53e8, new byte[]{(byte)0xe8, (byte)0xa7, (byte)0xed, (byte)0xe4, 0x0});
1737dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x97, new byte[]{(byte)0x97, 0x1});
1747dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x52b3, new byte[]{(byte)0xb3, (byte)0xa5, 0x1});
1757dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x92, new byte[]{(byte)0x92, 0x1});
1767dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xd2, new byte[]{(byte)0xd2, 0x1});
1777dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x13d330, new byte[]{(byte)0xb0, (byte)0xa6, (byte)0xcf, 0x0});
1787dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x672f41, new byte[]{(byte)0xc1, (byte)0xde, (byte)0x9c, 0x3});
1797dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xcf, new byte[]{(byte)0xcf, 0x1});
1807dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x54ddb6dd, new byte[]{(byte)0xdd, (byte)0xed, (byte)0xf6, (byte)0xa6, 0x5});
1817dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x7ebcae, new byte[]{(byte)0xae, (byte)0xf9, (byte)0xfa, 0x3});
1827dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x38, new byte[]{0x38});
1837dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x8118f4e7, new byte[]{(byte)0xe7, (byte)0xe9, (byte)0xe3, (byte)0x88, 0x78});
1847dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xac, new byte[]{(byte)0xac, 0x1});
1857dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xab309c, new byte[]{(byte)0x9c, (byte)0xe1, (byte)0xac, 0x5});
1867dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x1bf9b2, new byte[]{(byte)0xb2, (byte)0xf3, (byte)0xef, 0x0});
1877dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x8b3c70, new byte[]{(byte)0xf0, (byte)0xf8, (byte)0xac, 0x4});
1887dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x7774, new byte[]{(byte)0xf4, (byte)0xee, 0x1});
1897dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x33e839, new byte[]{(byte)0xb9, (byte)0xd0, (byte)0xcf, 0x1});
1907dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x84d655a0, new byte[]{(byte)0xa0, (byte)0xab, (byte)0xd9, (byte)0xa6, 0x78});
1917dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xf3543ef3, new byte[]{(byte)0xf3, (byte)0xfd, (byte)0xd0, (byte)0x9a, 0x7f});
1927dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x1d777e, new byte[]{(byte)0xfe, (byte)0xee, (byte)0xf5, 0x0});
1937dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xf7, new byte[]{(byte)0xf7, 0x1});
1947dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x2444, new byte[]{(byte)0xc4, (byte)0xc8, 0x0});
1957dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x536b, new byte[]{(byte)0xeb, (byte)0xa6, 0x1});
1967dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xa8, new byte[]{(byte)0xa8, 0x1});
1977dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xdbfc, new byte[]{(byte)0xfc, (byte)0xb7, 0x3});
1987dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xe66db7, new byte[]{(byte)0xb7, (byte)0xdb, (byte)0x99, 0x7});
1997dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xb7ca, new byte[]{(byte)0xca, (byte)0xef, 0x2});
2007dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xe807d0e5, new byte[]{(byte)0xe5, (byte)0xa1, (byte)0x9f, (byte)0xc0, 0x7e});
2017dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x6a4, new byte[]{(byte)0xa4, 0xd});
2027dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x64, new byte[]{(byte)0xe4, 0x0});
2037dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xf3fb75, new byte[]{(byte)0xf5, (byte)0xf6, (byte)0xcf, 0x7});
2047dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xb72cb6b9, new byte[]{(byte)0xb9, (byte)0xed, (byte)0xb2, (byte)0xb9, 0x7b});
2057dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xfd, new byte[]{(byte)0xfd, 0x1});
2067dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xb48b, new byte[]{(byte)0x8b, (byte)0xe9, 0x2});
2077dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x39c3, new byte[]{(byte)0xc3, (byte)0xf3, 0x0});
2087dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x12b8afbd, new byte[]{(byte)0xbd, (byte)0xdf, (byte)0xe2, (byte)0x95, 0x1});
2097dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x56f149, new byte[]{(byte)0xc9, (byte)0xe2, (byte)0xdb, 0x2});
2107dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xbf, new byte[]{(byte)0xbf, 0x1});
2117dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x3ac72481, new byte[]{(byte)0x81, (byte)0xc9, (byte)0x9c, (byte)0xd6, 0x3});
2127dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xb69ca721, new byte[]{(byte)0xa1, (byte)0xce, (byte)0xf2, (byte)0xb4, 0x7b});
2137dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x2380, new byte[]{(byte)0x80, (byte)0xc7, 0x0});
2147dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x656268, new byte[]{(byte)0xe8, (byte)0xc4, (byte)0x95, 0x3});
2157dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x71, new byte[]{(byte)0xf1, 0x0});
2167dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xf06425, new byte[]{(byte)0xa5, (byte)0xc8, (byte)0xc1, 0x7});
2177dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xb587cb, new byte[]{(byte)0xcb, (byte)0x8f, (byte)0xd6, 0x5});
2187dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x8742, new byte[]{(byte)0xc2, (byte)0x8e, 0x2});
2197dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xc6, new byte[]{(byte)0xc6, 0x1});
2207dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xee62789f, new byte[]{(byte)0x9f, (byte)0xf1, (byte)0x89, (byte)0xf3, 0x7e});
2217dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x470a, new byte[]{(byte)0x8a, (byte)0x8e, 0x1});
2227dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x11ef5cdc, new byte[]{(byte)0xdc, (byte)0xb9, (byte)0xbd, (byte)0x8f, 0x1});
2237dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xc44ea9, new byte[]{(byte)0xa9, (byte)0x9d, (byte)0x91, 0x6});
2247dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0x94477f78, new byte[]{(byte)0xf8, (byte)0xfe, (byte)0x9d, (byte)0xa2, 0x79});
2257dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(0xe47a0b4f, new byte[]{(byte)0xcf, (byte)0x96, (byte)0xe8, (byte)0xa3, 0x7e});
2267dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver    }
2277dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
2287dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver    private void performTest(int integerValue, byte[] encodedValue) throws IOException {
2297dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        performTest(integerValue, encodedValue, encodedValue.length);
2307dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver    }
2317dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
2327dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver    private void performTest(int integerValue, byte[] encodedValue, int encodedLength) throws IOException {
2337dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        setup();
2347dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
2357dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        writer.writeSleb128(integerValue);
2367dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        writer.flush();
2377dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
2387dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        byte[] writtenData = output.getBuffer();
2397dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver
2407dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        Assert.assertEquals(startPosition + encodedLength, writer.getPosition());
2417dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        for (int i=0; i<encodedLength; i++) {
2427dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver            byte encoded = encodedValue[i];
2437dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver            byte written = writtenData[i];
2447dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver            if (i == 4) {
2457dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver                encoded = (byte)(encoded & 0x0F);
2467dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver                written = (byte)(written & 0x0F);
2477dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver            }
2487dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver            Assert.assertEquals(String.format("Values not equal at index %d", i), encoded, written);
2497dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver        }
2507dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver    }
2517dff6ada5eda987642ad6170e4ebc2e136c7f652Ben Gruver}
252