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}