< prev index next >

test/jdk/java/util/regex/RegExTest.java

Print this page
rev 57941 : [mq]: 8235812-Unicode-linebreak-with-quantifier-does-not-match-valid-input

*** 33,43 **** * 6350801 6676425 6878475 6919132 6931676 6948903 6990617 7014645 7039066 * 7067045 7014640 7189363 8007395 8013252 8013254 8012646 8023647 6559590 * 8027645 8035076 8039124 8035975 8074678 6854417 8143854 8147531 7071819 * 8151481 4867170 7080302 6728861 6995635 6736245 4916384 6328855 6192895 * 6345469 6988218 6693451 7006761 8140212 8143282 8158482 8176029 8184706 ! * 8194667 8197462 8184692 8221431 8224789 8228352 8230829 8236034 * * @library /test/lib * @library /lib/testlibrary/java/lang * @build jdk.test.lib.RandomFactory * @run main RegExTest --- 33,43 ---- * 6350801 6676425 6878475 6919132 6931676 6948903 6990617 7014645 7039066 * 7067045 7014640 7189363 8007395 8013252 8013254 8012646 8023647 6559590 * 8027645 8035076 8039124 8035975 8074678 6854417 8143854 8147531 7071819 * 8151481 4867170 7080302 6728861 6995635 6736245 4916384 6328855 6192895 * 6345469 6988218 6693451 7006761 8140212 8143282 8158482 8176029 8184706 ! * 8194667 8197462 8184692 8221431 8224789 8228352 8230829 8236034 8235812 * * @library /test/lib * @library /lib/testlibrary/java/lang * @build jdk.test.lib.RandomFactory * @run main RegExTest
*** 55,65 **** --- 55,67 ---- import java.math.BigInteger; import java.nio.CharBuffer; import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; + import java.util.HashMap; import java.util.List; + import java.util.Map; import java.util.Random; import java.util.Scanner; import java.util.function.Function; import java.util.function.Predicate; import java.util.regex.Matcher;
*** 184,193 **** --- 186,196 ---- grapheme(); expoBacktracking(); invalidGroupName(); illegalRepetitionRange(); surrogatePairWithCanonEq(); + lineBreakWithQuantifier(); if (failure) { throw new RuntimeException("RegExTest failed, 1st failure: " + firstFailure);
*** 4998,5003 **** --- 5001,5083 ---- failCount++; System.out.println("Unexpected exception: " + t); } report("surrogatePairWithCanonEq"); } + + // This test is for 8235812 + private static void lineBreakWithQuantifier() { + // key: pattern + // value: lengths of input that must match the pattern + Map<String, List<Integer>> cases = Map.ofEntries( + Map.entry("\\R?", List.of(0, 1)), + Map.entry("\\R*", List.of(0, 1, 2, 3)), + Map.entry("\\R+", List.of(1, 2, 3)), + Map.entry("\\R{0}", List.of(0)), + Map.entry("\\R{1}", List.of(1)), + Map.entry("\\R{2}", List.of(2)), + Map.entry("\\R{3}", List.of(3)), + Map.entry("\\R{0,}", List.of(0, 1, 2, 3)), + Map.entry("\\R{1,}", List.of(1, 2, 3)), + Map.entry("\\R{2,}", List.of(2, 3)), + Map.entry("\\R{3,}", List.of(3)), + Map.entry("\\R{0,0}", List.of(0)), + Map.entry("\\R{0,1}", List.of(0, 1)), + Map.entry("\\R{0,2}", List.of(0, 1, 2)), + Map.entry("\\R{0,3}", List.of(0, 1, 2, 3)), + Map.entry("\\R{1,1}", List.of(1)), + Map.entry("\\R{1,2}", List.of(1, 2)), + Map.entry("\\R{1,3}", List.of(1, 2, 3)), + Map.entry("\\R{2,2}", List.of(2)), + Map.entry("\\R{2,3}", List.of(2, 3)), + Map.entry("\\R{3,3}", List.of(3)), + Map.entry("\\R", List.of(1)), + Map.entry("\\R\\R", List.of(2)), + Map.entry("\\R\\R\\R", List.of(3)) + ); + + // key: length of input + // value: all possible inputs of given length + Map<Integer, List<String>> inputs = new HashMap<>(); + String[] Rs = { "\r\n", "\r", "\n", + "\u000B", "\u000C", "\u0085", "\u2028", "\u2029" }; + StringBuilder sb = new StringBuilder(); + for (int len = 0; len <= 3; ++len) { + int[] idx = new int[len + 1]; + do { + sb.setLength(0); + for (int j = 0; j < len; ++j) + sb.append(Rs[idx[j]]); + inputs.computeIfAbsent(len, ArrayList::new).add(sb.toString()); + idx[0]++; + for (int j = 0; j < len; ++j) { + if (idx[j] < Rs.length) + break; + idx[j] = 0; + idx[j+1]++; + } + } while (idx[len] == 0); + } + + // exhaustive testing + for (String patStr : cases.keySet()) { + Pattern[] pats = patStr.endsWith("R") + ? new Pattern[] { Pattern.compile(patStr) } // no quantifiers + : new Pattern[] { Pattern.compile(patStr), // greedy + Pattern.compile(patStr + "?") }; // reluctant + Matcher m = pats[0].matcher(""); + for (Pattern p : pats) { + m.usePattern(p); + for (int len : cases.get(patStr)) { + for (String in : inputs.get(len)) { + if (!m.reset(in).matches()) { + failCount++; + System.out.println("Expected to match '" + + in + "' =~ /" + p + "/"); + } + } + } + } + } + report("lineBreakWithQuantifier"); + } }
< prev index next >