blob: 89ab88fcd90207f25dc9575f940f5e527aec31f1 [file] [log] [blame]
// Copyright (c) 2026, 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 backport;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestRuntime.CfVm;
import com.android.tools.r8.desugar.backports.AbstractBackportTest;
import com.android.tools.r8.utils.AndroidApiLevel;
import java.util.Arrays;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public final class ArraysBackportJava9Test extends AbstractBackportTest {
@Parameters(name = "{0}")
public static Iterable<?> data() {
return TestBase.getTestParameters()
.withCfRuntimesStartingFromIncluding(CfVm.JDK9)
.withDexRuntimes()
.withAllApiLevelsAlsoForCf()
.build();
}
public ArraysBackportJava9Test(TestParameters parameters) {
super(parameters, Arrays.class, ByteBackportJava9Main.class);
// The range version of Arrays.equals where added in Android T, but due to slower
// implementation they are backported until V (b/433540561).
registerTarget(AndroidApiLevel.V, 84);
}
public static class ByteBackportJava9Main extends MiniAssert {
public static void main(String[] args) {
testEqualsIntRange();
testEqualsLongRange();
testEqualsShortRange();
testEqualsByteRange();
testEqualsCharRange();
testEqualsBooleanRange();
testEqualsFloatRange();
testEqualsDoubleRange();
}
private static void testEqualsIntRange() {
assertTrue(Arrays.equals(new int[] {}, 0, 0, new int[] {}, 0, 0));
assertTrue(
Arrays.equals(new int[] {Integer.MAX_VALUE}, 0, 1, new int[] {Integer.MAX_VALUE}, 0, 1));
assertTrue(Arrays.equals(new int[] {-1, 0, 1}, 0, 3, new int[] {-1, 0, 1}, 0, 3));
int[] a = new int[] {-3, -2, -1, 0, 1, 2, 3};
int[] b = new int[] {Integer.MIN_VALUE, -1, 0, 1, Integer.MAX_VALUE};
assertTrue(Arrays.equals(a, 0, 1, a, 0, 1));
assertTrue(Arrays.equals(a, 2, 5, b, 1, 4));
assertTrue(Arrays.equals(a, 1, 1, b, 2, 2));
assertFalse(Arrays.equals(a, 2, 3, b, 2, 3));
assertFalse(Arrays.equals(a, 3, 3, b, 1, 3));
try {
assertFalse(Arrays.equals(null, 2, 3, b, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
try {
assertFalse(Arrays.equals(a, 2, 3, null, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
}
private static void testEqualsLongRange() {
assertTrue(Arrays.equals(new long[] {}, 0, 0, new long[] {}, 0, 0));
assertTrue(
Arrays.equals(new long[] {Long.MAX_VALUE}, 0, 1, new long[] {Long.MAX_VALUE}, 0, 1));
assertTrue(Arrays.equals(new long[] {-1L, 0L, 1L}, 0, 3, new long[] {-1L, 0L, 1L}, 0, 3));
long[] a = new long[] {-3L, -2L, -1L, 0L, 1L, 2L, 3L};
long[] b = new long[] {Long.MIN_VALUE, -1L, 0L, 1L, Long.MAX_VALUE};
assertTrue(Arrays.equals(a, 0, 1, a, 0, 1));
assertTrue(Arrays.equals(a, 2, 5, b, 1, 4));
assertTrue(Arrays.equals(a, 1, 1, b, 2, 2));
assertFalse(Arrays.equals(a, 2, 3, b, 2, 3));
assertFalse(Arrays.equals(a, 3, 3, b, 1, 3));
try {
assertFalse(Arrays.equals(null, 2, 3, b, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
try {
assertFalse(Arrays.equals(a, 2, 3, null, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
}
private static void testEqualsShortRange() {
assertTrue(Arrays.equals(new short[] {}, 0, 0, new short[] {}, 0, 0));
assertTrue(
Arrays.equals(new short[] {Short.MAX_VALUE}, 0, 1, new short[] {Short.MAX_VALUE}, 0, 1));
assertTrue(Arrays.equals(new short[] {-1, 0, 1}, 0, 3, new short[] {-1, 0, 1}, 0, 3));
short[] a = new short[] {-3, -2, -1, 0, 1, 2, 3};
short[] b = new short[] {Short.MIN_VALUE, -1, 0, 1, Short.MAX_VALUE};
assertTrue(Arrays.equals(a, 0, 1, a, 0, 1));
assertTrue(Arrays.equals(a, 2, 5, b, 1, 4));
assertTrue(Arrays.equals(a, 1, 1, b, 2, 2));
assertFalse(Arrays.equals(a, 2, 3, b, 2, 3));
assertFalse(Arrays.equals(a, 3, 3, b, 1, 3));
try {
assertFalse(Arrays.equals(null, 2, 3, b, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
try {
assertFalse(Arrays.equals(a, 2, 3, null, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
}
private static void testEqualsByteRange() {
assertTrue(Arrays.equals(new byte[] {}, 0, 0, new byte[] {}, 0, 0));
assertTrue(
Arrays.equals(new byte[] {Byte.MAX_VALUE}, 0, 1, new byte[] {Byte.MAX_VALUE}, 0, 1));
assertTrue(Arrays.equals(new byte[] {-1, 0, 1}, 0, 3, new byte[] {-1, 0, 1}, 0, 3));
byte[] a = new byte[] {-3, -2, -1, 0, 1, 2, 3};
byte[] b = new byte[] {Byte.MIN_VALUE, -1, 0, 1, Byte.MAX_VALUE};
assertTrue(Arrays.equals(a, 0, 1, a, 0, 1));
assertTrue(Arrays.equals(a, 2, 5, b, 1, 4));
assertTrue(Arrays.equals(a, 1, 1, b, 2, 2));
assertFalse(Arrays.equals(a, 2, 3, b, 2, 3));
assertFalse(Arrays.equals(a, 3, 3, b, 1, 3));
try {
assertFalse(Arrays.equals(null, 2, 3, b, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
try {
assertFalse(Arrays.equals(a, 2, 3, null, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
}
private static void testEqualsCharRange() {
assertTrue(Arrays.equals(new char[] {}, 0, 0, new char[] {}, 0, 0));
assertTrue(
Arrays.equals(
new char[] {Character.MAX_VALUE}, 0, 1, new char[] {Character.MAX_VALUE}, 0, 1));
assertTrue(Arrays.equals(new char[] {'a', 'b', 'c'}, 0, 3, new char[] {'a', 'b', 'c'}, 0, 3));
char[] a = new char[] {'x', 'y', 'a', 'b', 'c', 'd', 'e'};
char[] b = new char[] {Character.MIN_VALUE, 'a', 'b', 'c', Character.MAX_VALUE};
assertTrue(Arrays.equals(a, 0, 1, a, 0, 1));
assertTrue(Arrays.equals(a, 2, 5, b, 1, 4));
assertTrue(Arrays.equals(a, 1, 1, b, 2, 2));
assertFalse(Arrays.equals(a, 2, 3, b, 2, 3));
assertFalse(Arrays.equals(a, 3, 3, b, 1, 3));
try {
assertFalse(Arrays.equals(null, 2, 3, b, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
try {
assertFalse(Arrays.equals(a, 2, 3, null, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
}
private static void testEqualsBooleanRange() {
assertTrue(Arrays.equals(new boolean[] {}, 0, 0, new boolean[] {}, 0, 0));
assertTrue(Arrays.equals(new boolean[] {true}, 0, 1, new boolean[] {true}, 0, 1));
assertTrue(
Arrays.equals(
new boolean[] {false, true, false}, 0, 3, new boolean[] {false, true, false}, 0, 3));
boolean[] a = new boolean[] {true, true, false, true, false, false, true};
boolean[] b = new boolean[] {false, false, true, false, true};
assertTrue(Arrays.equals(a, 0, 1, a, 0, 1));
assertTrue(Arrays.equals(a, 2, 5, b, 1, 4));
assertTrue(Arrays.equals(a, 1, 1, b, 2, 2));
assertFalse(Arrays.equals(a, 2, 3, b, 2, 3));
assertFalse(Arrays.equals(a, 3, 3, b, 1, 3));
try {
assertFalse(Arrays.equals(null, 2, 3, b, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
try {
assertFalse(Arrays.equals(a, 2, 3, null, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
}
private static void testEqualsFloatRange() {
assertTrue(Arrays.equals(new float[] {}, 0, 0, new float[] {}, 0, 0));
assertTrue(
Arrays.equals(new float[] {Float.MAX_VALUE}, 0, 1, new float[] {Float.MAX_VALUE}, 0, 1));
assertTrue(
Arrays.equals(
new float[] {-1.0f, 0.0f, 1.0f}, 0, 3, new float[] {-1.0f, 0.0f, 1.0f}, 0, 3));
float[] a = new float[] {-3.0f, -2.0f, -1.0f, 0.0f, 1.0f, 2.0f, 3.0f};
float[] b = new float[] {Float.MIN_VALUE, -1.0f, 0.0f, 1.0f, Float.MAX_VALUE};
float[] c = new float[] {Float.NaN, -0.0f, 0.0f, Float.NaN};
assertTrue(Arrays.equals(a, 0, 1, a, 0, 1));
assertTrue(Arrays.equals(a, 2, 5, b, 1, 4));
assertTrue(Arrays.equals(a, 1, 1, b, 2, 2));
assertTrue(Arrays.equals(c, 0, 1, c, 3, 4));
assertFalse(Arrays.equals(a, 2, 3, b, 2, 3));
assertFalse(Arrays.equals(a, 3, 3, b, 1, 3));
assertFalse(Arrays.equals(c, 1, 2, c, 2, 3));
try {
assertFalse(Arrays.equals(null, 2, 3, b, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
try {
assertFalse(Arrays.equals(a, 2, 3, null, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
}
private static void testEqualsDoubleRange() {
assertTrue(Arrays.equals(new double[] {}, 0, 0, new double[] {}, 0, 0));
assertTrue(
Arrays.equals(
new double[] {Double.MAX_VALUE}, 0, 1, new double[] {Double.MAX_VALUE}, 0, 1));
assertTrue(
Arrays.equals(
new double[] {-1.0d, 0.0d, 1.0d}, 0, 3, new double[] {-1.0d, 0.0d, 1.0d}, 0, 3));
double[] a = new double[] {-3.0d, -2.0d, -1.0d, 0.0d, 1.0d, 2.0d, 3.0d};
double[] b = new double[] {Double.MIN_VALUE, -1.0d, 0.0d, 1.0d, Double.MAX_VALUE};
double[] c = new double[] {Double.NaN, -0.0d, 0.0d, Double.NaN};
assertTrue(Arrays.equals(a, 0, 1, a, 0, 1));
assertTrue(Arrays.equals(a, 2, 5, b, 1, 4));
assertTrue(Arrays.equals(a, 1, 1, b, 2, 2));
assertTrue(Arrays.equals(c, 0, 1, c, 3, 4));
assertFalse(Arrays.equals(a, 2, 3, b, 2, 3));
assertFalse(Arrays.equals(a, 3, 3, b, 1, 3));
assertFalse(Arrays.equals(c, 1, 2, c, 2, 3));
try {
assertFalse(Arrays.equals(null, 2, 3, b, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
try {
assertFalse(Arrays.equals(a, 2, 3, null, 1, 2));
fail("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
}
}
}