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));
+    }
+  }
+}