// NewsMaker constructor and equals test, same name, no stories

NewsMaker newsMaker1 = new NewsMaker("Name1");
NewsMaker newsMaker2 = new NewsMaker("Name1");
if (newsMaker1.equals(newsMaker2)) {
  return true;
}
else {
  return false;
}


// NewsMaker constructor and equals test, same name, different stories

NewsMaker newsMaker1 = new NewsMaker("Name1");
NewsMaker newsMaker2 = new NewsMaker("Name1");
newsMaker2.addNewspaperStory(null);
if (newsMaker1.equals(newsMaker2)) {
  return true;
}
else {
  return false;
}


// NewsMaker constructor and equals test, different names

NewsMaker newsMaker1 = new NewsMaker("Name1");
NewsMaker newsMaker2 = new NewsMaker("Name2");
if (!newsMaker1.equals(newsMaker2)) {
  return true;
}
else {
  return false;
}


// NewsMaker constructor and getName test

NewsMaker newsMaker1 = new NewsMaker("Name1");
if ("Name1".equals(newsMaker1.getName())) {
  return true;
}
else {
  return false;
}


// NewsMaker addNewspaperStory and getNewspaperStories test, empty

NewsMaker newsMaker1 = new NewsMaker();
NewspaperStory newspaperStory1 = new NewspaperStory(null,null,0,null,null,null);
newsMaker1.addNewspaperStory(newspaperStory1);
NewspaperStoryList newspaperStoryList1 = newsMaker1.getNewspaperStories();
if (newspaperStory1.equals(newspaperStoryList1.get(0))) {
  return true;
}
else {
  return false;
}


// NewsMaker addNewspaperStory and getNewspaperStories test, not empty, not duplicate

NewsMaker newsMaker1 = new NewsMaker();
NewspaperStory newspaperStory1 = new NewspaperStory(null,null,0,null,null,null);
NewspaperStory newspaperStory2 = new NewspaperStory(null,null,1,null,null,null);
newsMaker1.addNewspaperStory(newspaperStory1);
newsMaker1.addNewspaperStory(newspaperStory2);

NewspaperStoryList newspaperStoryList1 = newsMaker1.getNewspaperStories();
int size = newspaperStoryList1.size();
for (int i = 0; i < size; i++) {
  if (newspaperStory1.equals(newspaperStoryList1.get(i))) {
    return true;
  }
}
return false;


// NewsMakerList contains test, empty

NewsMakerList newsMakerList1 = new NewsMakerList();
NewsMaker newsMaker1 = new NewsMaker();
if (newsMakerList1.contains(newsMaker1)) {
  return false;
}
else {
  return true;
}


// NewsMakerList contains test, non empty, not present

NewsMakerList newsMakerList1 = new NewsMakerList();
NewsMaker newsMaker1 = new NewsMaker();
newsMakerList1.add(newsMaker1);
NewsMaker newsMaker2 = new NewsMaker("NewsMakerName2");
if (newsMakerList1.contains(newsMaker2)) {
  return false;
}
else {
  return true;
}


// NewsMakerList add and contains test, empty

NewsMakerList newsMakerList1 = new NewsMakerList();
NewsMaker newsMaker1 = new NewsMaker();
newsMakerList1.add(newsMaker1);
if (newsMakerList1.contains(newsMaker1)) {
  return true;
}
else {
  return false;
}


// NewsMakerList add and contains test, non-empty, non-duplicate

NewsMakerList newsMakerList1 = new NewsMakerList();
NewsMaker newsMaker1 = new NewsMaker();
NewsMaker newsMaker2 = new NewsMaker("NewsMakerName2");
newsMakerList1.add(newsMaker1);
newsMakerList1.add(newsMaker2);
if (newsMakerList1.contains(newsMaker2)) {
  return true;
}
else {
  return false;
}


// NewsMakerList add test, non-empty, duplicate

NewsMakerList newsMakerList1 = new NewsMakerList();
NewsMaker newsMaker1 = new NewsMaker();
newsMakerList1.add(newsMaker1);
try {
  newsMakerList1.add(newsMaker1);
}
catch (IllegalArgumentException e) {
  return true;
}
return false;


// NewsMakerList get test, empty

NewsMakerList newsMakerList1 = new NewsMakerList();
NewsMaker newsMaker1 = new NewsMaker();
if (null == newsMakerList1.get(newsMaker1)) {
  return true;
}
else {
  return false;
}


// NewsMakerList add and get test, empty

