package turin.relations;
import org.junit.Test;
import static org.junit.Assert.*;
public class OneToManyRelationTest {
@Test
public void settingALinkTheTeacherIsSet() {
Course math1 = new Course(100, "Math I");
Course math2 = new Course(101, "Math II");
Course eco1 = new Course(200, "Economics I");
Professor prof1 = new Professor("Abraham");
Professor prof2 = new Professor("James");
Teaching.RELATION.link(prof1, math1);
Teaching.RELATION.link(prof1, math2);
Relation.ReferenceSingleEndpoint<Professor,Course> teacherOfMath1 = Teaching.getTeacherOf(math1);
Relation.ReferenceSingleEndpoint<Professor,Course> teacherOfMath2 = Teaching.getTeacherOf(math2);
Relation.ReferenceSingleEndpoint<Professor,Course> teacherOfEco1 = Teaching.getTeacherOf(eco1);
assertEquals(true, teacherOfMath1.isPresent());
assertEquals("Abraham", teacherOfMath1.get().getName());
assertEquals(true, teacherOfMath2.isPresent());
assertEquals("Abraham", teacherOfMath2.get().getName());
assertEquals(false, teacherOfEco1.isPresent());
}
@Test
public void settingALinkTheCoursesAreSet() {
Course math1 = new Course(100, "Math I");
Course math2 = new Course(101, "Math II");
Course eco1 = new Course(200, "Economics I");
Professor prof1 = new Professor("Abraham");
Professor prof2 = new Professor("James");
Teaching.RELATION.link(prof1, math1);
Teaching.RELATION.link(prof1, math2);
Relation.ReferenceMultipleEndpoint coursesTaughtByAbraham = Teaching.coursesTaughtBy(prof1);
Relation.ReferenceMultipleEndpoint coursesTaughtByJames = Teaching.coursesTaughtBy(prof2);
assertEquals(2, coursesTaughtByAbraham.size());
assertEquals(true, coursesTaughtByAbraham.contains(math1));
assertEquals(true, coursesTaughtByAbraham.contains(math2));
assertEquals(false, coursesTaughtByAbraham.contains(eco1));
assertEquals(0, coursesTaughtByJames.size());
assertEquals(false, coursesTaughtByJames.contains(math1));
assertEquals(false, coursesTaughtByJames.contains(math2));
assertEquals(false, coursesTaughtByJames.contains(eco1));
}
@Test
public void aLinkCanReplaceThePreviousProfessor() {
Course math1 = new Course(100, "Math I");
Course math2 = new Course(101, "Math II");
Course eco1 = new Course(200, "Economics I");
Professor prof1 = new Professor("Abraham");
Professor prof2 = new Professor("James");
Teaching.RELATION.link(prof1, math1);
Teaching.RELATION.link(prof2, math1);
Relation.ReferenceMultipleEndpoint coursesTaughtByAbraham = Teaching.coursesTaughtBy(prof1);
Relation.ReferenceMultipleEndpoint coursesTaughtByJames = Teaching.coursesTaughtBy(prof2);
assertEquals(0, coursesTaughtByAbraham.size());
assertEquals(false, coursesTaughtByAbraham.contains(math1));
assertEquals(false, coursesTaughtByAbraham.contains(math2));
assertEquals(false, coursesTaughtByAbraham.contains(eco1));
assertEquals(1, coursesTaughtByJames.size());
assertEquals(true, coursesTaughtByJames.contains(math1));
assertEquals(false, coursesTaughtByJames.contains(math2));
assertEquals(false, coursesTaughtByJames.contains(eco1));
Relation.ReferenceSingleEndpoint<Professor,Course> teacherOfMath1 = Teaching.getTeacherOf(math1);
assertEquals(true, teacherOfMath1.isPresent());
assertEquals("James", teacherOfMath1.get().getName());
}
@Test
public void usingSubsetsDoNotMessUpReferencesEndpoints() {
Course math1 = new Course(100, "Math I");
Course math2 = new Course(101, "Math II");
Course eco1 = new Course(200, "Economics I");
Course info1 = new Course(300, "Info I");
Course info2 = new Course(301, "Info II");
Professor prof1 = new Professor("Abraham");
Professor prof2 = new Professor("James");
Subset abrahamTeach1stSemester = Teaching.RELATION.newBSubset();
Subset abrahamTeach2ndSemester = Teaching.RELATION.newBSubset();
Subset jamesTeach1stSemester = Teaching.RELATION.newBSubset();
Subset jamesTeach2ndSemester = Teaching.RELATION.newBSubset();
Teaching.RELATION.link(prof1, math1, abrahamTeach1stSemester);
Teaching.RELATION.link(prof1, math2, abrahamTeach2ndSemester);
Teaching.RELATION.link(prof2, eco1, jamesTeach2ndSemester);
Relation.ReferenceMultipleEndpoint coursesTaughtByAbraham = Teaching.coursesTaughtBy(prof1);
Relation.ReferenceMultipleEndpoint coursesTaughtByJames = Teaching.coursesTaughtBy(prof2);
assertEquals(2, coursesTaughtByAbraham.size());
assertEquals(true, coursesTaughtByAbraham.contains(math1));
assertEquals(true, coursesTaughtByAbraham.contains(math2));
assertEquals(false, coursesTaughtByAbraham.contains(eco1));
assertEquals(1, coursesTaughtByJames.size());
assertEquals(false, coursesTaughtByJames.contains(math1));
assertEquals(false, coursesTaughtByJames.contains(math2));
assertEquals(true, coursesTaughtByJames.contains(eco1));
Relation.ReferenceSingleEndpoint<Professor,Course> teacherOfMath1 = Teaching.getTeacherOf(math1);
Relation.ReferenceSingleEndpoint<Professor,Course> teacherOfMath2 = Teaching.getTeacherOf(math2);
Relation.ReferenceSingleEndpoint<Professor,Course> teacherOfEco1 = Teaching.getTeacherOf(eco1);
Relation.ReferenceSingleEndpoint<Professor,Course> teacherOfInfo1 = Teaching.getTeacherOf(info1);
Relation.ReferenceSingleEndpoint<Professor,Course> teacherOfInfo2 = Teaching.getTeacherOf(info2);
assertEquals(true, teacherOfMath1.isPresent());
assertEquals("Abraham", teacherOfMath1.get().getName());
assertEquals(true, teacherOfMath1.isPresent());
assertEquals("Abraham", teacherOfMath1.get().getName());
assertEquals(true, teacherOfMath1.isPresent());
assertEquals("James", teacherOfEco1.get().getName());
assertEquals(false, teacherOfInfo1.isPresent());
assertEquals(false, teacherOfInfo2.isPresent());
}
@Test
public void subsetsAreDistinct() {
Course math1 = new Course(100, "Math I");
Course math2 = new Course(101, "Math II");
Course eco1 = new Course(200, "Economics I");
Course info1 = new Course(300, "Info I");
Course info2 = new Course(301, "Info II");
Professor prof1 = new Professor("Abraham");
Professor prof2 = new Professor("James");
Subset abrahamTeach1stSemester = Teaching.RELATION.newBSubset();
Subset abrahamTeach2ndSemester = Teaching.RELATION.newBSubset();
Subset jamesTeach1stSemester = Teaching.RELATION.newBSubset();
Subset jamesTeach2ndSemester = Teaching.RELATION.newBSubset();
Teaching.RELATION.link(prof1, math1, abrahamTeach1stSemester);
Teaching.RELATION.link(prof1, math2, abrahamTeach2ndSemester);
Teaching.RELATION.link(prof2, eco1, jamesTeach2ndSemester);
Relation.ReferenceMultipleEndpoint coursesTaughtByAbraham1stSemester = Teaching.subsetOfCoursesTaughtBy(prof1, abrahamTeach1stSemester);
Relation.ReferenceMultipleEndpoint coursesTaughtByAbraham2ndSemester = Teaching.subsetOfCoursesTaughtBy(prof1, abrahamTeach2ndSemester);
Relation.ReferenceMultipleEndpoint coursesTaughtByJames1stSemester = Teaching.subsetOfCoursesTaughtBy(prof2, jamesTeach1stSemester);
Relation.ReferenceMultipleEndpoint coursesTaughtByJames2ndSemester = Teaching.subsetOfCoursesTaughtBy(prof2, jamesTeach2ndSemester);
assertEquals(1, coursesTaughtByAbraham1stSemester.size());
assertEquals(true, coursesTaughtByAbraham1stSemester.contains(math1));
assertEquals(false, coursesTaughtByAbraham1stSemester.contains(math2));
assertEquals(false, coursesTaughtByAbraham1stSemester.contains(eco1));
assertEquals(1, coursesTaughtByAbraham2ndSemester.size());
assertEquals(false, coursesTaughtByAbraham2ndSemester.contains(math1));
assertEquals(true, coursesTaughtByAbraham2ndSemester.contains(math2));
assertEquals(false, coursesTaughtByAbraham2ndSemester.contains(eco1));
assertEquals(0, coursesTaughtByJames1stSemester.size());
assertEquals(false, coursesTaughtByJames1stSemester.contains(math1));
assertEquals(false, coursesTaughtByJames1stSemester.contains(math2));
assertEquals(false, coursesTaughtByJames1stSemester.contains(eco1));
assertEquals(1, coursesTaughtByJames2ndSemester.size());
assertEquals(false, coursesTaughtByJames2ndSemester.contains(math1));
assertEquals(false, coursesTaughtByJames2ndSemester.contains(math2));
assertEquals(true, coursesTaughtByJames2ndSemester.contains(eco1));
}
}