blob: b61ea589fc35a98cc0cff26f836fdec3ba844a63 [file] [log] [blame]
// 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);
}
}