blob: bb11b5e0d1551b6318a8588d87b0a1b6ba276305 [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 backport;
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 org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public final class StringBackportJava11Test extends AbstractBackportTest {
@Parameters(name = "{0}")
public static Iterable<?> data() {
return getTestParameters()
.withDexRuntimes()
.withCfRuntimesStartingFromIncluding(CfVm.JDK11)
.withAllApiLevelsAlsoForCf()
.build();
}
public StringBackportJava11Test(TestParameters parameters) {
super(parameters, String.class, StringBackportJava11Main.class);
// Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
// Java 11 move these tests to StringBackportTest (out of examplesJava11).
registerTarget(AndroidApiLevel.T, 49);
}
public static class StringBackportJava11Main {
public static void main(String[] args) {
testRepeat();
testIsBlank();
testStrip();
testStripLeading();
testStripTrailing();
}
private static void testRepeat() {
try {
throw new AssertionError("hey".repeat(-1));
} catch (IllegalArgumentException e) {
assertEquals("count is negative: -1", e.getMessage());
}
assertEquals("", "".repeat(0));
assertEquals("", "".repeat(1));
assertEquals("", "".repeat(2));
assertEquals("", "hey".repeat(0));
assertEquals("hey", "hey".repeat(1));
assertEquals("heyhey", "hey".repeat(2));
assertEquals("heyheyhey", "hey".repeat(3));
assertEquals("heyheyheyhey", "hey".repeat(4));
try {
"\u03B1\u03B2".repeat(Integer.MAX_VALUE);
throw new AssertionError("Expected to throw OutOfMemoryError");
} catch (OutOfMemoryError e) {
// Expected.
}
}
/** Per {@link Character#isWhitespace(int)} */
private static final String WHITESPACE =
""
// Unicode "Zs" category:
+ "\u0020" + "\u1680"
// + "\u00A0" Exception per Javadoc
+ "\u1680" + "\u2000" + "\u2001" + "\u2002" + "\u2003" + "\u2004" + "\u2005" + "\u2006"
// + "\u2007" Exception per Javadoc
+ "\u2008" + "\u2009" + "\u200A"
// + "\u200F" Exception per Javadoc
// + "\u205F" Not honored on Android 4.0.4
+ "\u3000"
// Unicode "Zl" category:
+ "\u2028"
// Unicode "Zp" category:
+ "\u2029"
// Others:
+ "\t" + "\n" + "\u000B" + "\f" + "\r" + "\u001C" + "\u001D" + "\u001E" + "\u001F";
public static void testIsBlank() {
assertEquals(true, "".isBlank());
assertEquals(true, WHITESPACE.isBlank());
// Android <=4.0.4 does not recognize this as whitespace. Just ensure local consistency.
assertEquals(Character.isWhitespace(0x205F), "\u205F".isBlank());
assertEquals(false, "a".isBlank());
assertEquals(false, "å".isBlank());
assertEquals(false, "a\u030A".isBlank());
assertEquals(false, "\uD83D\uDE00".isBlank());
assertEquals(false, (WHITESPACE + "a").isBlank());
assertEquals(false, ("a" + WHITESPACE).isBlank());
}
public static void testStrip() {
assertEquals("", "".strip());
assertEquals("", WHITESPACE.strip());
assertEquals("a", "a".strip());
assertEquals("a", (WHITESPACE + "a").strip());
assertEquals("a", ("a" + WHITESPACE).strip());
assertEquals("a", (WHITESPACE + "a" + WHITESPACE).strip());
assertEquals("a" + WHITESPACE + "a", ("a" + WHITESPACE + "a").strip());
assertEquals("a" + WHITESPACE + "a", (WHITESPACE + "a" + WHITESPACE + "a").strip());
assertEquals("a" + WHITESPACE + "a", ("a" + WHITESPACE + "a" + WHITESPACE).strip());
assertEquals(
"a" + WHITESPACE + "a", (WHITESPACE + "a" + WHITESPACE + "a" + WHITESPACE).strip());
}
public static void testStripLeading() {
assertEquals("", "".stripLeading());
assertEquals("", WHITESPACE.stripLeading());
assertEquals("a", "a".stripLeading());
assertEquals("a", (WHITESPACE + "a").stripLeading());
assertEquals("a" + WHITESPACE, ("a" + WHITESPACE).stripLeading());
assertEquals("a" + WHITESPACE, (WHITESPACE + "a" + WHITESPACE).stripLeading());
assertEquals("a" + WHITESPACE + "a", ("a" + WHITESPACE + "a").stripLeading());
assertEquals("a" + WHITESPACE + "a", (WHITESPACE + "a" + WHITESPACE + "a").stripLeading());
assertEquals(
"a" + WHITESPACE + "a" + WHITESPACE,
("a" + WHITESPACE + "a" + WHITESPACE).stripLeading());
assertEquals(
"a" + WHITESPACE + "a" + WHITESPACE,
(WHITESPACE + "a" + WHITESPACE + "a" + WHITESPACE).stripLeading());
}
public static void testStripTrailing() {
assertEquals("", "".stripTrailing());
assertEquals("", WHITESPACE.stripTrailing());
assertEquals("a", "a".stripTrailing());
assertEquals(WHITESPACE + "a", (WHITESPACE + "a").stripTrailing());
assertEquals("a", ("a" + WHITESPACE).stripTrailing());
assertEquals(WHITESPACE + "a", (WHITESPACE + "a" + WHITESPACE).stripTrailing());
assertEquals("a" + WHITESPACE + "a", ("a" + WHITESPACE + "a").stripTrailing());
assertEquals(
WHITESPACE + "a" + WHITESPACE + "a",
(WHITESPACE + "a" + WHITESPACE + "a").stripTrailing());
assertEquals("a" + WHITESPACE + "a", ("a" + WHITESPACE + "a" + WHITESPACE).stripTrailing());
assertEquals(
WHITESPACE + "a" + WHITESPACE + "a",
(WHITESPACE + "a" + WHITESPACE + "a" + WHITESPACE).stripTrailing());
}
private static void assertEquals(Object expected, Object actual) {
if (expected != actual && (expected == null || !expected.equals(actual))) {
throw new AssertionError("Expected <" + expected + "> but was <" + actual + '>');
}
}
}
}