blob: ed697a7565521d35291b6b7eebe807a7a33811f5 [file] [log] [blame]
// Copyright (c) 2019, 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.desugar.backports;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.utils.AndroidApiLevel;
import java.math.BigInteger;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public final class IntegerBackportTest extends AbstractBackportTest {
@Parameters(name = "{0}")
public static Iterable<?> data() {
return getTestParameters()
.withAllRuntimesAndApiLevels()
.build();
}
public IntegerBackportTest(TestParameters parameters) {
super(parameters, Integer.class, Main.class);
registerTarget(AndroidApiLevel.O, 51);
registerTarget(AndroidApiLevel.N, 11);
registerTarget(AndroidApiLevel.K, 7);
}
static final class Main extends MiniAssert {
private static final int[] interestingValues = {
Integer.MIN_VALUE, Integer.MAX_VALUE,
Short.MIN_VALUE, Short.MAX_VALUE,
Byte.MIN_VALUE, Byte.MAX_VALUE,
0,
-1, 1,
-42, 42
};
public static void main(String[] args) {
testHashCode();
testToUnsignedLong();
testCompare();
testMax();
testMin();
testSum();
testCompareUnsigned();
testDivideUnsigned();
testRemainderUnsigned();
testParseUnsignedInt();
testParseUnsignedIntWithRadix();
testToUnsignedString();
testToUnsignedStringWithRadix();
}
private static void testHashCode() {
for (int value : interestingValues) {
assertEquals(value, Integer.hashCode(value));
}
}
private static void testToUnsignedLong() {
assertEquals(0L, Integer.toUnsignedLong(0));
assertEquals(2_147_483_647L, Integer.toUnsignedLong(Integer.MAX_VALUE));
assertEquals(2_147_483_648L, Integer.toUnsignedLong(Integer.MIN_VALUE));
assertEquals(4_294_967_295L, Integer.toUnsignedLong(-1));
}
private static void testCompare() {
assertTrue(Integer.compare(1, 0) > 0);
assertTrue(Integer.compare(0, 0) == 0);
assertTrue(Integer.compare(0, 1) < 0);
assertTrue(Integer.compare(Integer.MIN_VALUE, Integer.MAX_VALUE) < 0);
assertTrue(Integer.compare(Integer.MAX_VALUE, Integer.MIN_VALUE) > 0);
assertTrue(Integer.compare(Integer.MIN_VALUE, Integer.MIN_VALUE) == 0);
assertTrue(Integer.compare(Integer.MAX_VALUE, Integer.MAX_VALUE) == 0);
}
private static void testMax() {
for (int x : interestingValues) {
for (int y : interestingValues) {
assertEquals(Math.max(x, y), Integer.max(x, y));
}
}
}
private static void testMin() {
for (int x : interestingValues) {
for (int y : interestingValues) {
assertEquals(Math.min(x, y), Integer.min(x, y));
}
}
}
private static void testSum() {
for (int x : interestingValues) {
for (int y : interestingValues) {
assertEquals(x + y, Integer.sum(x, y));
}
}
}
private static void testCompareUnsigned() {
assertTrue(Integer.compareUnsigned(0, 0) == 0);
assertTrue(Integer.compareUnsigned(0, Integer.MAX_VALUE) < 0);
assertTrue(Integer.compareUnsigned(0, Integer.MIN_VALUE) < 0);
assertTrue(Integer.compareUnsigned(0, -1) < 0);
assertTrue(Integer.compareUnsigned(Integer.MAX_VALUE, 0) > 0);
assertTrue(Integer.compareUnsigned(Integer.MAX_VALUE, Integer.MAX_VALUE) == 0);
assertTrue(Integer.compareUnsigned(Integer.MAX_VALUE, Integer.MIN_VALUE) < 0);
assertTrue(Integer.compareUnsigned(Integer.MAX_VALUE, -1) < 0);
assertTrue(Integer.compareUnsigned(Integer.MIN_VALUE, 0) > 0);
assertTrue(Integer.compareUnsigned(Integer.MIN_VALUE, Integer.MAX_VALUE) > 0);
assertTrue(Integer.compareUnsigned(Integer.MIN_VALUE, Integer.MIN_VALUE) == 0);
assertTrue(Integer.compareUnsigned(Integer.MIN_VALUE, -1) < 0);
assertTrue(Integer.compareUnsigned(-1, 0) > 0);
assertTrue(Integer.compareUnsigned(-1, Integer.MAX_VALUE) > 0);
assertTrue(Integer.compareUnsigned(-1, Integer.MIN_VALUE) > 0);
assertTrue(Integer.compareUnsigned(-1, -1) == 0);
}
private static void testDivideUnsigned() {
for (int x : interestingValues) {
for (int y : interestingValues) {
if (y == 0) continue;
BigInteger xUnsigned = BigInteger.valueOf(x & 0xffffffffL);
BigInteger yUnsigned = BigInteger.valueOf(y & 0xffffffffL);
int expected = xUnsigned.divide(yUnsigned).intValue();
assertEquals(expected, Integer.divideUnsigned(x, y));
}
}
try {
throw new AssertionError(Integer.divideUnsigned(1, 0));
} catch (ArithmeticException expected) {
}
}
private static void testRemainderUnsigned() {
for (int x : interestingValues) {
for (int y : interestingValues) {
if (y == 0) continue;
BigInteger xUnsigned = BigInteger.valueOf(x & 0xffffffffL);
BigInteger yUnsigned = BigInteger.valueOf(y & 0xffffffffL);
int expected = xUnsigned.remainder(yUnsigned).intValue();
assertEquals(expected, Integer.remainderUnsigned(x, y));
}
}
try {
throw new AssertionError(Integer.divideUnsigned(1, 0));
} catch (ArithmeticException expected) {
}
}
private static void testParseUnsignedInt() {
for (int value : interestingValues) {
String valueString = Long.toString(value & 0xffffffffL);
assertEquals(value, Integer.parseUnsignedInt(valueString));
assertEquals(value, Integer.parseUnsignedInt("+" + valueString));
}
try {
throw new AssertionError(Integer.parseUnsignedInt("4294967296"));
} catch (NumberFormatException expected) {
}
try {
throw new AssertionError(Integer.parseUnsignedInt(""));
} catch (NumberFormatException expected) {
}
try {
throw new AssertionError(Integer.parseUnsignedInt("+"));
} catch (NumberFormatException expected) {
}
}
private static void testParseUnsignedIntWithRadix() {
for (int value : interestingValues) {
for (int radix = Character.MIN_RADIX; radix <= Character.MAX_RADIX; radix++) {
String valueString = Long.toString(value & 0xffffffffL, radix);
assertEquals(value, Integer.parseUnsignedInt(valueString, radix));
assertEquals(value, Integer.parseUnsignedInt("+" + valueString, radix));
}
}
try {
throw new AssertionError(Integer.parseUnsignedInt("0", Character.MIN_RADIX - 1));
} catch (IllegalArgumentException expected) {
}
try {
throw new AssertionError(Integer.parseUnsignedInt("0", Character.MAX_RADIX + 1));
} catch (IllegalArgumentException expected) {
}
try {
throw new AssertionError(Integer.parseUnsignedInt("", 16));
} catch (NumberFormatException expected) {
}
try {
throw new AssertionError(Integer.parseUnsignedInt("+", 16));
} catch (NumberFormatException expected) {
}
long overflow = 4_294_967_296L;
for (int radix = Character.MIN_RADIX; radix <= Character.MAX_RADIX; radix++) {
String overflowString = Long.toString(overflow, radix);
try {
throw new AssertionError(Integer.parseUnsignedInt(overflowString, radix));
} catch (NumberFormatException expected) {
}
}
}
private static void testToUnsignedString() {
for (int value : interestingValues) {
assertEquals(Long.toString(value & 0xffffffffL), Integer.toUnsignedString(value));
}
}
private static void testToUnsignedStringWithRadix() {
for (int value : interestingValues) {
for (int radix = Character.MIN_RADIX; radix <= Character.MAX_RADIX; radix++) {
assertEquals(Long.toString(value & 0xffffffffL, radix),
Integer.toUnsignedString(value, radix));
}
// Invalid radix values are ignored and 10 is used.
assertEquals(Long.toString(value & 0xffffffffL),
Integer.toUnsignedString(value, Character.MIN_RADIX - 1));
assertEquals(Long.toString(value & 0xffffffffL),
Integer.toUnsignedString(value, Character.MAX_RADIX + 1));
}
}
}
}