001package edu.pdx.cs.joy.grader; 002 003import edu.pdx.cs.joy.ParserException; 004import edu.pdx.cs.joy.grader.gradebook.Student; 005import edu.pdx.cs.joy.grader.gradebook.XmlStudentParser; 006import org.junit.jupiter.api.Test; 007import org.junit.jupiter.api.io.TempDir; 008 009import java.io.*; 010 011import static org.hamcrest.MatcherAssert.assertThat; 012import static org.hamcrest.Matchers.*; 013 014public class SurveyTest { 015 @Test 016 void setNonEmptyValue() { 017 Student student = new Student("test"); 018 String nonEmptyFirstName = "firstName"; 019 020 Survey.setValueIfNotEmpty(nonEmptyFirstName, student::setFirstName); 021 022 assertThat(student.getFirstName(), equalTo(nonEmptyFirstName)); 023 } 024 025 @Test 026 void setNullValue() { 027 Student student = new Student("test"); 028 String nonNullValue = "nonNullValue"; 029 student.setFirstName(nonNullValue); 030 031 Survey.setValueIfNotEmpty(null, student::setFirstName); 032 033 assertThat(student.getFirstName(), equalTo(nonNullValue)); 034 } 035 036 @Test 037 void setEmptyValue() { 038 Student student = new Student("test"); 039 String nonEmptyValue = "nonEmptyValue"; 040 student.setFirstName(nonEmptyValue); 041 042 Survey.setValueIfNotEmpty("", student::setFirstName); 043 044 assertThat(student.getFirstName(), equalTo(nonEmptyValue)); 045 } 046 047 @Test 048 void longMessageIsBrokenInto80CharacterLines() { 049 String message = "This is a long sentence that contains more than 80 characters. " + 050 "Somewhere in here it should be broken into multiple lines of 80 characters each."; 051 052 String lines = Survey.breakUpInto80CharacterLines(message); 053 054 assertThat(lines, not(startsWith(" "))); 055 assertThat(lines, containsString("here\nit")); 056 } 057 058 @Test 059 void validEmailAddressIsValid() { 060 String address = "whitlocd@pdx.edu"; 061 assertThat(Survey.isEmailAddress(address), equalTo(true)); 062 } 063 064 @Test 065 void invalidEmailAddressIsInvalid() { 066 String address = "whitlock"; 067 assertThat(Survey.isEmailAddress(address), equalTo(false)); 068 } 069 070 @Test 071 void invalidJavaIdentifierIsInvalid() { 072 String id = "123"; 073 assertThat(Survey.isJavaIdentifier(id), equalTo(false)); 074 } 075 076 @Test 077 void validJavaIdentifierIsValid() { 078 String id = "whitlock123"; 079 assertThat(Survey.isJavaIdentifier(id), equalTo(true)); 080 } 081 082 @Test 083 void successfulSurveyWritesStudentXmlFile(@TempDir File tempDir) throws IOException, ParserException { 084 String firstName = "First name"; 085 String lastName = "Last name"; 086 String nickName = "Nick name"; 087 String loginId = "LoginId"; 088 String email = "email@pdx.edu"; 089 String major = "Major"; 090 String section = "u"; 091 String recordGitHubUserName = "y"; 092 String learn = "A lot"; 093 String anythingElse = "Nope"; 094 String verify = "y"; 095 096 String gitHubUserName = "GitHubUserName"; 097 098 InputStream in = getInputStreamWithLinesOfText(firstName, lastName, nickName, loginId, email, major, section, recordGitHubUserName, learn, anythingElse, verify); 099 createGitConfigWithUserName(tempDir, gitHubUserName); 100 101 TextCapturingOutputStream stdOut = new TextCapturingOutputStream(); 102 Survey survey = new Survey(stdOut.getPrintStream(), new TextCapturingOutputStream().getPrintStream(), in, tempDir, tempDir); 103 survey.takeSurvey("-noEmail"); 104 105 String writtenToStdOut = stdOut.getTextThatWasOutput(); 106 assertThat(writtenToStdOut, containsString("GitHub User Name: " + gitHubUserName)); 107 108 File xmlFile = new File(tempDir, Survey.STUDENT_XML_FILE_NAME); 109 XmlStudentParser parser = new XmlStudentParser(xmlFile); 110 Student student = parser.parseStudent(); 111 112 assertThat(student.getFirstName(), equalTo(firstName)); 113 assertThat(student.getLastName(), equalTo(lastName)); 114 assertThat(student.getNickName(), equalTo(nickName)); 115 assertThat(student.getId(), equalTo(loginId)); 116 assertThat(student.getEmail(), equalTo(email)); 117 assertThat(student.getMajor(), equalTo(major)); 118 assertThat(student.getEnrolledSection(), equalTo(Student.Section.UNDERGRADUATE)); 119 assertThat(student.getGitHubUserName(), equalTo(gitHubUserName)); 120 } 121 122 private void createGitConfigWithUserName(File tempDir, String gitHubUserName) throws IOException { 123 File dotGit = new File(tempDir, ".git"); 124 assertThat(dotGit.mkdir(), is(true)); 125 File config = new File(dotGit, "config"); 126 127 try (PrintWriter pw = new PrintWriter(new FileWriter(config))) { 128 pw.println("[core]\n" + 129 "\trepositoryformatversion = 0\n" + 130 "\tfilemode = true\n" + 131 "\tbare = false\n" + 132 "\tlogallrefupdates = true\n" + 133 "\tignorecase = true\n" + 134 "\tprecomposeunicode = true\n" + 135 "[remote \"origin\"]\n" + 136 "\turl = git@github.com:" + gitHubUserName + "/JoyOfCoding.git\n" + 137 "\tfetch = +refs/heads/*:refs/remotes/origin/*\n" + 138 "[branch \"main\"]\n" + 139 "\tremote = origin\n" + 140 "\tmerge = refs/heads/main\n"); 141 pw.flush(); 142 } 143 } 144 145 private InputStream getInputStreamWithLinesOfText(String... lines) { 146 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 147 PrintWriter pw = new PrintWriter(baos, true); 148 for (String line : lines) { 149 pw.println(line); 150 } 151 byte[] bytes = baos.toByteArray(); 152 return new ByteArrayInputStream(bytes); 153 } 154 155 private static class TextCapturingOutputStream { 156 private final ByteArrayOutputStream captured = new ByteArrayOutputStream(); 157 158 public PrintStream getPrintStream() { 159 return new PrintStream(captured); 160 } 161 162 String getTextThatWasOutput() { 163 return captured.toString(); 164 } 165 } 166 167 @Test 168 void emailAddressIsPdxDotEdu() { 169 Student student = new Student("id"); 170 student.setEmail("student@pdx.edu"); 171 assertThat(Survey.hasPdxDotEduEmail(student), equalTo(true)); 172 } 173 174 @Test 175 void emailAddressIsNotPdxDotEdu() { 176 Student student = new Student("id"); 177 student.setEmail("student@gmail.com"); 178 assertThat(Survey.hasPdxDotEduEmail(student), equalTo(false)); 179 } 180 181}