NewsMakerList newsMakerList1 = new NewsMakerList();
NewsMaker newsMaker1 = new NewsMaker();
newsMakerList1.add(newsMaker1);
if (newsMaker1.equals(newsMakerList1.get(newsMaker1))) {
  return true;
}
else {
  return false;
}


// NewsMakerList get test, non empty, not found

NewsMakerList newsMakerList1 = new NewsMakerList();
NewsMaker newsMaker1 = new NewsMaker();
newsMakerList1.add(newsMaker1);
NewsMaker newsMaker2 = new NewsMaker("NewsMakerName2");
if (null == newsMakerList1.get(newsMaker2)) {
  return true;
}
else {
  return false;
}


// NewspaperStory constructor and getDate test

import java.time.LocalDate;

LocalDate date1 = LocalDate.of (1, 2, 3);
NewspaperStory newspaperStory1 = new NewspaperStory (date1, null, 321, null, null, null);
if (date1.equals(newspaperStory1.getDate())) {
  return true;
}
else {
  return false;
}


// NewspaperStory constructor and getNewspaperName test

NewspaperStory newspaperStory1 = new NewspaperStory (null, "NewspaperName1", 321, null, null, null);
if ("NewspaperName1".equals(newspaperStory1.getNewspaperName())) {
  return true;
}
else {
  return false;
}

// NewspaperStory constructor and getWordCount test

NewspaperStory newspaperStory1 = new NewspaperStory (null, null, 321, null, null, null);
if (321 == newspaperStory1.getWordCount()) {
  return true;
}
else {
  return false;
}


// NewspaperStory constructor and getTopic test

NewspaperStory newspaperStory1 = new NewspaperStory (null, null, 321, "Topic1", null, null);
if ("Topic1".equals(newspaperStory1.getTopic())) {
  return true;
}
else {
  return false;
}


// NewspaperStory constructor and getNewsMaker1 test

NewsMaker newsMaker1 = new NewsMaker ("NewsMakerName1");
NewspaperStory newspaperStory1 = new NewspaperStory (null, null, 321, null, newsMaker1, null);
if (newsMaker1.equals(newspaperStory1.getNewsMaker1())) {
  return true;
}
else {
  return false;
}


// NewspaperStory constructor and getNewsMaker2 test

NewsMaker newsMaker2 = new NewsMaker ("NewsMakerName2");
NewspaperStory newspaperStory1 = new NewspaperStory (null, null, 321, null, null, newsMaker2);
if (newsMaker2.equals(newspaperStory1.getNewsMaker2())) {
  return true;
}
else {
  return false;
}


// NewsPaperStoryList add and size test, empty

NewspaperStoryList newspaperStoryList1 = new NewspaperStoryList();
newspaperStoryList1.add(new NewspaperStory(null,null,0,null,null,null));
if (1 == newspaperStoryList1.size()) {
  return true;
}
else {
  return false;
}


// NewsPaperStoryList add and size test, not empty, not duplicate

NewspaperStoryList newspaperStoryList1 = new NewspaperStoryList();
newspaperStoryList1.add(new NewspaperStory(null,null,0,null,null,null));
newspaperStoryList1.add(new NewspaperStory(null,null,1,null,null,null));
if (2 == newspaperStoryList1.size()) {
  return true;
}
else {
  return false;
}


// NewsPaperStoryList add and get test, empty

NewspaperStoryList newspaperStoryList1 = new NewspaperStoryList();
NewspaperStory newspaperStory1 = new NewspaperStory(null,null,0,null,null,null);
newspaperStoryList1.add(newspaperStory1);
if (newspaperStory1.equals(newspaperStoryList1.get(0))) {
  return true;
}
else {
  return false;
}


// NewsPaperStoryList add, size, and get test, not empty, not duplicate

NewspaperStoryList newspaperStoryList1 = new NewspaperStoryList();
NewspaperStory newspaperStory1 = new NewspaperStory(null,null,0,null,null,null);
NewspaperStory newspaperStory2 = new NewspaperStory(null,null,1,null,null,null);
newspaperStoryList1.add(newspaperStory1);
newspaperStoryList1.add(newspaperStory2);

int size = newspaperStoryList1.size();
for (int i = 0; i < size; i++) {
  if (newspaperStory2.equals(newspaperStoryList1.get(i))) {
    return true;
  }
}
return false;





// readNoozFile test for throwing IOException

import java.io.IOException;

try {
    NewsMakerList newsmakerList = NoozFileProcessor.readNoozFile("Bogus Filename");
} catch (IOException e) {
    return true;
}
return false;


// readNoozFile test for not throwing IOException

import java.io.IOException;

