1*055d4590SKeyi Gui /* 2*055d4590SKeyi Gui * Copyright (C) 2011 The Android Open Source Project 3*055d4590SKeyi Gui * 4*055d4590SKeyi Gui * Licensed under the Apache License, Version 2.0 (the "License"); 5*055d4590SKeyi Gui * you may not use this file except in compliance with the License. 6*055d4590SKeyi Gui * You may obtain a copy of the License at 7*055d4590SKeyi Gui * 8*055d4590SKeyi Gui * http://www.apache.org/licenses/LICENSE-2.0 9*055d4590SKeyi Gui * 10*055d4590SKeyi Gui * Unless required by applicable law or agreed to in writing, software 11*055d4590SKeyi Gui * distributed under the License is distributed on an "AS IS" BASIS, 12*055d4590SKeyi Gui * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*055d4590SKeyi Gui * See the License for the specific language governing permissions and 14*055d4590SKeyi Gui * limitations under the License. 15*055d4590SKeyi Gui */ 16*055d4590SKeyi Gui 17*055d4590SKeyi Gui package com.android.dex; 18*055d4590SKeyi Gui 19*055d4590SKeyi Gui import com.android.dex.util.ByteArrayByteInput; 20*055d4590SKeyi Gui import junit.framework.TestCase; 21*055d4590SKeyi Gui 22*055d4590SKeyi Gui public final class EncodedValueReaderTest extends TestCase { 23*055d4590SKeyi Gui testReadByte()24*055d4590SKeyi Gui public void testReadByte() { 25*055d4590SKeyi Gui assertEquals((byte) 0x80, readerOf(0, 0x80).readByte()); 26*055d4590SKeyi Gui assertEquals((byte) 0xff, readerOf(0, 0xff).readByte()); 27*055d4590SKeyi Gui assertEquals((byte) 0x00, readerOf(0, 0x00).readByte()); 28*055d4590SKeyi Gui assertEquals((byte) 0x01, readerOf(0, 0x01).readByte()); 29*055d4590SKeyi Gui assertEquals((byte) 0x7f, readerOf(0, 0x7f).readByte()); 30*055d4590SKeyi Gui } 31*055d4590SKeyi Gui testReadShort()32*055d4590SKeyi Gui public void testReadShort() { 33*055d4590SKeyi Gui assertEquals((short) 0x8000, readerOf(34, 0x00, 0x80).readShort()); 34*055d4590SKeyi Gui assertEquals((short) 0, readerOf( 2, 0x00).readShort()); 35*055d4590SKeyi Gui assertEquals((short) 0xab, readerOf(34, 0xab, 0x00).readShort()); 36*055d4590SKeyi Gui assertEquals((short) 0xabcd, readerOf(34, 0xcd, 0xab).readShort()); 37*055d4590SKeyi Gui assertEquals((short) 0x7FFF, readerOf(34, 0xff, 0x7f).readShort()); 38*055d4590SKeyi Gui } 39*055d4590SKeyi Gui testReadInt()40*055d4590SKeyi Gui public void testReadInt() { 41*055d4590SKeyi Gui assertEquals(0x80000000, readerOf(100, 0x00, 0x00, 0x00, 0x80).readInt()); 42*055d4590SKeyi Gui assertEquals( 0x00, readerOf( 4, 0x00).readInt()); 43*055d4590SKeyi Gui assertEquals( 0xab, readerOf( 36, 0xab, 0x00).readInt()); 44*055d4590SKeyi Gui assertEquals( 0xabcd, readerOf( 68, 0xcd, 0xab, 0x00).readInt()); 45*055d4590SKeyi Gui assertEquals( 0xabcdef, readerOf(100, 0xef, 0xcd, 0xab, 0x00).readInt()); 46*055d4590SKeyi Gui assertEquals(0xabcdef01, readerOf(100, 0x01, 0xef, 0xcd, 0xab).readInt()); 47*055d4590SKeyi Gui assertEquals(0x7fffffff, readerOf(100, 0xff, 0xff, 0xff, 127).readInt()); 48*055d4590SKeyi Gui } 49*055d4590SKeyi Gui testReadLong()50*055d4590SKeyi Gui public void testReadLong() { 51*055d4590SKeyi Gui assertEquals(0x8000000000000000L, readerOf( -26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80).readLong()); 52*055d4590SKeyi Gui assertEquals( 0x00L, readerOf( 6, 0x00).readLong()); 53*055d4590SKeyi Gui assertEquals( 0xabL, readerOf( 38, 0xab, 0x00).readLong()); 54*055d4590SKeyi Gui assertEquals( 0xabcdL, readerOf( 70, 0xcd, 0xab, 0x00).readLong()); 55*055d4590SKeyi Gui assertEquals( 0xabcdefL, readerOf( 102, 0xef, 0xcd, 0xab, 0x00).readLong()); 56*055d4590SKeyi Gui assertEquals( 0xabcdef01L, readerOf(-122, 0x01, 0xef, 0xcd, 0xab, 0x00).readLong()); 57*055d4590SKeyi Gui assertEquals( 0xabcdef0123L, readerOf( -90, 0x23, 0x01, 0xef, 0xcd, 0xab, 0x00).readLong()); 58*055d4590SKeyi Gui assertEquals( 0xabcdef012345L, readerOf( -58, 0x45, 0x23, 0x01, 0xef, 0xcd, 0xab, 0x00).readLong()); 59*055d4590SKeyi Gui assertEquals( 0xabcdef01234567L, readerOf( -26, 0x67, 0x45, 0x23, 0x01, 0xef, 0xcd, 0xab, 0x00).readLong()); 60*055d4590SKeyi Gui assertEquals(0xabcdef0123456789L, readerOf( -26, 0x89, 0x67, 0x45, 0x23, 0x01, 0xef, 0xcd, 0xab).readLong()); 61*055d4590SKeyi Gui assertEquals(0x7fffffffffffffffL, readerOf( -26, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f).readLong()); 62*055d4590SKeyi Gui } 63*055d4590SKeyi Gui testReadFloat()64*055d4590SKeyi Gui public void testReadFloat() { 65*055d4590SKeyi Gui assertEquals(Float.NEGATIVE_INFINITY, readerOf(48, -128, -1).readFloat()); 66*055d4590SKeyi Gui assertEquals(Float.POSITIVE_INFINITY, readerOf(48, -128, 127).readFloat()); 67*055d4590SKeyi Gui assertEquals(Float.NaN, readerOf(48, -64, 127).readFloat()); 68*055d4590SKeyi Gui assertEquals(-0.0f, readerOf(16, -128).readFloat()); 69*055d4590SKeyi Gui assertEquals(0.0f, readerOf(16, 0).readFloat()); 70*055d4590SKeyi Gui assertEquals(0.5f, readerOf(16, 63).readFloat()); 71*055d4590SKeyi Gui assertEquals(1f, readerOf(48, -128, 63).readFloat()); 72*055d4590SKeyi Gui assertEquals(1.0E06f, readerOf(80, 36, 116, 73).readFloat()); 73*055d4590SKeyi Gui assertEquals(1.0E12f, readerOf(112, -91, -44, 104, 83).readFloat()); 74*055d4590SKeyi Gui } 75*055d4590SKeyi Gui testReadDouble()76*055d4590SKeyi Gui public void testReadDouble() { 77*055d4590SKeyi Gui assertEquals(Double.NEGATIVE_INFINITY, readerOf(49, -16, -1).readDouble()); 78*055d4590SKeyi Gui assertEquals(Double.POSITIVE_INFINITY, readerOf(49, -16, 127).readDouble()); 79*055d4590SKeyi Gui assertEquals(Double.NaN, readerOf(49, -8, 127).readDouble()); 80*055d4590SKeyi Gui assertEquals(-0.0, readerOf(17, -128).readDouble()); 81*055d4590SKeyi Gui assertEquals(0.0, readerOf(17, 0).readDouble()); 82*055d4590SKeyi Gui assertEquals(0.5, readerOf(49, -32, 63).readDouble()); 83*055d4590SKeyi Gui assertEquals(1.0, readerOf(49, -16, 63).readDouble()); 84*055d4590SKeyi Gui assertEquals(1.0E06, readerOf(113, -128, -124, 46, 65).readDouble()); 85*055d4590SKeyi Gui assertEquals(1.0E12, readerOf(-111, -94, -108, 26, 109, 66).readDouble()); 86*055d4590SKeyi Gui assertEquals(1.0E24, readerOf(-15, -76, -99, -39, 121, 67, 120, -22, 68).readDouble()); 87*055d4590SKeyi Gui } 88*055d4590SKeyi Gui testReadChar()89*055d4590SKeyi Gui public void testReadChar() { 90*055d4590SKeyi Gui assertEquals('\u0000', readerOf( 3, 0x00).readChar()); 91*055d4590SKeyi Gui assertEquals('\u00ab', readerOf( 3, 0xab).readChar()); 92*055d4590SKeyi Gui assertEquals('\uabcd', readerOf(35, 0xcd, 0xab).readChar()); 93*055d4590SKeyi Gui assertEquals('\uffff', readerOf(35, 0xff, 0xff).readChar()); 94*055d4590SKeyi Gui } 95*055d4590SKeyi Gui testReadBoolean()96*055d4590SKeyi Gui public void testReadBoolean() { 97*055d4590SKeyi Gui assertEquals(true, readerOf(63).readBoolean()); 98*055d4590SKeyi Gui assertEquals(false, readerOf(31).readBoolean()); 99*055d4590SKeyi Gui } 100*055d4590SKeyi Gui testReadNull()101*055d4590SKeyi Gui public void testReadNull() { 102*055d4590SKeyi Gui readerOf(30).readNull(); 103*055d4590SKeyi Gui } 104*055d4590SKeyi Gui testReadReference()105*055d4590SKeyi Gui public void testReadReference() { 106*055d4590SKeyi Gui assertEquals( 0xab, readerOf(0x17, 0xab).readString()); 107*055d4590SKeyi Gui assertEquals( 0xabcd, readerOf(0x37, 0xcd, 0xab).readString()); 108*055d4590SKeyi Gui assertEquals( 0xabcdef, readerOf(0x57, 0xef, 0xcd, 0xab).readString()); 109*055d4590SKeyi Gui assertEquals(0xabcdef01, readerOf(0x77, 0x01, 0xef, 0xcd, 0xab).readString()); 110*055d4590SKeyi Gui } 111*055d4590SKeyi Gui testReadWrongType()112*055d4590SKeyi Gui public void testReadWrongType() { 113*055d4590SKeyi Gui try { 114*055d4590SKeyi Gui readerOf(0x17, 0xab).readField(); 115*055d4590SKeyi Gui fail(); 116*055d4590SKeyi Gui } catch (IllegalStateException expected) { 117*055d4590SKeyi Gui } 118*055d4590SKeyi Gui } 119*055d4590SKeyi Gui readerOf(int... bytes)120*055d4590SKeyi Gui private EncodedValueReader readerOf(int... bytes) { 121*055d4590SKeyi Gui byte[] data = new byte[bytes.length]; 122*055d4590SKeyi Gui for (int i = 0; i < bytes.length; i++) { 123*055d4590SKeyi Gui data[i] = (byte) bytes[i]; 124*055d4590SKeyi Gui } 125*055d4590SKeyi Gui return new EncodedValueReader(new ByteArrayByteInput(data)); 126*055d4590SKeyi Gui } 127*055d4590SKeyi Gui } 128