У меня есть программа, которая принимает входящий текст, преобразует его в тип Reader и возвращает следующий токен, будь то слово или пробел (не слово).Это не ведет себя, как ожидалось.
Чтобы быть как можно более конкретным, вот моя инфраструктура тестирования в Eclipse с использованием JUnit4:
@Test
public void testGetNextTokenWord() throws IOException {
Reader in = new StringReader("Aren't you \ntired");
TokenScanner d = new TokenScanner(in);
try {
assertTrue("has next", d.hasNext());
assertEquals("Aren't", d.next());
assertTrue("has next", d.hasNext());
assertEquals(" ", d.next());
assertTrue("has next", d.hasNext());
assertEquals("you", d.next());
assertTrue("has next", d.hasNext());
assertEquals(" \n", d.next());
assertTrue("has next", d.hasNext());
assertEquals("tired", d.next());
assertFalse("reached end of stream", d.hasNext());
} finally {
in.close();
}
}
Я опубликую полный код, чтобы облегчить помощь по этой проблеме, а затем опубликую ожидаемое и наблюдаемое поведение:
//Reads as much to determine hasNext() and next()
public TokenScanner(java.io.Reader in) throws IOException {
//Throw exception if null
if (in == null) {
throw new IllegalArgumentException();
}
//Read in token
try {
System.out.println("TokenScanner!");
//Create new token scanner for argued reader
this.tokenScanner = in;
//Read next character
ch = tokenScanner.read();
}
//Throw exception if error in reading
catch (IOException e){
ch = -1;
}
}
//Determines whether the argued character is a valid word character.
public static boolean isWordCharacter(int c) {
//Cast int character to a char
char character = (char)c;
//Return true if character is valid word character
if(Character.isLetter(character) || character == '\'') {
return true;
}
//Return false otherwise
return false;
}
//Determine whether another token is avaialble
public boolean hasNext() {
//Leverage invariant
return ch != -1 ;
}
И функция, из-за которой возникает много головной боли (потенциально)
//Determine next token
public String next() {
//End of stream reached
if(!hasNext()) {
throw new NoSuchElementException();
}
//Initialize variable to hold token
String word = "";
try {
//Character is a word character
while(isWordCharacter(ch)) {
word = word + (char)ch;
ch = tokenScanner.read();
}
//Character is a space
while(!Character.isWhitespace(ch)) {
word = word + (char)ch;
ch = tokenScanner.read();
}
System.out.println("Word is: "+ word);
return word;
}
//Exception catching
catch(Exception e) {
throw new NoSuchElementException();
}
}
Ожидаемый результат с учетом приведенной выше инфраструктуры тестирования:
TokenScanner!
Word is: Aren't
Word is: you
Word is: /*Not sure how to represent newline in output*/
Word is: tired
Фактический результат ниже:
TokenScanner!
Word is: Aren't
Word is:
Вопрос в том, почему это происходит?
Мой вывод показывает, что первыйТест на неудачу:
assertEquals(" ", d.next());
Фундаментальный вопрос здесь заключается в том, как я представляю не слова (пробелы).Последний тест также не проходит.Любая помощь здесь приветствуется!