try {
    NewsMakerList newsmakerList = NoozFileProcessor.readNoozFile("StoryData01");
} catch (IOException e) {
    return true;
}
return false;


// decodeDate test

import java.lang.reflect.Method;
import java.time.LocalDate;

LocalDate testDate = LocalDate.of(2000, 01, 02);
LocalDate returnedDate = null;

Class[] argClasses = { String.class };
Object[] argObjects = { "20000102" };
Method method;
try {
    method = NoozFileProcessor.class.getDeclaredMethod("decodeDate", argClasses);
    method.setAccessible(true);
    returnedDate = (LocalDate) method.invoke(null, argObjects);
}
catch (Exception e) {
    return false;
}

if (testDate.equals(returnedDate)) {
    return true;
}
else {
  return false;
}


// decodeNewspaper test

import java.lang.reflect.Method;

String returnedNewspaperName = "";

Class[] argClasses = { String.class };
Object[] argObjects = { "1" };
Method method;
try {
    method = NoozFileProcessor.class.getDeclaredMethod("decodeNewspaper", argClasses);
    method.setAccessible(true);
    returnedNewspaperName = (String) method.invoke(null, argObjects);
}
catch (Exception e) {
    return false;
}

if ("New York Times".equals(returnedNewspaperName)) {
    return true;
}
else {
  return false;
}


// decodeWordCount test

import java.lang.reflect.Method;

int returnedWordCount = 0;

Class[] argClasses = { String.class };
Object[] argObjects = { "1" };
Method method;
try {
    method = NoozFileProcessor.class.getDeclaredMethod("decodeWordCount", argClasses);
    method.setAccessible(true);
    returnedWordCount = (int) method.invoke(null, argObjects);
}
catch (Exception e) {
    return false;
}

if (1 == returnedWordCount) {
    return true;
}
else {
  return false;
}


// decodeTopic test

import java.lang.reflect.Method;

String returnedTopic = "";

Class[] argClasses = { String.class };
Object[] argObjects = { "1" };
Method method;
try {
    method = NoozFileProcessor.class.getDeclaredMethod("decodeTopic", argClasses);
    method.setAccessible(true);
    returnedTopic = (String) method.invoke(null, argObjects);
}
catch (Exception e) {
    return false;
}

if ("Government Agencies/Legislatures".equals(returnedTopic)) {
    return true;
}
else {
  return false;
}


// decodeNewsmakerName test, none, one

import java.lang.reflect.Method;

String returnedNewsMakerName = "";

Class[] argClasses = { String[].class, int.class };
String[] parts = { "DateString", "NewsPaperCode", "WordCountString", "TopicCode", "99", "NewsMakerName2" };
Object[] argObjects = { parts, 4 };
Method method;
try {
    method = NoozFileProcessor.class.getDeclaredMethod("decodeNewsmakerName", argClasses);
    method.setAccessible(true);
    returnedNewsMakerName = (String) method.invoke(null, argObjects);
}
catch (Exception e) {
  System.err.println("Exception: " + e);
    return false;
}

if ("None".equals(returnedNewsMakerName)) {
    return true;
}
else {
    return false;
}


// decodeNewsmakerName test, none, two

import java.lang.reflect.Method;

String returnedNewsMakerName = "";

Class[] argClasses = { String[].class, int.class };
String[] parts = { "DateString", "NewsPaperCode", "WordCountString", "TopicCode", "NewsMakerName2", "99" };
Object[] argObjects = { parts, 5 };
Method method;
try {
    method = NoozFileProcessor.class.getDeclaredMethod("decodeNewsmakerName", argClasses);
    method.setAccessible(true);
    returnedNewsMakerName = (String) method.invoke(null, argObjects);
}
catch (Exception e) {
  System.err.println("Exception: " + e);
    return false;
}

if ("None".equals(returnedNewsMakerName)) {
    return true;
}
else {
    return false;
}


// decodeNewsmakerName test, single, first

import java.lang.reflect.Method;

String returnedNewsMakerName = "";

Class[] argClasses = { String[].class, int.class };
String[] parts = { "DateString", "NewsPaperCode", "WordCountString", "TopicCode", "\"NewsMakerName1\"", "\"NewsMakerName2\"" };
Object[] argObjects = { parts, 4 };
Method method;
try {
    method = NoozFileProcessor.class.getDeclaredMethod("decodeNewsmakerName", argClasses);
    method.setAccessible(true);
    returnedNewsMakerName = (String) method.invoke(null, argObjects);
}
catch (Exception e) {
  System.err.println("Exception: " + e);
    return false;
}

