Migrate Byte, Character, and Short backport/desugar tests
Test: tools/test.py --dex_vm all --no-internal *Backport*
Change-Id: If2b3ed8d343f725e0ebb3f557825ff37431fde36
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index 599cacb..edfd93b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -29,6 +29,9 @@
import com.android.tools.r8.ir.conversion.IRConverter;
import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.RewritableMethods.MethodGenerator;
import com.android.tools.r8.ir.desugar.backports.BooleanMethods;
+import com.android.tools.r8.ir.desugar.backports.ByteMethods;
+import com.android.tools.r8.ir.desugar.backports.CharacterMethods;
+import com.android.tools.r8.ir.desugar.backports.ShortMethods;
import com.android.tools.r8.ir.synthetic.TemplateMethodCode;
import com.android.tools.r8.origin.SynthesizedOrigin;
import com.android.tools.r8.utils.DescriptorUtils;
@@ -172,50 +175,6 @@
original.holder.descriptor, original.name, original.proto);
}
- private static final class ByteMethods extends TemplateMethodCode {
- ByteMethods(InternalOptions options, DexMethod method, String methodName) {
- super(options, method, methodName, method.proto.toDescriptorString());
- }
-
- public static int hashCode(byte i) {
- return Byte.valueOf(i).hashCode();
- }
-
- public static int compare(byte a, byte b) {
- return Byte.valueOf(a).compareTo(Byte.valueOf(b));
- }
-
- public static int toUnsignedInt(byte value) {
- return value & 0xff;
- }
-
- public static long toUnsignedLong(byte value) {
- return value & 0xffL;
- }
- }
-
- private static final class ShortMethods extends TemplateMethodCode {
- ShortMethods(InternalOptions options, DexMethod method, String methodName) {
- super(options, method, methodName, method.proto.toDescriptorString());
- }
-
- public static int hashCode(short i) {
- return Short.valueOf(i).hashCode();
- }
-
- public static int compare(short a, short b) {
- return Short.valueOf(a).compareTo(Short.valueOf(b));
- }
-
- public static int toUnsignedInt(short value) {
- return value & 0xffff;
- }
-
- public static long toUnsignedLong(short value) {
- return value & 0xffffL;
- }
- }
-
private static final class IntegerMethods extends TemplateMethodCode {
IntegerMethods(InternalOptions options, DexMethod method, String methodName) {
super(options, method, methodName, method.proto.toDescriptorString());
@@ -418,20 +377,6 @@
}
}
- private static final class CharacterMethods extends TemplateMethodCode {
- CharacterMethods(InternalOptions options, DexMethod method, String methodName) {
- super(options, method, methodName, method.proto.toDescriptorString());
- }
-
- public static int hashCode(char i) {
- return Character.valueOf(i).hashCode();
- }
-
- public static int compare(char a, char b) {
- return Character.valueOf(a).compareTo(Character.valueOf(b));
- }
- }
-
private static final class StringMethods extends TemplateMethodCode {
StringMethods(InternalOptions options, DexMethod method, String methodName) {
super(options, method, methodName, method.proto.toDescriptorString());
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/ByteMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/ByteMethods.java
new file mode 100644
index 0000000..bc25a50
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/ByteMethods.java
@@ -0,0 +1,31 @@
+// 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.ir.desugar.backports;
+
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.ir.synthetic.TemplateMethodCode;
+import com.android.tools.r8.utils.InternalOptions;
+
+public final class ByteMethods extends TemplateMethodCode {
+ public ByteMethods(InternalOptions options, DexMethod method, String methodName) {
+ super(options, method, methodName, method.proto.toDescriptorString());
+ }
+
+ public static int hashCode(byte i) {
+ return Byte.valueOf(i).hashCode();
+ }
+
+ public static int compare(byte a, byte b) {
+ return Byte.valueOf(a).compareTo(Byte.valueOf(b));
+ }
+
+ public static int toUnsignedInt(byte value) {
+ return value & 0xff;
+ }
+
+ public static long toUnsignedLong(byte value) {
+ return value & 0xffL;
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/CharacterMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/CharacterMethods.java
new file mode 100644
index 0000000..3ea24a0
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/CharacterMethods.java
@@ -0,0 +1,23 @@
+// 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.ir.desugar.backports;
+
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.ir.synthetic.TemplateMethodCode;
+import com.android.tools.r8.utils.InternalOptions;
+
+public final class CharacterMethods extends TemplateMethodCode {
+ public CharacterMethods(InternalOptions options, DexMethod method, String methodName) {
+ super(options, method, methodName, method.proto.toDescriptorString());
+ }
+
+ public static int hashCode(char i) {
+ return Character.valueOf(i).hashCode();
+ }
+
+ public static int compare(char a, char b) {
+ return Character.valueOf(a).compareTo(Character.valueOf(b));
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/ShortMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/ShortMethods.java
new file mode 100644
index 0000000..a8b887e
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/ShortMethods.java
@@ -0,0 +1,31 @@
+// 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.ir.desugar.backports;
+
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.ir.synthetic.TemplateMethodCode;
+import com.android.tools.r8.utils.InternalOptions;
+
+public final class ShortMethods extends TemplateMethodCode {
+ public ShortMethods(InternalOptions options, DexMethod method, String methodName) {
+ super(options, method, methodName, method.proto.toDescriptorString());
+ }
+
+ public static int hashCode(short i) {
+ return Short.valueOf(i).hashCode();
+ }
+
+ public static int compare(short a, short b) {
+ return Short.valueOf(a).compareTo(Short.valueOf(b));
+ }
+
+ public static int toUnsignedInt(short value) {
+ return value & 0xffff;
+ }
+
+ public static long toUnsignedLong(short value) {
+ return value & 0xffffL;
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/BackportedMethodRewriterTest.java b/src/test/java/com/android/tools/r8/desugar/BackportedMethodRewriterTest.java
index f840ec9..17cf459 100644
--- a/src/test/java/com/android/tools/r8/desugar/BackportedMethodRewriterTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/BackportedMethodRewriterTest.java
@@ -45,9 +45,9 @@
.run(TestMethods.class)
.assertSuccessWithOutput(expectedOutput);
- assertDesugaring(AndroidApiLevel.O, 65);
- assertDesugaring(AndroidApiLevel.N, 44);
- assertDesugaring(AndroidApiLevel.K, 19);
+ assertDesugaring(AndroidApiLevel.O, 55);
+ assertDesugaring(AndroidApiLevel.N, 38);
+ assertDesugaring(AndroidApiLevel.K, 16);
assertDesugaring(AndroidApiLevel.J_MR2, 0);
}
@@ -139,39 +139,12 @@
}
// Defined as a static method on this class to avoid affecting invoke-static counts in main().
- private static int signum(int value) {
- return (int) Math.signum(value);
- }
-
- // Defined as a static method on this class to avoid affecting invoke-static counts in main().
@SafeVarargs
private static <T> List<T> listOf(T... values) {
return Arrays.asList(values);
}
public static void main(String[] args) {
- byte[] aBytes = new byte[]{42, 1, -1, Byte.MAX_VALUE, Byte.MIN_VALUE};
- for (byte aByte : aBytes) {
- System.out.println(Byte.hashCode(aByte));
- System.out.println(Byte.toUnsignedInt(aByte));
- System.out.println(Byte.toUnsignedLong(aByte));
- for (byte bByte : aBytes) {
- // Normalize comparison to [-1, 1] since the values differ across versions but signs match
- System.out.println(signum(Byte.compare(aByte, bByte)));
- }
- }
-
- short[] aShorts = new short[]{42, 1, -1, Short.MAX_VALUE, Short.MIN_VALUE};
- for (short aShort : aShorts) {
- System.out.println(Short.hashCode(aShort));
- System.out.println(Short.toUnsignedInt(aShort));
- System.out.println(Short.toUnsignedLong(aShort));
- for (short bShort : aShorts) {
- // Normalize comparison to [-1, 1] since the values differ across versions but signs match
- System.out.println(signum(Short.compare(aShort, bShort)));
- }
- }
-
int[] aInts = new int[]{42, 1, -1, Integer.MAX_VALUE, Integer.MIN_VALUE};
int[] bInts = new int[]{43, 1, -1, Integer.MAX_VALUE, Integer.MIN_VALUE};
for (int aInt : aInts) {
@@ -237,14 +210,6 @@
}
}
- char[] aChars = new char[]{'s', 'u', 'p', Character.MAX_VALUE, Character.MIN_VALUE};
- for (char aChar : aChars) {
- System.out.println(Character.hashCode(aChar));
- for (char bChar : aChars) {
- System.out.println(Character.compare(aChar, bChar));
- }
- }
-
System.out.println(String.join(", "));
System.out.println(String.join(", ", "one", "two", "three"));
System.out.println(String.join("", "one", "two", "three"));
@@ -274,7 +239,9 @@
System.out.println(Objects.compare("a", "a", reverse()));
Object[] objects = {
- aBytes, new boolean[] { true, false }, aChars, aDoubles, aFloats, aInts, aLongs, "a", null
+ new byte[] { 42, 1, -1, Byte.MAX_VALUE, Byte.MIN_VALUE }, new boolean[] { true, false },
+ new char[] { 's', 'u', 'p', Character.MAX_VALUE, Character.MIN_VALUE }, aDoubles, aFloats,
+ aInts, aLongs, new short[] { 42, 1, -1, Short.MAX_VALUE, Short.MIN_VALUE }, "a", null
};
for (Object aObject : objects) {
for (Object bObject : objects) {
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java b/src/test/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
index d139b48..a5e5280 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
@@ -100,5 +100,11 @@
throw new AssertionError("Expected <" + expected + "> but was <" + actual + '>');
}
}
+
+ static void assertEquals(long expected, long actual) {
+ if (expected != actual) {
+ throw new AssertionError("Expected <" + expected + "> but was <" + actual + '>');
+ }
+ }
}
}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/ByteBackportTest.java b/src/test/java/com/android/tools/r8/desugar/backports/ByteBackportTest.java
new file mode 100644
index 0000000..d2d02bd
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/backports/ByteBackportTest.java
@@ -0,0 +1,55 @@
+// 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 static java.lang.Integer.signum;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public final class ByteBackportTest extends AbstractBackportTest {
+ @Parameters(name = "{0}")
+ public static Iterable<?> data() {
+ return getTestParameters().withDexRuntimes().build();
+ }
+
+ public ByteBackportTest(TestParameters parameters) {
+ super(parameters, Byte.class, Main.class);
+ registerTarget(AndroidApiLevel.O, 16);
+ registerTarget(AndroidApiLevel.N, 8);
+ registerTarget(AndroidApiLevel.K, 7);
+ }
+
+ static final class Main extends MiniAssert {
+ public static void main(String[] args) {
+ for (int i = Byte.MIN_VALUE; i < Byte.MAX_VALUE; i++) {
+ assertEquals(i, Byte.hashCode((byte) i));
+ }
+
+ // signum() normalizes result to [-1, 1] since the values differ across VMs but signs match.
+ assertEquals(1, signum(Byte.compare((byte) 1, (byte) 0)));
+ assertEquals(0, signum(Byte.compare((byte) 0, (byte) 0)));
+ assertEquals(-1, signum(Byte.compare((byte) 0, (byte) 1)));
+ assertEquals(-1, signum(Byte.compare(Byte.MIN_VALUE, Byte.MAX_VALUE)));
+ assertEquals(1, signum(Byte.compare(Byte.MAX_VALUE, Byte.MIN_VALUE)));
+ assertEquals(0, signum(Byte.compare(Byte.MIN_VALUE, Byte.MIN_VALUE)));
+ assertEquals(0, signum(Byte.compare(Byte.MAX_VALUE, Byte.MAX_VALUE)));
+
+ assertEquals(0, Byte.toUnsignedInt((byte) 0));
+ assertEquals(127, Byte.toUnsignedInt(Byte.MAX_VALUE));
+ assertEquals(128, Byte.toUnsignedInt(Byte.MIN_VALUE));
+ assertEquals(255, Byte.toUnsignedInt((byte) -1));
+
+ assertEquals(0L, Byte.toUnsignedLong((byte) 0));
+ assertEquals(127L, Byte.toUnsignedLong(Byte.MAX_VALUE));
+ assertEquals(128L, Byte.toUnsignedLong(Byte.MIN_VALUE));
+ assertEquals(255L, Byte.toUnsignedLong((byte) -1));
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/CharacterBackportTest.java b/src/test/java/com/android/tools/r8/desugar/backports/CharacterBackportTest.java
new file mode 100644
index 0000000..bd4a763
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/backports/CharacterBackportTest.java
@@ -0,0 +1,44 @@
+// 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 static java.lang.Integer.signum;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public final class CharacterBackportTest extends AbstractBackportTest {
+ @Parameters(name = "{0}")
+ public static Iterable<?> data() {
+ return getTestParameters().withDexRuntimes().build();
+ }
+
+ public CharacterBackportTest(TestParameters parameters) {
+ super(parameters, Character.class, Main.class);
+ registerTarget(AndroidApiLevel.N, 8);
+ registerTarget(AndroidApiLevel.K, 7);
+ }
+
+ static final class Main extends MiniAssert {
+ public static void main(String[] args) {
+ for (int i = Character.MIN_VALUE; i < Character.MAX_VALUE; i++) {
+ assertEquals(i, Character.hashCode((char) i));
+ }
+
+ // signum() normalizes result to [-1, 1] since the values differ across VMs but signs match.
+ assertEquals(1, signum(Character.compare('b', 'a')));
+ assertEquals(0, signum(Character.compare('a', 'a')));
+ assertEquals(-1, signum(Character.compare('a', 'b')));
+ assertEquals(-1, signum(Character.compare(Character.MIN_VALUE, Character.MAX_VALUE)));
+ assertEquals(1, signum(Character.compare(Character.MAX_VALUE, Character.MIN_VALUE)));
+ assertEquals(0, signum(Character.compare(Character.MIN_VALUE, Character.MIN_VALUE)));
+ assertEquals(0, signum(Character.compare(Character.MAX_VALUE, Character.MAX_VALUE)));
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/ShortBackportTest.java b/src/test/java/com/android/tools/r8/desugar/backports/ShortBackportTest.java
new file mode 100644
index 0000000..b4d4dea
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/backports/ShortBackportTest.java
@@ -0,0 +1,55 @@
+// 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 static java.lang.Integer.signum;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public final class ShortBackportTest extends AbstractBackportTest {
+ @Parameters(name = "{0}")
+ public static Iterable<?> data() {
+ return getTestParameters().withDexRuntimes().build();
+ }
+
+ public ShortBackportTest(TestParameters parameters) {
+ super(parameters, Short.class, Main.class);
+ registerTarget(AndroidApiLevel.O, 16);
+ registerTarget(AndroidApiLevel.N, 8);
+ registerTarget(AndroidApiLevel.K, 7);
+ }
+
+ static final class Main extends MiniAssert {
+ public static void main(String[] args) {
+ for (int i = Short.MIN_VALUE; i < Short.MAX_VALUE; i++) {
+ assertEquals(i, Short.hashCode((short) i));
+ }
+
+ // signum() normalizes result to [-1, 1] since the values differ across VMs but signs match.
+ assertEquals(1, signum(Short.compare((short) 1, (short) 0)));
+ assertEquals(0, signum(Short.compare((short) 0, (short) 0)));
+ assertEquals(-1, signum(Short.compare((short) 0, (short) 1)));
+ assertEquals(-1, signum(Short.compare(Short.MIN_VALUE, Short.MAX_VALUE)));
+ assertEquals(1, signum(Short.compare(Short.MAX_VALUE, Short.MIN_VALUE)));
+ assertEquals(0, signum(Short.compare(Short.MIN_VALUE, Short.MIN_VALUE)));
+ assertEquals(0, signum(Short.compare(Short.MAX_VALUE, Short.MAX_VALUE)));
+
+ assertEquals(0, Short.toUnsignedInt((short) 0));
+ assertEquals(32767, Short.toUnsignedInt(Short.MAX_VALUE));
+ assertEquals(32768, Short.toUnsignedInt(Short.MIN_VALUE));
+ assertEquals(65535, Short.toUnsignedInt((short) -1));
+
+ assertEquals(0L, Short.toUnsignedLong((short) 0));
+ assertEquals(32767L, Short.toUnsignedLong(Short.MAX_VALUE));
+ assertEquals(32768L, Short.toUnsignedLong(Short.MIN_VALUE));
+ assertEquals(65535L, Short.toUnsignedLong((short) -1));
+ }
+ }
+}