| // Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| package com.android.tools.r8.dex; |
| |
| import static com.android.tools.r8.dex.Constants.DEX_MAGIC_SIZE; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertTrue; |
| |
| import com.android.tools.r8.origin.Origin; |
| import com.android.tools.r8.utils.AndroidApiLevel; |
| import com.android.tools.r8.utils.EncodedValueUtils; |
| import java.util.Arrays; |
| import java.util.Collection; |
| import org.junit.Assert; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.Parameterized; |
| import org.junit.runners.Parameterized.Parameters; |
| |
| @RunWith(Parameterized.class) |
| public class EncodedFloatingValueTest { |
| private final double value; |
| |
| public EncodedFloatingValueTest(double value) { |
| this.value = value; |
| } |
| |
| @Parameters(name = "{0}") |
| public static Collection<Double> data() { |
| return Arrays.asList( |
| 0.0, |
| 1.0, |
| 0.5, |
| Double.longBitsToDouble(1), // Lowest bit is 1 in double |
| Double.longBitsToDouble(0x10), // Bits on byte boundary are 1. |
| Double.longBitsToDouble(0x08), |
| Double.longBitsToDouble(4607071218809329336L), // Test a real long (regression). |
| (double) (Float.intBitsToFloat(1)), // Lowest bit is 1 in float |
| (double) (Float.intBitsToFloat(0x10)), // Bits on byte boundary are 1 |
| (double) (Float.intBitsToFloat(0x08)) |
| ); |
| } |
| |
| // Create a DexReader with correct file magic followed by the argument bytes. Positions the |
| // DexReader after the file magic. |
| private DexReader createDexFileWithContent(byte[] bytes) { |
| DexOutputBuffer buffer = new DexOutputBuffer(); |
| buffer.putBytes(Constants.DEX_FILE_MAGIC_PREFIX); |
| buffer.putBytes(AndroidApiLevel.B.getDexVersion().getBytes()); |
| buffer.putByte(Constants.DEX_FILE_MAGIC_SUFFIX); |
| buffer.putBytes(bytes); |
| DexReader dexReader = new DexReader(Origin.unknown(), buffer.asArray()); |
| dexReader.position(DEX_MAGIC_SIZE); |
| return dexReader; |
| } |
| |
| @Test |
| public void testEncodeDecodeDouble() { |
| byte[] bytes = EncodedValueUtils.encodeDouble(value); |
| assertTrue(bytes.length <= Double.BYTES); |
| DexReader dexReader = createDexFileWithContent(bytes); |
| Assert.assertEquals(value, EncodedValueUtils.parseDouble(dexReader, bytes.length), 0.0); |
| } |
| |
| @Test |
| public void testEncodeDecodeFloat() { |
| byte[] bytes = EncodedValueUtils.encodeFloat((float) value); |
| assertTrue(bytes.length <= Float.BYTES); |
| DexReader dexReader = createDexFileWithContent(bytes); |
| Assert.assertEquals((float) value, EncodedValueUtils.parseFloat(dexReader, bytes.length), 0.0f); |
| } |
| |
| @Test |
| public void testEncodeDecodeDoubleWithDexBuffer() { |
| DexOutputBuffer buffer = new DexOutputBuffer(); |
| int length = EncodedValueUtils.putDouble(buffer, value); |
| assertTrue(length <= Double.BYTES); |
| byte[] bytes = buffer.asArray(); |
| DexReader dexReader = createDexFileWithContent(bytes); |
| assertEquals(value, EncodedValueUtils.parseDouble(dexReader, length), 0.0); |
| } |
| |
| @Test |
| public void testEncodeDecodeFloatWithDexBuffer() { |
| DexOutputBuffer buffer = new DexOutputBuffer(); |
| int length = EncodedValueUtils.putFloat(buffer, (float) value); |
| assertTrue(length <= Float.BYTES); |
| byte[] bytes = buffer.asArray(); |
| DexReader dexReader = createDexFileWithContent(bytes); |
| assertEquals((float) value, EncodedValueUtils.parseFloat(dexReader, length), 0.0f); |
| } |
| } |