if ("NewsMakerName1".equals(returnedNewsMakerName)) {
    return true;
}
else {
    return false;
}


// decodeNewsmakerName test, single, second

import java.lang.reflect.Method;

String returnedNewsMakerName = "";

Class[] argClasses = { String[].class, int.class };
String[] parts = { "DateString", "NewsPaperCode", "WordCountString", "TopicCode", "\"NewsMakerName1\"", "\"NewsMakerName2\"" };
Object[] argObjects = { parts, 5 };
Method method;
try {
    method = NoozFileProcessor.class.getDeclaredMethod("decodeNewsmakerName", argClasses);
    method.setAccessible(true);
    returnedNewsMakerName = (String) method.invoke(null, argObjects);
}
catch (Exception e) {
  System.err.println("Exception: " + e);
    return false;
}

if ("NewsMakerName2".equals(returnedNewsMakerName)) {
    return true;
}
else {
    return false;
}


// decodeNewsmakerName test, double, first

import java.lang.reflect.Method;

String returnedNewsMakerName = "";

Class[] argClasses = { String[].class, int.class };
String[] parts = { "DateString", "NewsPaperCode", "WordCountString", "TopicCode", "\"NewsMaker", " Name1\"", "\"NewsMakerName2\"" };
Object[] argObjects = { parts, 4 };
Method method;
try {
    method = NoozFileProcessor.class.getDeclaredMethod("decodeNewsmakerName", argClasses);
    method.setAccessible(true);
    returnedNewsMakerName = (String) method.invoke(null, argObjects);
}
catch (Exception e) {
  System.err.println("Exception: " + e);
    return false;
}

if ("NewsMaker, Name1".equals(returnedNewsMakerName)) {
    return true;
}
else {
    return false;
}


// decodeNewsmakerName test, double, second

import java.lang.reflect.Method;

String returnedNewsMakerName = "";

Class[] argClasses = { String[].class, int.class };
String[] parts = { "DateString", "NewsPaperCode", "WordCountString", "TopicCode", "\"NewsMaker", " Name1\"", "\"NewsMaker", " Name2\"" };
Object[] argObjects = { parts, 6 };
Method method;
try {
    method = NoozFileProcessor.class.getDeclaredMethod("decodeNewsmakerName", argClasses);
    method.setAccessible(true);
    returnedNewsMakerName = (String) method.invoke(null, argObjects);
}
catch (Exception e) {
  System.err.println("Exception: " + e);
    return false;
}

if ("NewsMaker, Name2".equals(returnedNewsMakerName)) {
    return true;
}
else {
    return false;
}


// convertToOutputFormat test

import java.lang.reflect.Method;
import java.time.LocalDate;

NewspaperStory newspaperStory = new NewspaperStory(LocalDate.of(2000, 12, 31), "Times of London", 20, "Interesting Topic", null, null);
String storyString = "December 31, 2000; Times of London; 20 words; Interesting Topic";
String returnedString = "";

Class[] argClasses = { NewspaperStory.class };
Object[] argObjects = { newspaperStory };
Method method;
try {
    method = UserInterface.class.getDeclaredMethod("convertToOutputFormat", argClasses);
    method.setAccessible(true);
    returnedString = (String) method.invoke(null, argObjects);
} catch (Exception e) {
    return false;
}

if (storyString.equals(returnedString)) {
    return true;
} else {
    return false;
}


// createListOfNewspaperStoriesForNewsmaker test

import java.time.LocalDate;

NewsMaker newsMaker1 = new NewsMaker("Interesting Person");
NewspaperStory newspaperStory1 = new NewspaperStory(LocalDate.of(2000, 12, 31), "Times of London", 20, "Interesting Topic", null, null);
newsMaker1.addNewspaperStory(newspaperStory1);

NewspaperStory newspaperStory2 = new NewspaperStory(LocalDate.of(2001, 1, 1), "LA Times", 6000, "Interesting Topic 2", null, null);
newsMaker1.addNewspaperStory(newspaperStory2);

String storyListString = "December 31, 2000; Times of London; 20 words; Interesting Topic"
        + "\nJanuary 1, 2001; LA Times; 6000 words; Interesting Topic 2"
        + "\nNumber of Stories: 2; Number of Newspapers: 2; Number of Words: 6020; Number of Topics: 2";

String returnedStoryList = UserInterface.createListOfNewspaperStoriesForNewsmaker(newsMaker1);

if (storyListString.equals(returnedStoryList)) {
    return true;
} else {
    return false;
}