001package edu.pdx.cs.joy.grader;
002
003import edu.pdx.cs.joy.grader.GenerateStudentInitialsFile.StudentInitials;
004import edu.pdx.cs.joy.grader.gradebook.Student;
005import org.junit.jupiter.api.Test;
006
007import java.util.Iterator;
008import java.util.List;
009import java.util.SortedSet;
010import java.util.stream.Stream;
011
012import static org.hamcrest.MatcherAssert.assertThat;
013import static org.hamcrest.Matchers.equalTo;
014import static org.hamcrest.Matchers.hasSize;
015
016public class GenerateStudentInitialsFileTest {
017
018  @Test
019  void generatedInitialsAreSortedByLastNameInitial() {
020    Stream<Student> students = Stream.of(
021      new Student("larry").setFirstName("Larry").setLastName("Smith"),
022    new Student("zoe").setFirstName("Zoe").setLastName("Adams"),
023      new Student("alice").setFirstName("Alice").setLastName("Smith")
024    );
025
026    List<String> initials = GenerateStudentInitialsFile.generateInitials(students);
027
028    assertThat(initials, hasSize(3));
029
030    Iterator<String> iterator = initials.iterator();
031    assertThat(iterator.next(), equalTo("ZA"));
032    assertThat(iterator.next(), equalTo("AS"));
033    assertThat(iterator.next(), equalTo("LS"));
034  }
035
036  @Test
037  void onlyFirstLetterOfNameIsCapitalized() {
038    StudentInitials initials = new StudentInitials(new Student("test").setFirstName("Aa").setLastName("Bb"));
039    initials.incrementUniqueCharsOfFirstName();
040    assertThat(initials.getInitials(), equalTo("AaB"));
041    initials.incrementUniqueCharsOfLastName();
042    assertThat(initials.getInitials(), equalTo("AaBb"));
043  }
044
045  @Test
046  void compareStudentInitials() {
047    StudentInitials first = new StudentInitials(new Student("first").setFirstName("A").setLastName("A"));
048    StudentInitials second = new StudentInitials(new Student("second").setFirstName("A").setLastName("B"));
049    assertThat(first.compareTo(second), equalTo(-1));
050    assertThat(second.compareTo(first), equalTo(1));
051    assertThat(first.getInitials(), equalTo("AA"));
052    assertThat(second.getInitials(), equalTo("AB"));
053
054    first = new StudentInitials(new Student("first").setFirstName("A").setLastName("Aa"));
055    second = new StudentInitials(new Student("second").setFirstName("A").setLastName("Ab"));
056    assertThat(first.compareTo(second), equalTo(-1));
057    assertThat(second.compareTo(first), equalTo(1));
058    assertThat(first.getInitials(), equalTo("AAa"));
059    assertThat(second.getInitials(), equalTo("AAb"));
060  }
061
062  @Test
063  void useMoreCharactersWhenInitialsMatch() {
064    Stream<Student> students = Stream.of(
065      new Student("zoe").setFirstName("Zoe").setLastName("Adams"),
066      new Student("zelda").setFirstName("Zelda").setLastName("Adams"),
067      new Student("larry").setFirstName("Larry").setLastName("Johnson"),
068      new Student("larry").setFirstName("Larry").setLastName("Jones")
069    );
070
071    List<String> initials = GenerateStudentInitialsFile.generateInitials(students);
072
073    assertThat(initials, hasSize(4));
074
075    Iterator<String> iterator = initials.iterator();
076    assertThat(iterator.next(), equalTo("ZeAd"));
077    assertThat(iterator.next(), equalTo("ZoAd"));
078    assertThat(iterator.next(), equalTo("LaJoh"));
079    assertThat(iterator.next(), equalTo("LaJon"));
080
081  }
082
083}