d6b4693c05
Reviewed-by: iris, joehw
1675 lines
58 KiB
Java
1675 lines
58 KiB
Java
/*
|
|
* Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
/**
|
|
* @test
|
|
* @bug 4313885 4926319 4927634 5032610 5032622 5049968 5059533 6223711 6277261 6269946 6288823
|
|
* 8072722 8139414 8166261 8172695
|
|
* @summary Basic tests of java.util.Scanner methods
|
|
* @key randomness
|
|
* @modules jdk.localedata
|
|
* @run main/othervm ScanTest
|
|
*/
|
|
|
|
import java.io.*;
|
|
import java.math.*;
|
|
import java.nio.*;
|
|
import java.text.*;
|
|
import java.util.*;
|
|
import java.util.function.BiConsumer;
|
|
import java.util.function.Consumer;
|
|
import java.util.regex.*;
|
|
import java.util.stream.*;
|
|
|
|
public class ScanTest {
|
|
|
|
private static boolean failure = false;
|
|
private static int failCount = 0;
|
|
private static int NUM_SOURCE_TYPES = 2;
|
|
private static File inputFile = new File(System.getProperty("test.src", "."), "input.txt");
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
Locale defaultLocale = Locale.getDefault();
|
|
try {
|
|
// Before we have resource to improve the test to be ready for
|
|
// arbitrary locale, force the default locale to be ROOT for now.
|
|
Locale.setDefault(Locale.US);
|
|
|
|
skipTest();
|
|
findInLineTest();
|
|
findWithinHorizonTest();
|
|
findInEmptyLineTest();
|
|
removeTest();
|
|
fromFileTest();
|
|
ioExceptionTest();
|
|
matchTest();
|
|
delimiterTest();
|
|
boundaryDelimTest();
|
|
useLocaleTest();
|
|
closeTest();
|
|
cacheTest();
|
|
cacheTest2();
|
|
nonASCIITest();
|
|
resetTest();
|
|
streamCloseTest();
|
|
streamComodTest();
|
|
outOfRangeRadixTest();
|
|
|
|
for (int j = 0; j < NUM_SOURCE_TYPES; j++) {
|
|
hasNextTest(j);
|
|
nextTest(j);
|
|
hasNextPatternTest(j);
|
|
nextPatternTest(j);
|
|
booleanTest(j);
|
|
byteTest(j);
|
|
shortTest(j);
|
|
intTest(j);
|
|
longTest(j);
|
|
floatTest(j);
|
|
doubleTest(j);
|
|
integerPatternTest(j);
|
|
floatPatternTest(j);
|
|
bigIntegerPatternTest(j);
|
|
bigDecimalPatternTest(j);
|
|
hasNextLineTest(j);
|
|
nextLineTest(j);
|
|
singleDelimTest(j);
|
|
}
|
|
|
|
// Examples
|
|
//example1();
|
|
//example2();
|
|
//example3();
|
|
|
|
// Usage cases
|
|
useCase1();
|
|
useCase2();
|
|
useCase3();
|
|
useCase4();
|
|
useCase5();
|
|
|
|
if (failure)
|
|
throw new RuntimeException("Failure in the scanning tests.");
|
|
else
|
|
System.err.println("OKAY: All tests passed.");
|
|
} finally {
|
|
// restore the default locale
|
|
Locale.setDefault(defaultLocale);
|
|
}
|
|
}
|
|
|
|
public static void useCase1() throws Exception {
|
|
try (Scanner sc = new Scanner(inputFile)) {
|
|
sc.findWithinHorizon("usage case 1", 0);
|
|
String[] names = new String[4];
|
|
for (int i=0; i<4; i++) {
|
|
while (sc.hasNextFloat())
|
|
sc.nextFloat();
|
|
names[i] = sc.next();
|
|
sc.nextLine();
|
|
}
|
|
if (!names[0].equals("Frank"))
|
|
failCount++;
|
|
if (!names[1].equals("Joe"))
|
|
failCount++;
|
|
if (!names[2].equals("Mary"))
|
|
failCount++;
|
|
if (!names[3].equals("Michelle"))
|
|
failCount++;
|
|
}
|
|
report("Use case 1");
|
|
}
|
|
|
|
public static void useCase2() throws Exception {
|
|
try (Scanner sc = new Scanner(inputFile).useDelimiter("-")) {
|
|
String testDataTag = sc.findWithinHorizon("usage case 2\n", 0);
|
|
if (!testDataTag.equals("usage case 2\n"))
|
|
failCount++;
|
|
if (!sc.next().equals("cat"))
|
|
failCount++;
|
|
if (sc.nextInt() != 9)
|
|
failCount++;
|
|
if (!sc.next().equals("dog"))
|
|
failCount++;
|
|
if (sc.nextInt() != 6)
|
|
failCount++;
|
|
if (!sc.next().equals("pig"))
|
|
failCount++;
|
|
if (sc.nextInt() != 2)
|
|
failCount++;
|
|
if (!sc.next().equals(""))
|
|
failCount++;
|
|
if (sc.nextInt() != 5)
|
|
failCount++;
|
|
}
|
|
report("Use case 2");
|
|
}
|
|
|
|
public static void useCase3() throws Exception {
|
|
try (Scanner sc = new Scanner(inputFile)) {
|
|
String testDataTag = sc.findWithinHorizon("usage case 3\n", 0);
|
|
if (!testDataTag.equals("usage case 3\n"))
|
|
failCount++;
|
|
Pattern tagPattern = Pattern.compile("@[a-z]+");
|
|
Pattern endPattern = Pattern.compile("\\*\\/");
|
|
String tag;
|
|
String end = sc.findInLine(endPattern);
|
|
|
|
while (end == null) {
|
|
if ((tag = sc.findInLine(tagPattern)) != null) {
|
|
String text = sc.nextLine();
|
|
text = text.substring(0, text.length() - 1);
|
|
//System.out.println(text);
|
|
} else {
|
|
sc.nextLine();
|
|
}
|
|
end = sc.findInLine(endPattern);
|
|
}
|
|
}
|
|
report("Use case 3");
|
|
}
|
|
|
|
public static void useCase4() throws Exception {
|
|
try (Scanner sc = new Scanner(inputFile)) {
|
|
String testDataTag = sc.findWithinHorizon("usage case 4\n", 0);
|
|
if (!testDataTag.equals("usage case 4\n"))
|
|
failCount++;
|
|
|
|
// Read some text parts of four hrefs
|
|
String[] expected = { "Diffs", "Sdiffs", "Old", "New" };
|
|
for (int i=0; i<4; i++) {
|
|
sc.findWithinHorizon("<a href", 1000);
|
|
sc.useDelimiter("[<>\n]+");
|
|
sc.next();
|
|
String textOfRef = sc.next();
|
|
if (!textOfRef.equals(expected[i]))
|
|
failCount++;
|
|
}
|
|
// Read some html tags using < and > as delimiters
|
|
if (!sc.next().equals("/a"))
|
|
failCount++;
|
|
if (!sc.next().equals("b"))
|
|
failCount++;
|
|
|
|
// Scan some html tags using skip and next
|
|
Pattern nonTagStart = Pattern.compile("[^<]+");
|
|
Pattern tag = Pattern.compile("<[^>]+?>");
|
|
Pattern spotAfterTag = Pattern.compile("(?<=>)");
|
|
String[] expected2 = { "</b>", "<p>", "<ul>", "<li>" };
|
|
sc.useDelimiter(spotAfterTag);
|
|
int tagsFound = 0;
|
|
while (tagsFound < 4) {
|
|
if (!sc.hasNext(tag)) {
|
|
// skip text between tags
|
|
sc.skip(nonTagStart);
|
|
}
|
|
String tagContents = sc.next(tag);
|
|
if (!tagContents.equals(expected2[tagsFound]))
|
|
failCount++;
|
|
tagsFound++;
|
|
}
|
|
}
|
|
|
|
report("Use case 4");
|
|
}
|
|
|
|
public static void useCase5() throws Exception {
|
|
try (Scanner sc = new Scanner(inputFile)) {
|
|
String testDataTag = sc.findWithinHorizon("usage case 5\n", 0);
|
|
if (!testDataTag.equals("usage case 5\n"))
|
|
failCount++;
|
|
|
|
sc.findWithinHorizon("Share Definitions", 0);
|
|
sc.nextLine();
|
|
sc.next("\\[([a-z]+)\\]");
|
|
String shareName = sc.match().group(1);
|
|
if (!shareName.equals("homes"))
|
|
failCount++;
|
|
|
|
String[] keys = { "comment", "browseable", "writable", "valid users" };
|
|
String[] vals = { "Home Directories", "no", "yes", "%S" };
|
|
for (int i=0; i<4; i++) {
|
|
sc.useDelimiter("=");
|
|
String key = sc.next().trim();
|
|
if (!key.equals(keys[i]))
|
|
failCount++;
|
|
sc.skip("[ =]+");
|
|
sc.useDelimiter("\n");
|
|
String value = sc.next();
|
|
if (!value.equals(vals[i]))
|
|
failCount++;
|
|
sc.nextLine();
|
|
}
|
|
}
|
|
|
|
report("Use case 5");
|
|
}
|
|
|
|
public static void nonASCIITest() throws Exception {
|
|
String yourBasicTibetanNumberZero = "\u0f20";
|
|
String yourBasicTibetanFloatingNumber = "\u0f23.\u0f27";
|
|
String weirdMixtureOfTibetanAndASCII = "\u0f23.7";
|
|
String weirdMixtureOfASCIIAndTibetan = "3.\u0f27";
|
|
Scanner sc = new Scanner(yourBasicTibetanNumberZero);
|
|
int i = sc.nextInt();
|
|
if (i != 0)
|
|
failCount++;
|
|
sc = new Scanner(yourBasicTibetanFloatingNumber);
|
|
float f = sc.nextFloat();
|
|
if (f != Float.parseFloat("3.7"))
|
|
failCount++;
|
|
sc = new Scanner(weirdMixtureOfTibetanAndASCII);
|
|
f = sc.nextFloat();
|
|
if (f != Float.parseFloat("3.7"))
|
|
failCount++;
|
|
sc = new Scanner(weirdMixtureOfASCIIAndTibetan);
|
|
f = sc.nextFloat();
|
|
if (f != Float.parseFloat("3.7"))
|
|
failCount++;
|
|
report("Scanning non ASCII digits");
|
|
}
|
|
|
|
public static void findWithinHorizonTest() throws Exception {
|
|
// Test with a string source
|
|
Scanner sc = new Scanner("dog cat cat dog cat");
|
|
try {
|
|
sc.findWithinHorizon("dog", -1);
|
|
failCount++;
|
|
} catch (IllegalArgumentException iae) {
|
|
// Correct result
|
|
}
|
|
if (sc.findWithinHorizon("dog", 2) != null)
|
|
failCount++;
|
|
if (!sc.findWithinHorizon("dog", 3).equals("dog"))
|
|
failCount++;
|
|
if (sc.findWithinHorizon("cat", 4) != null)
|
|
failCount++;
|
|
if (!sc.findWithinHorizon("cat", 5).equals("cat"))
|
|
failCount++;
|
|
if (sc.findWithinHorizon("cat", 7) != null)
|
|
failCount++;
|
|
if (sc.findWithinHorizon("dog", 7) != null)
|
|
failCount++;
|
|
if (!sc.findWithinHorizon("cat", 0).equals("cat"))
|
|
failCount++;
|
|
if (!sc.findWithinHorizon("dog", 0).equals("dog"))
|
|
failCount++;
|
|
if (!sc.findWithinHorizon("cat", 0).equals("cat"))
|
|
failCount++;
|
|
|
|
// Test with a stream source
|
|
StutteringInputStream stutter = new StutteringInputStream();
|
|
for (int index=0; index<stutter.length(); index++) {
|
|
//System.out.println("index is now "+index);
|
|
sc = new Scanner(stutter);
|
|
String word = stutter.wordInIndex(index);
|
|
if (word != null) {
|
|
String result = sc.findWithinHorizon(word, index);
|
|
if ((result == null) || (!result.equals(word)))
|
|
failCount++;
|
|
}
|
|
stutter.reset();
|
|
word = stutter.wordBeyondIndex(index);
|
|
sc = new Scanner(stutter);
|
|
String result = sc.findWithinHorizon(word, index);
|
|
if ((result != null) && (index > 0))
|
|
failCount++;
|
|
stutter.reset();
|
|
}
|
|
|
|
// We must loop to let StutteringInputStream do its magic
|
|
for (int j=0; j<10; j++) {
|
|
// An anchor at the end of stream should work
|
|
stutter.reset();
|
|
sc = new Scanner(stutter);
|
|
String result = sc.findWithinHorizon("phant$", 0);
|
|
if (!result.equals("phant"))
|
|
failCount++;
|
|
stutter.reset();
|
|
sc = new Scanner(stutter);
|
|
result = sc.findWithinHorizon("phant$", 54);
|
|
if (!result.equals("phant"))
|
|
failCount++;
|
|
// An anchor at the end of horizon should not
|
|
stutter.reset();
|
|
sc = new Scanner(stutter);
|
|
result = sc.findWithinHorizon("brummer$", 7);
|
|
if (result != null)
|
|
failCount++;
|
|
// An anchor at start should work
|
|
stutter.reset();
|
|
sc = new Scanner(stutter);
|
|
result = sc.findWithinHorizon("^brummer", 0);
|
|
if (!result.equals("brummer"))
|
|
failCount++;
|
|
}
|
|
|
|
report("Find to horizon test");
|
|
}
|
|
|
|
// StutteringInputStream returns 1 to 3 characters at a time
|
|
static class StutteringInputStream implements Readable {
|
|
StutteringInputStream() {
|
|
text = "brummer hisser tort zardzard rantrant caimagator phant";
|
|
datalen = 54;
|
|
}
|
|
StutteringInputStream(String text) {
|
|
this.text = text;
|
|
datalen = text.length();
|
|
}
|
|
Random generator = new Random();
|
|
String text;
|
|
int datalen;
|
|
int index = 0;
|
|
public int length() {
|
|
return datalen;
|
|
}
|
|
public void reset() {
|
|
index = 0;
|
|
}
|
|
public String wordInIndex(int index) {
|
|
if (index < 7) return null;
|
|
if (index < 14) return "brummer";
|
|
if (index < 19) return "hisser";
|
|
if (index < 28) return "tort";
|
|
if (index < 37) return "zardzard";
|
|
if (index < 48) return "rantrant";
|
|
return "caimagator";
|
|
}
|
|
public String wordBeyondIndex(int index) {
|
|
if (index < 7) return "brummer";
|
|
if (index < 14) return "hisser";
|
|
if (index < 19) return "tort";
|
|
if (index < 28) return "zardzard";
|
|
if (index < 37) return "rantrant";
|
|
if (index < 48) return "caimagator";
|
|
return "phantphant";
|
|
}
|
|
public int read(java.nio.CharBuffer target) throws IOException {
|
|
if (index > datalen-1)
|
|
return -1; // EOS
|
|
int len = target.remaining();
|
|
if (len > 4) // return 1 to 3 characters
|
|
len = generator.nextInt(3) + 1;
|
|
while ((index + len) > datalen)
|
|
len--;
|
|
for (int i=0; i<len; i++)
|
|
target.put(text.charAt(index++));
|
|
return len;
|
|
}
|
|
}
|
|
|
|
public static void hasNextLineTest(int sourceType) throws Exception {
|
|
Scanner sc = scannerFor("1\n2\n3 3\r\n4 4 4\r5", sourceType);
|
|
if (!sc.hasNextLine()) failCount++;
|
|
if (!sc.nextLine().equals("1")) failCount++;
|
|
if (!sc.hasNextLine()) failCount++;
|
|
if (sc.nextInt() != 2) failCount++;
|
|
if (!sc.hasNextLine()) failCount++;
|
|
if (!sc.nextLine().equals("")) failCount++;
|
|
if (!sc.hasNextLine()) failCount++;
|
|
if (sc.nextInt() != 3) failCount++;
|
|
if (!sc.hasNextLine()) failCount++;
|
|
if (!sc.nextLine().equals(" 3")) failCount++;
|
|
if (!sc.hasNextLine()) failCount++;
|
|
if (sc.nextInt() != 4) failCount++;
|
|
if (!sc.hasNextLine()) failCount++;
|
|
if (sc.nextInt() != 4) failCount++;
|
|
if (!sc.hasNextLine()) failCount++;
|
|
if (!sc.nextLine().equals(" 4")) failCount++;
|
|
if (!sc.hasNextLine()) failCount++;
|
|
if (!sc.nextLine().equals("5")) failCount++;
|
|
if (sc.hasNextLine()) failCount++;
|
|
sc = new Scanner("blah blah blah blah blah blah");
|
|
if (!sc.hasNextLine()) failCount++;
|
|
if (!sc.nextLine().equals("blah blah blah blah blah blah"))
|
|
failCount++;
|
|
if (sc.hasNextLine()) failCount++;
|
|
|
|
// Go through all the lines in a file
|
|
try (Scanner sc2 = new Scanner(inputFile)) {
|
|
String lastLine = "blah";
|
|
while (sc2.hasNextLine())
|
|
lastLine = sc2.nextLine();
|
|
if (!lastLine.equals("# Data for usage case 6")) failCount++;
|
|
}
|
|
|
|
report("Has next line test");
|
|
}
|
|
|
|
public static void nextLineTest(int sourceType) throws Exception {
|
|
Scanner sc = scannerFor("1\n2\n3 3\r\n4 4 4\r5", sourceType);
|
|
if (!sc.nextLine().equals("1"))
|
|
failCount++;
|
|
if (sc.nextInt() != 2)
|
|
failCount++;
|
|
if (!sc.nextLine().equals(""))
|
|
failCount++;
|
|
if (sc.nextInt() != 3)
|
|
failCount++;
|
|
if (!sc.nextLine().equals(" 3"))
|
|
failCount++;
|
|
if (sc.nextInt() != 4)
|
|
failCount++;
|
|
if (sc.nextInt() != 4)
|
|
failCount++;
|
|
if (!sc.nextLine().equals(" 4"))
|
|
failCount++;
|
|
if (!sc.nextLine().equals("5"))
|
|
failCount++;
|
|
sc = new Scanner("blah blah blah blah blah blah");
|
|
if (!sc.nextLine().equals("blah blah blah blah blah blah"))
|
|
failCount++;
|
|
report("Next line test");
|
|
}
|
|
|
|
public static void singleDelimTest(int sourceType) throws Exception {
|
|
Scanner sc = scannerFor("12 13 14 15 16 17 ",
|
|
sourceType);
|
|
sc.useDelimiter(" ");
|
|
for (int i=0; i<6; i++) {
|
|
int j = sc.nextInt();
|
|
if (j != 12 + i)
|
|
failCount++;
|
|
for (int k=0; k<i; k++) {
|
|
String empty = sc.next();
|
|
if (!empty.equals(""))
|
|
failCount++;
|
|
}
|
|
}
|
|
report("Single delim test");
|
|
}
|
|
|
|
private static void append(StringBuilder sb, char c, int n) {
|
|
for (int i = 0; i < n; i++) {
|
|
sb.append(c);
|
|
}
|
|
}
|
|
|
|
public static void boundaryDelimTest() throws Exception {
|
|
// 8139414
|
|
int i = 1019;
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.append("--;");
|
|
for (int j = 0; j < 1019; ++j) {
|
|
sb.append(j%10);
|
|
}
|
|
sb.append("-;-");
|
|
String text = sb.toString();
|
|
try (Scanner scanner = new Scanner(text)) {
|
|
scanner.useDelimiter("-;(-)?");
|
|
while (scanner.hasNext()) {
|
|
scanner.next();
|
|
}
|
|
} catch (NoSuchElementException e) {
|
|
System.out.println("Caught NoSuchElementException " + e);
|
|
e.printStackTrace();
|
|
failCount++;
|
|
}
|
|
|
|
report("delim at boundary test");
|
|
}
|
|
|
|
/*
|
|
* The hasNextPattern caches a match of a pattern called the regular cache
|
|
* The hasNextType caches a match of that type called the type cache
|
|
* Any next must clear the caches whether it uses them or not, because
|
|
* it advances past a token thus invalidating any cached token; any
|
|
* hasNext must set a cache to what it finds.
|
|
*/
|
|
public static void cacheTest() throws Exception {
|
|
// Test clearing of the type cache
|
|
Scanner scanner = new Scanner("777 dog");
|
|
scanner.hasNextInt();
|
|
scanner.findInLine("777");
|
|
try {
|
|
scanner.nextInt();
|
|
System.out.println("type cache not cleared by find");
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct
|
|
}
|
|
|
|
scanner = new Scanner("777 dog");
|
|
scanner.hasNextInt();
|
|
scanner.skip("777");
|
|
try {
|
|
scanner.nextInt();
|
|
System.out.println("type cache not cleared by skip");
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct
|
|
}
|
|
|
|
// Test clearing of the regular cache
|
|
scanner = new Scanner("777 dog");
|
|
scanner.hasNext("777");
|
|
scanner.findInLine("777");
|
|
try {
|
|
scanner.next("777");
|
|
System.out.println("regular cache not cleared by find");
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct
|
|
}
|
|
|
|
// Test two primitive next clearing of type cache
|
|
scanner = new Scanner("777 dog");
|
|
scanner.hasNextInt();
|
|
scanner.nextLong();
|
|
try {
|
|
scanner.nextInt();
|
|
System.out.println("type cache not cleared by primitive next");
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct
|
|
}
|
|
|
|
// Test using both of them, type first
|
|
scanner = new Scanner("777 dog");
|
|
scanner.hasNext("777");
|
|
scanner.nextInt();
|
|
try {
|
|
scanner.next("777");
|
|
System.out.println("regular cache not cleared by primitive next");
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct
|
|
}
|
|
|
|
// Test using both of them, regular first
|
|
scanner = new Scanner("777 dog");
|
|
scanner.hasNext("777");
|
|
scanner.hasNextInt();
|
|
scanner.next("777");
|
|
try {
|
|
scanner.nextInt();
|
|
System.out.println("type cache not cleared by regular next");
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct
|
|
}
|
|
report("Cache test");
|
|
}
|
|
|
|
/*
|
|
* The hasNext<IntegerType>(radix) method caches a matched integer type
|
|
* with specified radix for the next next<IntegerType>(radix) invoke.
|
|
* The cache value should not be used if the next<IntegerType>(radix)
|
|
* has different radix value with the last hasNext<IntegerType>(radix).
|
|
*/
|
|
public static void cacheTest2() throws Exception {
|
|
// Test clearing of the type cache
|
|
Scanner scanner = new Scanner("10");
|
|
scanner.hasNextByte(16);
|
|
if (scanner.nextByte(10) != 10) {
|
|
System.out.println("wrong radix cache is used");
|
|
failCount++;
|
|
}
|
|
scanner = new Scanner("10");
|
|
scanner.hasNextShort(16);
|
|
if (scanner.nextShort(10) != 10) {
|
|
System.out.println("wrong radix cache is used");
|
|
failCount++;
|
|
}
|
|
scanner = new Scanner("10");
|
|
scanner.hasNextInt(16);
|
|
if (scanner.nextInt(10) != 10) {
|
|
System.out.println("wrong radix cache is used");
|
|
failCount++;
|
|
}
|
|
scanner = new Scanner("10");
|
|
scanner.hasNextLong(16);
|
|
if (scanner.nextLong(10) != 10) {
|
|
System.out.println("wrong radix cache is used");
|
|
failCount++;
|
|
}
|
|
scanner = new Scanner("10");
|
|
scanner.hasNextBigInteger(16);
|
|
if (scanner.nextBigInteger(10).intValue() != 10) {
|
|
System.out.println("wrong radix cache is used");
|
|
failCount++;
|
|
}
|
|
report("Cache test2");
|
|
}
|
|
|
|
|
|
public static void closeTest() throws Exception {
|
|
Scanner sc = new Scanner("testing");
|
|
sc.close();
|
|
sc.ioException();
|
|
sc.delimiter();
|
|
sc.useDelimiter("blah");
|
|
sc.useDelimiter(Pattern.compile("blah"));
|
|
|
|
for (Consumer<Scanner> method : methodList) {
|
|
try {
|
|
method.accept(sc);
|
|
failCount++;
|
|
} catch (IllegalStateException ise) {
|
|
// Correct
|
|
}
|
|
}
|
|
|
|
report("Close test");
|
|
}
|
|
|
|
static List<Consumer<Scanner>> methodList = Arrays.asList(
|
|
Scanner::hasNext,
|
|
Scanner::next,
|
|
sc -> sc.hasNext(Pattern.compile("blah")),
|
|
sc -> sc.next(Pattern.compile("blah")),
|
|
Scanner::hasNextBoolean,
|
|
Scanner::nextBoolean,
|
|
Scanner::hasNextByte,
|
|
Scanner::nextByte,
|
|
Scanner::hasNextShort,
|
|
Scanner::nextShort,
|
|
Scanner::hasNextInt,
|
|
Scanner::nextInt,
|
|
Scanner::hasNextLong,
|
|
Scanner::nextLong,
|
|
Scanner::hasNextFloat,
|
|
Scanner::nextFloat,
|
|
Scanner::hasNextDouble,
|
|
Scanner::nextDouble,
|
|
Scanner::hasNextBigInteger,
|
|
Scanner::nextBigInteger,
|
|
Scanner::hasNextBigDecimal,
|
|
Scanner::nextBigDecimal,
|
|
Scanner::hasNextLine,
|
|
Scanner::tokens,
|
|
sc -> sc.findAll(Pattern.compile("blah")),
|
|
sc -> sc.findAll("blah")
|
|
);
|
|
|
|
public static void removeTest() throws Exception {
|
|
Scanner sc = new Scanner("testing");
|
|
try {
|
|
sc.remove();
|
|
failCount++;
|
|
} catch (UnsupportedOperationException uoe) {
|
|
// Correct result
|
|
}
|
|
report("Remove test");
|
|
}
|
|
|
|
public static void delimiterTest() throws Exception {
|
|
Scanner sc = new Scanner("blah");
|
|
Pattern test = sc.delimiter();
|
|
if (!test.toString().equals("\\p{javaWhitespace}+"))
|
|
failCount++;
|
|
sc.useDelimiter("a");
|
|
test = sc.delimiter();
|
|
if (!test.toString().equals("a"))
|
|
failCount++;
|
|
sc.useDelimiter(Pattern.compile("b"));
|
|
test = sc.delimiter();
|
|
if (!test.toString().equals("b"))
|
|
failCount++;
|
|
report("Delimiter test");
|
|
}
|
|
|
|
public static void ioExceptionTest() throws Exception {
|
|
Readable thrower = new ThrowingReadable();
|
|
Scanner sc = new Scanner(thrower);
|
|
try {
|
|
sc.nextInt();
|
|
failCount++;
|
|
} catch (NoSuchElementException nsee) {
|
|
// Correct result
|
|
}
|
|
Exception thrown = sc.ioException();
|
|
String detail = thrown.getMessage();
|
|
if (!detail.equals("ThrowingReadable always throws"))
|
|
failCount++;
|
|
|
|
report("IOException test");
|
|
}
|
|
|
|
public static void bigIntegerPatternTest(int sourceType) throws Exception {
|
|
Scanner sc = scannerFor("23 9223372036854775817", sourceType);
|
|
if (!sc.nextBigInteger().equals(BigInteger.valueOf(23)))
|
|
failCount++;
|
|
if (!sc.nextBigInteger().equals(new BigInteger(
|
|
"9223372036854775817", 10)))
|
|
failCount++;
|
|
|
|
// Test another radix
|
|
sc = new Scanner("4a4 4A4").useRadix(16);
|
|
if (!sc.nextBigInteger().equals(new BigInteger("4a4", 16)))
|
|
failCount++;
|
|
if (!sc.nextBigInteger().equals(new BigInteger("4A4", 16)))
|
|
failCount++;
|
|
|
|
// Test alternating radices
|
|
sc = new Scanner("12 4a4 14 4f4");
|
|
if (!sc.nextBigInteger(10).equals(new BigInteger("12", 10)))
|
|
failCount++;
|
|
if (!sc.nextBigInteger(16).equals(new BigInteger("4a4", 16)))
|
|
failCount++;
|
|
if (!sc.nextBigInteger(10).equals(new BigInteger("14", 10)))
|
|
failCount++;
|
|
if (!sc.nextBigInteger(16).equals(new BigInteger("4f4", 16)))
|
|
failCount++;
|
|
|
|
// Test use of a lot of radices
|
|
for (int i=2; i<17; i++) {
|
|
sc = new Scanner("1111");
|
|
if (!sc.nextBigInteger(i).equals(new BigInteger("1111", i)))
|
|
failCount++;
|
|
}
|
|
|
|
report("BigInteger pattern");
|
|
}
|
|
|
|
public static void bigDecimalPatternTest(int sourceType) throws Exception {
|
|
Scanner sc = scannerFor("23 45.99 -45,067.444 3.4e10", sourceType);
|
|
if (!sc.nextBigDecimal().equals(BigDecimal.valueOf(23)))
|
|
failCount++;
|
|
if (!sc.nextBigDecimal().equals(new BigDecimal("45.99")))
|
|
failCount++;
|
|
if (!sc.nextBigDecimal().equals(new BigDecimal("-45067.444")))
|
|
failCount++;
|
|
if (!sc.nextBigDecimal().equals(new BigDecimal("3.4e10")))
|
|
failCount++;
|
|
report("BigDecimal pattern");
|
|
}
|
|
|
|
public static void integerPatternTest(int sourceType) throws Exception {
|
|
String input =
|
|
"1 22 f FF Z -3 -44 123 1,200 -123 -3,400,000 5,40 ,500 ";
|
|
Scanner sc = scannerFor(input, sourceType);
|
|
integerPatternBody(sc);
|
|
CharBuffer cb = CharBuffer.wrap(input);
|
|
sc = new Scanner(cb);
|
|
integerPatternBody(sc);
|
|
report("Integer pattern");
|
|
}
|
|
|
|
public static void integerPatternBody(Scanner sc) throws Exception {
|
|
if (sc.nextInt() != 1) failCount++;
|
|
if (sc.nextShort() != 22) failCount++;
|
|
if (sc.nextShort(16) != 15) failCount++;
|
|
if (sc.nextShort(16) != 255) failCount++;
|
|
if (sc.nextShort(36) != 35) failCount++;
|
|
if (!sc.hasNextInt()) failCount++;
|
|
if (sc.nextInt() != -3) failCount++;
|
|
if (sc.nextInt() != -44) failCount++;
|
|
if (sc.nextLong() != 123) failCount++;
|
|
if (!sc.hasNextInt()) failCount++;
|
|
if (sc.nextInt() != 1200) failCount++;
|
|
if (sc.nextInt() != -123) failCount++;
|
|
if (sc.nextInt() != -3400000) failCount++;
|
|
try {
|
|
sc.nextInt();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct result
|
|
}
|
|
sc.next();
|
|
try {
|
|
sc.nextLong();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct result
|
|
}
|
|
sc.next();
|
|
try {
|
|
sc.next();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
failCount++;
|
|
} catch (NoSuchElementException nse) {
|
|
// Correct result
|
|
}
|
|
}
|
|
|
|
public static void floatPatternTest(int sourceType) throws Exception {
|
|
String input =
|
|
"090.090 1 22.0 -3 -44.05 +.123 -.1234 -3400000 56,566.6 " +
|
|
"Infinity +Infinity -Infinity NaN -NaN +NaN 5.4.0 5-.00 ++6.07";
|
|
Scanner sc = scannerFor(input, sourceType);
|
|
floatPatternBody(sc);
|
|
CharBuffer cb = CharBuffer.wrap(input);
|
|
sc = new Scanner(cb);
|
|
floatPatternBody(sc);
|
|
report("Float pattern");
|
|
}
|
|
|
|
public static void floatPatternBody(Scanner sc) throws Exception {
|
|
if (sc.nextFloat() != 090.090f) failCount++;
|
|
if (sc.nextFloat() != 1f) failCount++;
|
|
if (sc.nextFloat() != 22.0f) failCount++;
|
|
if (sc.nextDouble() != -3d) failCount++;
|
|
if (sc.nextDouble() != -44.05d) failCount++;
|
|
if (sc.nextFloat() != .123f) failCount++;
|
|
if (sc.nextFloat() != -.1234f) failCount++;
|
|
if (sc.nextDouble() != -3400000d) failCount++;
|
|
if (sc.nextDouble() != 56566.6d) failCount++;
|
|
if (sc.nextDouble() != Double.POSITIVE_INFINITY) failCount++;
|
|
if (sc.nextDouble() != Double.POSITIVE_INFINITY) failCount++;
|
|
if (sc.nextDouble() != Double.NEGATIVE_INFINITY) failCount++;
|
|
if (!Double.valueOf(sc.nextDouble()).isNaN()) failCount++;
|
|
if (!Double.valueOf(sc.nextDouble()).isNaN()) failCount++;
|
|
if (!Double.valueOf(sc.nextDouble()).isNaN()) failCount++;
|
|
try {
|
|
sc.nextFloat();
|
|
failCount++;
|
|
} catch (NoSuchElementException nse) {
|
|
// Correct result
|
|
}
|
|
try {
|
|
sc.nextDouble();
|
|
failCount++;
|
|
} catch (NoSuchElementException nse) {
|
|
// Correct result
|
|
}
|
|
try {
|
|
sc.nextDouble();
|
|
failCount++;
|
|
} catch (NoSuchElementException nse) {
|
|
// Correct result
|
|
}
|
|
}
|
|
|
|
public static void fromFileTest() throws Exception {
|
|
File f = new File(System.getProperty("test.src", "."), "input.txt");
|
|
try (Scanner sc = new Scanner(f)) {
|
|
sc.useDelimiter("\n+");
|
|
String testDataTag = sc.findWithinHorizon("fromFileTest", 0);
|
|
if (!testDataTag.equals("fromFileTest"))
|
|
failCount++;
|
|
|
|
int count = 0;
|
|
while (sc.hasNextLong()) {
|
|
long blah = sc.nextLong();
|
|
count++;
|
|
}
|
|
if (count != 7)
|
|
failCount++;
|
|
}
|
|
report("From file");
|
|
}
|
|
|
|
private static void example1() throws Exception {
|
|
Scanner s = new Scanner("1 fish 2 fish red fish blue fish");
|
|
s.useDelimiter("\\s*fish\\s*");
|
|
List <String> results = new ArrayList<String>();
|
|
while (s.hasNext())
|
|
results.add(s.next());
|
|
System.out.println(results);
|
|
}
|
|
|
|
private static void example2() throws Exception {
|
|
Scanner s = new Scanner("1 fish 2 fish red fish blue fish");
|
|
s.useDelimiter("\\s*fish\\s*");
|
|
System.out.println(s.nextInt());
|
|
System.out.println(s.nextInt());
|
|
System.out.println(s.next());
|
|
System.out.println(s.next());
|
|
}
|
|
|
|
private static void example3() throws Exception {
|
|
Scanner s = new Scanner("1 fish 2 fish red fish blue fish");
|
|
s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
|
|
for (int i=1; i<=s.match().groupCount(); i++)
|
|
System.out.println(s.match().group(i));
|
|
}
|
|
|
|
private static void findInLineTest() throws Exception {
|
|
Scanner s = new Scanner("abc def ghi jkl mno");
|
|
Pattern letters = Pattern.compile("[a-z]+");
|
|
Pattern frogs = Pattern.compile("frogs");
|
|
String str = s.findInLine(letters);
|
|
if (!str.equals("abc"))
|
|
failCount++;
|
|
if (!s.hasNext(letters))
|
|
failCount++;
|
|
try {
|
|
str = s.findInLine(frogs);
|
|
} catch (NoSuchElementException nsee) {
|
|
// Correct
|
|
}
|
|
if (!s.hasNext())
|
|
failCount++;
|
|
if (!s.hasNext(letters))
|
|
failCount++;
|
|
str = s.findInLine(letters);
|
|
if (!str.equals("def"))
|
|
failCount++;
|
|
|
|
report("Find patterns");
|
|
}
|
|
|
|
private static void findInEmptyLineTest() throws Exception {
|
|
String eol = System.getProperty("line.separator");
|
|
Scanner s = new Scanner("line 1" + eol + "" + eol + "line 3" + eol);
|
|
int lineNo = 0;
|
|
while (s.hasNextLine()) {
|
|
lineNo++;
|
|
s.findInLine("3");
|
|
s.nextLine();
|
|
}
|
|
if (lineNo != 3)
|
|
failCount++;
|
|
report("findInEmptyLine test");
|
|
}
|
|
|
|
private static void matchTest() throws Exception {
|
|
Scanner s = new Scanner("1 fish 2 fish red fish blue fish");
|
|
s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
|
|
|
|
MatchResult result = s.match();
|
|
if (!result.group(1).equals("1"))
|
|
failCount++;
|
|
if (!result.group(2).equals("2"))
|
|
failCount++;
|
|
if (!result.group(3).equals("red"))
|
|
failCount++;
|
|
if (!result.group(4).equals("blue"))
|
|
failCount++;
|
|
|
|
report("Match patterns");
|
|
}
|
|
|
|
private static void skipTest() throws Exception {
|
|
Scanner s = new Scanner("abc def ghi jkl mno");
|
|
Pattern letters = Pattern.compile("[a-z]+");
|
|
Pattern spaceLetters = Pattern.compile(" [a-z]+");
|
|
Pattern frogs = Pattern.compile("frogs");
|
|
try {
|
|
s.skip(letters);
|
|
} catch (NoSuchElementException ime) {
|
|
failCount++;
|
|
}
|
|
String token = s.next(letters);
|
|
if (!token.equals("def")) {
|
|
System.out.println("expected def");
|
|
System.out.println("I found "+token);
|
|
failCount++;
|
|
}
|
|
try {
|
|
s.skip(letters);
|
|
failCount++;
|
|
} catch (NoSuchElementException ime) {
|
|
// Correct result
|
|
}
|
|
token = s.next(letters);
|
|
if (!token.equals("ghi")) {
|
|
System.out.println("expected ghi");
|
|
System.out.println("I found "+token);
|
|
failCount++;
|
|
}
|
|
try {
|
|
s.skip(letters);
|
|
failCount++;
|
|
} catch (NoSuchElementException ime) {
|
|
// Correct result because skip ignores delims
|
|
}
|
|
try {
|
|
s.skip(spaceLetters);
|
|
} catch (NoSuchElementException ime) {
|
|
failCount++;
|
|
}
|
|
token = s.next(letters);
|
|
if (!token.equals("mno")) {
|
|
System.out.println("expected mno");
|
|
System.out.println("I found "+token);
|
|
failCount++;
|
|
}
|
|
try {
|
|
s.skip(letters);
|
|
failCount++;
|
|
} catch (NoSuchElementException ime) {
|
|
// Correct result
|
|
}
|
|
report("Skip patterns");
|
|
}
|
|
|
|
private static void byteTest(int sourceType) throws Exception {
|
|
String input = " 3 0 00 b -B 012 44 -55 12 127 129 -131 dog 0x12";
|
|
Scanner s = scannerFor(input, sourceType);
|
|
if (!s.hasNextByte()) failCount++;
|
|
if (s.nextByte() != (byte)3) failCount++;
|
|
if (!s.hasNextByte()) failCount++;
|
|
if (s.nextByte() != (byte)0) failCount++;
|
|
if (!s.hasNextByte()) failCount++;
|
|
if (s.nextByte() != (byte)0) failCount++;
|
|
if (!s.hasNextByte(16)) failCount++;
|
|
if (s.nextByte(16) != (byte)11)failCount++;
|
|
if (!s.hasNextByte(16)) failCount++;
|
|
if (s.nextByte(16) != (byte)-11) failCount++;
|
|
if (!s.hasNextByte()) failCount++;
|
|
if (s.nextByte() != (byte)12) failCount++;
|
|
if (!s.hasNextByte()) failCount++;
|
|
if (s.nextByte() != (byte)44) failCount++;
|
|
if (!s.hasNextByte()) failCount++;
|
|
if (s.nextByte() != (byte)-55) failCount++;
|
|
if (!s.hasNextByte()) failCount++;
|
|
if (s.nextByte() != (byte)12) failCount++;
|
|
if (!s.hasNextByte()) failCount++;
|
|
if (s.nextByte() != (byte)127) failCount++;
|
|
if (s.hasNextByte()) failCount++;
|
|
|
|
try {
|
|
s.nextByte();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct result
|
|
}
|
|
if (s.hasNextByte()) failCount++;
|
|
if (s.nextInt() != 129) failCount++;
|
|
if (s.hasNextByte()) failCount++;
|
|
try {
|
|
s.nextByte();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct result
|
|
}
|
|
if (s.nextInt() != -131) failCount++;
|
|
if (s.hasNextByte()) failCount++;
|
|
try {
|
|
s.nextByte();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct result
|
|
}
|
|
s.next(Pattern.compile("\\w+"));
|
|
if (s.hasNextByte())
|
|
failCount++;
|
|
try {
|
|
s.nextByte();
|
|
failCount++;
|
|
} catch (NoSuchElementException nsee) {
|
|
// Correct result
|
|
}
|
|
s.next();
|
|
if (s.hasNextByte())
|
|
failCount++;
|
|
try {
|
|
byte bb = s.nextByte();
|
|
failCount++;
|
|
} catch (NoSuchElementException nsee) {
|
|
// Correct result
|
|
}
|
|
report("Scan bytes");
|
|
}
|
|
|
|
private static void shortTest(int sourceType) throws Exception {
|
|
String input = " 017 22 00E -34 44,333 -53999 0x19 dog";
|
|
Scanner s = scannerFor(input, sourceType);
|
|
if (!s.hasNextShort()) failCount++;
|
|
if (s.nextShort() != (short)17) failCount++;
|
|
if (!s.hasNextShort()) failCount++;
|
|
if (s.nextShort() != (short)22) failCount++;
|
|
if (!s.hasNextShort(16)) failCount++;
|
|
if (s.nextShort(16) != (short)14) failCount++;
|
|
if (!s.hasNextShort()) failCount++;
|
|
if (s.nextShort() != (short)-34) failCount++;
|
|
for (int i=0; i<4; i++) {
|
|
if (s.hasNextShort())
|
|
failCount++;
|
|
try {
|
|
s.nextShort();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct result
|
|
}
|
|
s.next();
|
|
}
|
|
try {
|
|
s.next();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
failCount++;
|
|
} catch (NoSuchElementException nse) {
|
|
// Correct result
|
|
}
|
|
report("Scan shorts");
|
|
}
|
|
|
|
private static void intTest(int sourceType) throws Exception {
|
|
Scanner s = scannerFor(
|
|
"22 022 C -34 0x80000000 -2147483649 dog ", sourceType);
|
|
if (!s.hasNextInt()) failCount++;
|
|
if (s.nextInt() != 22) failCount++;
|
|
if (!s.hasNextInt()) failCount++;
|
|
if (s.nextInt() != 22) failCount++;
|
|
if (!s.hasNextInt(16)) failCount++;
|
|
if (s.nextInt(16) != 12) failCount++;
|
|
if (!s.hasNextInt()) failCount++;
|
|
if (s.nextInt() != -34) failCount++;
|
|
for (int i=0; i<3; i++) {
|
|
if (s.hasNextInt())
|
|
failCount++;
|
|
try {
|
|
s.nextInt();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct result
|
|
}
|
|
s.next();
|
|
}
|
|
try {
|
|
s.next();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
failCount++;
|
|
} catch (NoSuchElementException nse) {
|
|
// Correct result
|
|
}
|
|
report("Scan ints");
|
|
}
|
|
|
|
private static void longTest(int sourceType) throws Exception {
|
|
Scanner s = scannerFor(
|
|
"022 9223372036854775807 0x8000000000000000 9223372036854775808 dog ",
|
|
sourceType);
|
|
if (!s.hasNextLong()) failCount++;
|
|
if (s.nextLong() != (long)22) failCount++;
|
|
if (!s.hasNextLong()) failCount++;
|
|
if (s.nextLong() != 9223372036854775807L) failCount++;
|
|
for (int i=0; i<3; i++) {
|
|
if (s.hasNextLong())
|
|
failCount++;
|
|
try {
|
|
s.nextLong();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct result
|
|
}
|
|
s.next();
|
|
}
|
|
try {
|
|
s.next();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
failCount++;
|
|
} catch (NoSuchElementException nse) {
|
|
// Correct result
|
|
}
|
|
report("Scan longs");
|
|
}
|
|
|
|
private static void floatTest(int sourceType) throws Exception {
|
|
Scanner s = scannerFor(
|
|
"0 0. 0.0 2 2. 2.0 2.3 -2 -2.0 -2.3 -. 2-. 2..3", sourceType);
|
|
if (!s.hasNextFloat()) failCount++;
|
|
if (s.nextFloat() != 0f) failCount++;
|
|
if (!s.hasNextFloat()) failCount++;
|
|
if (s.nextFloat() != 0f) failCount++;
|
|
if (!s.hasNextFloat()) failCount++;
|
|
if (s.nextFloat() != 0f) failCount++;
|
|
if (!s.hasNextFloat()) failCount++;
|
|
if (s.nextFloat() != 2f) failCount++;
|
|
if (!s.hasNextFloat()) failCount++;
|
|
if (s.nextFloat() != 2f) failCount++;
|
|
if (!s.hasNextFloat()) failCount++;
|
|
if (s.nextFloat() != 2f) failCount++;
|
|
if (!s.hasNextFloat()) failCount++;
|
|
if (s.nextFloat() != 2.3f) failCount++;
|
|
if (!s.hasNextFloat()) failCount++;
|
|
if (s.nextFloat() != -2f) failCount++;
|
|
if (!s.hasNextFloat()) failCount++;
|
|
if (s.nextFloat() != -2f) failCount++;
|
|
if (!s.hasNextFloat()) failCount++;
|
|
if (s.nextFloat() != -2.3f) failCount++;
|
|
for (int i=0; i<3; i++) {
|
|
if (s.hasNextLong())
|
|
failCount++;
|
|
try {
|
|
s.nextFloat();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct result
|
|
}
|
|
s.next();
|
|
}
|
|
try {
|
|
s.next();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
failCount++;
|
|
} catch (NoSuchElementException nse) {
|
|
// Correct result
|
|
}
|
|
report("Scan floats");
|
|
}
|
|
|
|
private static void doubleTest(int sourceType) throws Exception {
|
|
Scanner s = scannerFor(
|
|
"0 0. 0.0 2 2. 2.0 2.3 -2 -2.0 -2.3 -. 2-. 2..3", sourceType);
|
|
if (!s.hasNextDouble()) failCount++;
|
|
if (s.nextDouble() != 0d) failCount++;
|
|
if (!s.hasNextDouble()) failCount++;
|
|
if (s.nextDouble() != 0d) failCount++;
|
|
if (!s.hasNextDouble()) failCount++;
|
|
if (s.nextDouble() != 0d) failCount++;
|
|
if (!s.hasNextDouble()) failCount++;
|
|
if (s.nextDouble() != 2d) failCount++;
|
|
if (!s.hasNextDouble()) failCount++;
|
|
if (s.nextDouble() != 2d) failCount++;
|
|
if (!s.hasNextDouble()) failCount++;
|
|
if (s.nextDouble() != 2d) failCount++;
|
|
if (!s.hasNextDouble()) failCount++;
|
|
if (s.nextDouble() != 2.3d) failCount++;
|
|
if (!s.hasNextDouble()) failCount++;
|
|
if (s.nextDouble() != -2d) failCount++;
|
|
if (!s.hasNextDouble()) failCount++;
|
|
if (s.nextDouble() != -2d) failCount++;
|
|
if (!s.hasNextDouble()) failCount++;
|
|
if (s.nextDouble() != -2.3d) failCount++;
|
|
for (int i=0; i<3; i++) {
|
|
if (s.hasNextLong())
|
|
failCount++;
|
|
try {
|
|
s.nextDouble();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
// Correct result
|
|
}
|
|
s.next();
|
|
}
|
|
try {
|
|
s.next();
|
|
failCount++;
|
|
} catch (InputMismatchException ime) {
|
|
failCount++;
|
|
} catch (NoSuchElementException nse) {
|
|
// Correct result
|
|
}
|
|
report("Scan doubles");
|
|
}
|
|
|
|
private static void booleanTest(int sourceType) throws Exception {
|
|
Scanner s = scannerFor(
|
|
" true false\t \r\n true FaLse \n True Tru", sourceType);
|
|
if (!s.nextBoolean()) failCount++;
|
|
if (!s.hasNextBoolean()) failCount++;
|
|
if (s.nextBoolean()) failCount++;
|
|
if (!s.nextBoolean()) failCount++;
|
|
if (s.nextBoolean()) failCount++;
|
|
if (!s.nextBoolean()) failCount++;
|
|
if (s.hasNextBoolean()) failCount++;
|
|
try {
|
|
s.nextBoolean();
|
|
failCount++;
|
|
} catch (NoSuchElementException nsee) {
|
|
// Expected result
|
|
}
|
|
report("Scan booleans");
|
|
}
|
|
|
|
private static void hasNextTest(int sourceType) throws Exception {
|
|
Scanner s = scannerFor(
|
|
" blah blech\t blather alongblatherindeed", sourceType);
|
|
if (!s.hasNext()) failCount++;
|
|
if (!s.hasNext()) failCount++;
|
|
String result = s.next();
|
|
if (!result.equals("blah")) failCount++;
|
|
if (!s.hasNext()) failCount++;
|
|
if (!s.hasNext()) failCount++;
|
|
result = s.next();
|
|
if (!result.equals("blech")) failCount++;
|
|
if (!s.hasNext()) failCount++;
|
|
result = s.next();
|
|
if (!result.equals("blather")) failCount++;
|
|
if (!s.hasNext()) failCount++;
|
|
if (!s.hasNext()) failCount++;
|
|
result = s.next();
|
|
if (!result.equals("alongblatherindeed")) failCount++;
|
|
if (s.hasNext()) failCount++;
|
|
try {
|
|
result = s.next();
|
|
failCount++;
|
|
} catch (NoSuchElementException nsee) {
|
|
// Correct result
|
|
}
|
|
report("Has next test");
|
|
}
|
|
|
|
private static void nextTest(int sourceType) throws Exception {
|
|
Scanner s = scannerFor(
|
|
" blah blech\t blather alongblatherindeed", sourceType);
|
|
String result = (String)s.next();
|
|
if (!result.equals("blah")) failCount++;
|
|
result = (String)s.next();
|
|
if (!result.equals("blech")) failCount++;
|
|
result = (String)s.next();
|
|
if (!result.equals("blather")) failCount++;
|
|
result = (String)s.next();
|
|
if (!result.equals("alongblatherindeed"))
|
|
failCount++;
|
|
try {
|
|
result = (String)s.next();
|
|
failCount++;
|
|
} catch (NoSuchElementException nsee) {
|
|
// Correct result
|
|
}
|
|
report("Next test");
|
|
}
|
|
|
|
private static void hasNextPatternTest(int sourceType) throws Exception {
|
|
Scanner s = scannerFor(
|
|
" blah blech\t blather alongblatherindeed", sourceType);
|
|
Pattern p1 = Pattern.compile("\\w+");
|
|
Pattern p2 = Pattern.compile("blech");
|
|
if (!s.hasNext(p1)) failCount++;
|
|
if (!s.hasNext(p1)) failCount++;
|
|
if (s.hasNext(p2)) failCount++;
|
|
String result = (String)s.next();
|
|
if (!result.equals("blah")) failCount++;
|
|
if (!s.hasNext(p1)) failCount++;
|
|
if (!s.hasNext(p2)) failCount++;
|
|
result = (String)s.next();
|
|
if (!result.equals("blech")) failCount++;
|
|
if (!s.hasNext(p1)) failCount++;
|
|
if (s.hasNext(p2)) failCount++;
|
|
result = (String)s.next();
|
|
if (!result.equals("blather")) failCount++;
|
|
if (!s.hasNext(p1)) failCount++;
|
|
if (s.hasNext(p2)) failCount++;
|
|
result = (String)s.next();
|
|
if (!result.equals("alongblatherindeed")) failCount++;
|
|
if (s.hasNext(p1)) failCount++;
|
|
if (s.hasNext(p2)) failCount++;
|
|
report("Has Next Pattern test");
|
|
}
|
|
|
|
private static void nextPatternTest(int sourceType) throws Exception {
|
|
Scanner s = scannerFor(
|
|
" blah blech\t blather alongblatherindeed", sourceType);
|
|
Pattern p1 = Pattern.compile("blah");
|
|
Pattern p2 = Pattern.compile("blech");
|
|
Pattern p3 = Pattern.compile("blather");
|
|
Pattern p4 = Pattern.compile("alongblatherindeed");
|
|
String result = null;
|
|
try {
|
|
result = (String)s.next(p2);
|
|
failCount++;
|
|
} catch (NoSuchElementException nsee) {
|
|
// Correct result
|
|
}
|
|
result = (String)s.next(p1);
|
|
if (!result.equals("blah"))
|
|
failCount++;
|
|
try {
|
|
result = (String)s.next(p1);
|
|
failCount++;
|
|
} catch (NoSuchElementException nsee) {
|
|
// Correct result
|
|
}
|
|
result = (String)s.next(p2);
|
|
if (!result.equals("blech"))
|
|
failCount++;
|
|
try {
|
|
result = (String)s.next(p4);
|
|
failCount++;
|
|
} catch (NoSuchElementException nsee) {
|
|
// Correct result
|
|
}
|
|
result = (String)s.next(p3);
|
|
if (!result.equals("blather"))
|
|
failCount++;
|
|
try {
|
|
result = (String)s.next(p3);
|
|
failCount++;
|
|
} catch (NoSuchElementException nsee) {
|
|
// Correct result
|
|
}
|
|
result = (String)s.next(p4);
|
|
if (!result.equals("alongblatherindeed"))
|
|
failCount++;
|
|
try {
|
|
result = (String)s.next();
|
|
failCount++;
|
|
} catch (NoSuchElementException nsee) {
|
|
// Correct result
|
|
}
|
|
report("Next pattern test");
|
|
}
|
|
|
|
private static void useLocaleTest() throws Exception {
|
|
Scanner s = new Scanner("334.65").useLocale(Locale.ENGLISH);
|
|
if (!s.hasNextFloat()) failCount++;
|
|
if (s.nextFloat() != 334.65f) failCount++;
|
|
|
|
s = new Scanner("334,65").useLocale(Locale.FRENCH);
|
|
if (!s.hasNextFloat()) failCount++;
|
|
if (s.nextFloat() != 334.65f) failCount++;
|
|
|
|
s = new Scanner("4.334,65").useLocale(Locale.GERMAN);
|
|
if (!s.hasNextFloat()) failCount++;
|
|
if (s.nextFloat() != 4334.65f) failCount++;
|
|
|
|
// Test case reported from India
|
|
try {
|
|
String Message = "123978.90 $";
|
|
Locale locale = Locale.of("hi","IN");
|
|
NumberFormat form = NumberFormat.getInstance(locale);
|
|
double myNumber = 1902.09;
|
|
Scanner scanner = new Scanner(form.format(myNumber).toString());
|
|
scanner.useLocale(locale);
|
|
double d = scanner.nextDouble();
|
|
} catch (InputMismatchException ime) {
|
|
failCount++;
|
|
}
|
|
report("Use locale test");
|
|
}
|
|
|
|
public static void resetTest() throws Exception {
|
|
Scanner sc = new Scanner("");
|
|
int radix = sc.radix();
|
|
Locale locale = sc.locale();
|
|
Pattern delimiter = sc.delimiter();
|
|
Pattern a = Pattern.compile("A");
|
|
sc.useDelimiter(a);
|
|
Locale dummy = Locale.of("en", "US", "dummy");
|
|
sc.useLocale(dummy);
|
|
sc.useRadix(16);
|
|
if (sc.radix() != 16 ||
|
|
!sc.locale().equals(dummy) ||
|
|
!sc.delimiter().pattern().equals(a.pattern())) {
|
|
failCount++;
|
|
} else {
|
|
sc.reset();
|
|
if (sc.radix() != radix ||
|
|
!sc.locale().equals(locale) ||
|
|
!sc.delimiter().pattern().equals(delimiter.pattern())) {
|
|
failCount++;
|
|
}
|
|
}
|
|
sc.close();
|
|
report("Reset test");
|
|
}
|
|
|
|
static List<BiConsumer <Scanner, Integer>> methodWRList = Arrays.asList(
|
|
(s, r) -> s.hasNextByte(r),
|
|
(s, r) -> s.nextByte(r),
|
|
(s, r) -> s.hasNextShort(r),
|
|
(s, r) -> s.nextShort(r),
|
|
(s, r) -> s.hasNextInt(r),
|
|
(s, r) -> s.nextInt(r),
|
|
(s, r) -> s.hasNextLong(r),
|
|
(s, r) -> s.nextLong(r),
|
|
(s, r) -> s.hasNextBigInteger(r),
|
|
(s, r) -> s.nextBigInteger(r)
|
|
);
|
|
|
|
/*
|
|
* Test that setting the radix to an out of range value triggers
|
|
* an IllegalArgumentException
|
|
*/
|
|
public static void outOfRangeRadixTest() throws Exception {
|
|
int[] bad = new int[] { -1, 0, 1, 37, 38 };
|
|
int[] good = IntStream.rangeClosed(Character.MIN_RADIX, Character.MAX_RADIX)
|
|
.toArray();
|
|
|
|
methodWRList.stream().forEach( m -> {
|
|
for (int r : bad) {
|
|
try (Scanner sc = new Scanner("10 10 10 10")) {
|
|
m.accept(sc, r);
|
|
failCount++;
|
|
} catch (IllegalArgumentException ise) {}
|
|
}
|
|
});
|
|
methodWRList.stream().forEach( m -> {
|
|
for (int r : good) {
|
|
try (Scanner sc = new Scanner("10 10 10 10")) {
|
|
m.accept(sc, r);
|
|
} catch (Exception x) {
|
|
failCount++;
|
|
}
|
|
}
|
|
});
|
|
report("Radix out of range test");
|
|
}
|
|
|
|
/*
|
|
* Test that closing the stream also closes the underlying Scanner.
|
|
* The cases of attempting to open streams on a closed Scanner are
|
|
* covered by closeTest().
|
|
*/
|
|
public static void streamCloseTest() throws Exception {
|
|
Scanner sc;
|
|
|
|
Scanner sc1 = new Scanner("xyzzy");
|
|
sc1.tokens().close();
|
|
try {
|
|
sc1.hasNext();
|
|
failCount++;
|
|
} catch (IllegalStateException ise) {
|
|
// Correct result
|
|
}
|
|
|
|
Scanner sc2 = new Scanner("a b c d e f");
|
|
try {
|
|
sc2.tokens()
|
|
.peek(s -> sc2.close())
|
|
.count();
|
|
} catch (IllegalStateException ise) {
|
|
// Correct result
|
|
}
|
|
|
|
Scanner sc3 = new Scanner("xyzzy");
|
|
sc3.findAll("q").close();
|
|
try {
|
|
sc3.hasNext();
|
|
failCount++;
|
|
} catch (IllegalStateException ise) {
|
|
// Correct result
|
|
}
|
|
|
|
try (Scanner sc4 = new Scanner(inputFile)) {
|
|
sc4.findAll("[0-9]+")
|
|
.peek(s -> sc4.close())
|
|
.count();
|
|
failCount++;
|
|
} catch (IllegalStateException ise) {
|
|
// Correct result
|
|
}
|
|
|
|
report("Streams Close test");
|
|
}
|
|
|
|
/*
|
|
* Test ConcurrentModificationException
|
|
*/
|
|
public static void streamComodTest() {
|
|
try {
|
|
Scanner sc = new Scanner("a b c d e f");
|
|
sc.tokens()
|
|
.peek(s -> sc.hasNext())
|
|
.count();
|
|
failCount++;
|
|
} catch (ConcurrentModificationException cme) {
|
|
// Correct result
|
|
}
|
|
|
|
try {
|
|
Scanner sc = new Scanner("a b c d e f");
|
|
Iterator<String> it = sc.tokens().iterator();
|
|
it.next();
|
|
sc.next();
|
|
it.next();
|
|
failCount++;
|
|
} catch (ConcurrentModificationException cme) {
|
|
// Correct result
|
|
}
|
|
|
|
try {
|
|
String input = IntStream.range(0, 100)
|
|
.mapToObj(String::valueOf)
|
|
.collect(Collectors.joining(" "));
|
|
Scanner sc = new Scanner(input);
|
|
sc.findAll("[0-9]+")
|
|
.peek(s -> sc.hasNext())
|
|
.count();
|
|
failCount++;
|
|
} catch (ConcurrentModificationException cme) {
|
|
// Correct result
|
|
}
|
|
|
|
try {
|
|
String input = IntStream.range(0, 100)
|
|
.mapToObj(String::valueOf)
|
|
.collect(Collectors.joining(" "));
|
|
Scanner sc = new Scanner(input);
|
|
Iterator<MatchResult> it = sc.findAll("[0-9]+").iterator();
|
|
it.next();
|
|
sc.next();
|
|
it.next();
|
|
failCount++;
|
|
} catch (ConcurrentModificationException cme) {
|
|
// Correct result
|
|
}
|
|
|
|
report("Streams Comod test");
|
|
}
|
|
|
|
private static void report(String testName) {
|
|
System.err.printf("%-30s: %s%n", testName,
|
|
(failCount == 0) ? "Passed" : String.format("Failed(%d)", failCount));
|
|
|
|
if (failCount > 0)
|
|
failure = true;
|
|
failCount = 0;
|
|
}
|
|
|
|
static Scanner scannerFor(String input, int sourceType) {
|
|
if (sourceType == 1)
|
|
return new Scanner(input);
|
|
else
|
|
return new Scanner(new StutteringInputStream(input));
|
|
}
|
|
|
|
static class ThrowingReadable implements Readable {
|
|
ThrowingReadable() {
|
|
}
|
|
public int read(java.nio.CharBuffer cb) throws IOException {
|
|
throw new IOException("ThrowingReadable always throws");
|
|
}
|
|
}
|
|
}
|