Итак, у меня есть этот текстовый файл, содержащий несколько однострочных слов, которые я хочу добавить в свой массив. Но так или иначе тесты JUnit продолжают терпеть неудачу. Любые идеи о том, как я могу это исправить? Переменная numberOfWords уже была объявлена и ей присвоено значение.
public void addWordsToArray(String fileName) {
loadWords(fileName);
String[] words = new String[numberOfWords];
for (int i = 0; i < numberOfWords; i++) {
words[i] = iter.next(); } }
----- Полный файл представлен ниже. Также поделюсь тестами -------------
public class Words {
ArrayList<String> wordList; // All the words
Iterator<String> iter; // iterator for the wordlist
int numberOfWords; // number of words in the file
String[] words; // this array holds your words
public Words() {
wordList = new ArrayList<>();
// iter = wordList.iterator();
}
/**
* This method loads the words from a given file
*
* @param fileName
* input file name
*/
private void loadWords(String fileName) {
wordList.clear();
numberOfWords = 0;
// This will reference one line at a time
String line = null;
int count = 0;
try {
// FileReader reads text files in the default encoding.
FileReader fileReader = new FileReader(fileName);
// Always wrap FileReader in BufferedReader.
BufferedReader bufferedReader = new BufferedReader(fileReader);
while ((line = bufferedReader.readLine()) != null) {
wordList.add(line.toLowerCase());
count++;
}
// Always close files.
bufferedReader.close();
numberOfWords = count;
iter = wordList.iterator();
} catch (FileNotFoundException ex) {
System.out.println("Unable to open file '" + fileName + "'");
} catch (IOException ex) {
System.out.println("Error reading file '" + fileName + "'");
}
}
public String getWord(int index) {
if (index < 0 || index >= numberOfWords) {
return null;
}
return words[index];
}
/**
* This method adds all the words to an array called words
*
* variable numberOfWords is already declared and has value and contains number
* of words
*
* @param fileName:
* input file name
*/
public void addWordsToArray(String fileName) {
loadWords(fileName); // DO NOT CHANGE
String[] words = new String[numberOfWords];
for (int i = 0; i < numberOfWords; i++) {
words[i] = iter.next();
// variable numberOfWords has the number of words
// TODO
// String[] words has been declared. Now instantiate the array to the words
// array size is equal to the number of words
}
// words = null;
// TO DO
/**
* Calling iter.next() will return the next word in the file. For examples
* String w = iter.next(); iter.next() always gives a next word
*/
// TO DO
// Add all word into the array words
}
/**
*
* @param word:
* input
* @return true if the given word exits in the words array. False otherwise
*/
public boolean contains(String word) {
for (String wordz : wordList) {
if (wordz.contains(word)) {
return true;
}
}
return false;
}
/**
*
* @param sentence:
* input sentence
* @return true if every word in the sentence exists in your words array. False
* otherwise.
*/
public boolean containsSentence(String sentence) {
String[] sp = sentence.split(" ");
for (String wordz : wordList) {
if (wordz.equals(sp)) {
return true;
}
}
return false;
}
/**
* reverse a sentence
*
* @param sentence:
* input sentence
* @return reversed sentence. For example: input: "i love you" return: "you love
* i" (hint: trim leading and trailing spaces")
*/
public String reverseSentence(String sentence) {
// if(sentence == null || sentence.length()==0) {
// return sentence;
// }
String[] sp = sentence.split(" ");
StringBuilder sb = new StringBuilder();
for (int i = sp.length - 1; i >= 0; i--) {
sb.append(sp[i]);
sb.append(" ");
}
return sb.toString().trim();
}
/**
*
* @param word:
* input word
* @return the number of occurrences of the word . If the word does not exist,
* return 0
*/
public int count(String word) {
int count = 0;
for (String wordz : wordList) {
if (wordz.equalsIgnoreCase(word)) {
count++;
// return count++;
}
}
return count;
}
/**
*
* @param word1:
* input word
* @param word2:
* input word
* @return true if all letters from word1 exist in word2, and all letters from
* word2 exist in word1.
*/
public boolean anagram(String word1, String word2) {
String sw1 = word1.replaceAll("\\s", "");
String sw2 = word2.replaceAll("\\s", "");
boolean check = true;
char[] w1 = sw1.toLowerCase().toCharArray();
char[] w2 = sw2.toLowerCase().toCharArray();
Arrays.sort(w1);
Arrays.sort(w2);
if (sw1.length() != sw2.length()) {
return false;
} else {
check = Arrays.equals(w1, w2);
}
if (check) {
return true;
} else
return false;
}
/**
*
*
* @param word:
* input word
* @param fileName:
* input file name
*
* PRINT all words that are the anagrams to the word input within
* words array
*
*/
public void findAnagram(String word, String fileName) {
addWordsToArray(fileName); // DO NOT CHANGE
}}
}
------ Тесты: ------------
import static org.junit.Assert.*;
import java.io.ByteArrayOutputStream;
import java.io.File;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import words.Words;
public class PublicTests {
Words w;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
w = new Words();
}
@After
public void tearDown() throws Exception {
}
@Test
public void testaddWordsToArray1() {
w.addWordsToArray("common_names.txt");
String result = w.getWord(4);
String expected = "william";
assertEquals(expected,result);
}
@Test
public void testaddWordsToArray2() {
w.addWordsToArray("names.txt");
String result = w.getWord(2);
String expected = "akbar";
assertEquals(expected,result);
}
@Test
public void testContains1() {
w.addWordsToArray("names.txt");
boolean result = w.contains("akbar");
assertTrue(result);
}
@Test
public void testContains2() {
w.addWordsToArray("names.txt");
boolean result = w.contains("administration");
assertFalse(result);
}
@Test
public void testContains3() {
w.addWordsToArray("1000words.txt");
boolean result = w.contains("administration");
assertTrue(result);
}
@Test
public void testContainsSentence1() {
w.addWordsToArray("1000words.txt");
boolean result = w.containsSentence("i buy book");
assertTrue(result);
}
@Test
public void testContainsSentence2() {
w.addWordsToArray("1000words.txt");
boolean result = w.containsSentence("i love you");
assertTrue(result);
}
@Test
public void testContainsSentence3() {
w.addWordsToArray("1000words.txt");
boolean result = w.containsSentence("she loves me");
assertFalse(result);
}
@Test
public void testReverseSentence1() {
String result = w.reverseSentence("i love you");
String expected = "you love i";
assertEquals(expected, result);
}
@Test
public void testReverseSentence2() {
String result = w.reverseSentence("maria");
String expected = "maria";
assertEquals(expected, result);
}
@Test
public void testReverseSentence3() {
String result = w.reverseSentence("cybertek school");
String expected = "school cybertek";
assertEquals(expected, result);
}
@Test
public void testCount1() {
w.addWordsToArray("test1.txt");
int result = w.count("abcd");
int expected = 2;
assertEquals(expected,result);
}
@Test
public void testCount2() {
w.addWordsToArray("test1.txt");
int result = w.count("bbcc");
int expected = 1;
assertEquals(expected,result);
}
@Test
public void testCount3() {
w.addWordsToArray("names.txt");
int result = w.count("trump");
int expected = 0;
assertEquals(expected,result);
}
@Test
public void testAnagram1() {
boolean result = w.anagram("abcd", "bcda");
assertTrue(result);
}
@Test
public void testAnagram2() {
boolean result = w.anagram("bbd", "ddb");
assertTrue(result);
}
@Test
public void testAnagram3() {
boolean result = w.anagram("abcd", "aadb");
assertFalse(result);
}
@Test
public void testFindAnagram1() throws Exception, Throwable{
runProgramWithInput("abcd", "test1.txt");
}
@Test
public void testFindAnagram2() throws Exception, Throwable{
runProgramWithInput("save", "1000words.txt");
}
/**
* Executes a run of the OrdersProcessor program by reading the data
* in the specified file using input redirection. The file inputFileName
* has the item's data file, whether multiple threads will be used,
* number of orders, base file name for the orders, and the
* result file name.
*
* @param inputFilename
* @throws Exception
* @throws Throwable
*/
private void runProgramWithInput(String word, String inputFilename) throws Exception, Throwable {
/* Retrieving the name of the results file */
String filename="";
int i = inputFilename.lastIndexOf('.');
if (i > 0) {
filename = inputFilename.substring(0,i);
}
String resultsFilename = filename + "_out.txt";
String officialResultsFilename = filename + "_expected.txt";
/* Deleting results file (in case it exists) */
File file = new File(resultsFilename);
file.delete();
/* Actual execution of the test by using input redirection and calling
/* OrdersProcessor.main(null) */
TestingSupport.redirectStandardInputTo(inputFilename);
ByteArrayOutputStream b = TestingSupport.redirectStandardOutputToByteArrayStream();
w.findAnagram(word, inputFilename);
String output = b.toString();
TestingSupport.writeToFile(resultsFilename, output);
/* Checking if we got the right results */
assertTrue(TestingSupport.sameContents(resultsFilename, officialResultsFilename));
}
}
-.------