Added a test to verify that the match algorithm considers availability (both per project class and "total availability")and "project class" when sorting matches according to relevance.
This commit is contained in:
parent
06a2afff12
commit
0595121bc9
@ -468,62 +468,162 @@ public class TestGreedyMatchingAlgorithm {
|
||||
}
|
||||
|
||||
|
||||
// We now perform three tests to verify the correctness of the method GreedyMatchingAlgorithm # Pair # compareTo,
|
||||
// which sorts the list of matches, i. e. Pairs according to specific criterias
|
||||
@Test
|
||||
@Transactional
|
||||
@Rollback
|
||||
/* test that the supervisor who has the highest total slot available will be chosen */
|
||||
public void testHighestAvailableSlot() {
|
||||
/* 1.
|
||||
* ==================================================================================
|
||||
*
|
||||
* Prerequisites: two supervisors are matched against one bachelor project idea,
|
||||
* both supervisors have the SAME "total availability" (9)
|
||||
* and they both have a calculated match of 10 points,
|
||||
*
|
||||
* Tests: in the first test we verify that "henrikH" is found, because "davidH"
|
||||
* has less availability slots (4) for bachelor project ideas
|
||||
*
|
||||
* */
|
||||
public void testDavidH_Has_Less_Available_Slots_For_Bachelor() {
|
||||
List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>();
|
||||
List<Employee> supervisorList = new ArrayList<Employee>();
|
||||
Employee davidH = createEmployee("David", "Hallberg", languages);
|
||||
supervisorAvailability.add(new Availability(davidH, 1L, 5, bachelorProjectClass));
|
||||
supervisorAvailability.add(new Availability(davidH, 0L, 5, masterProjectClass));
|
||||
|
||||
Employee henrikH = createEmployee("Henrik", "Hansson", languages);
|
||||
supervisorAvailability.add(new Availability(henrikH, 2L, 3, bachelorProjectClass)); // total slot = 2
|
||||
supervisorAvailability.add(new Availability(henrikH, 3L, 4, masterProjectClass));
|
||||
supervisorAvailability.add(new Availability(davidH, 1L, 1, bachelorProjectClass)); // total slot = 1
|
||||
supervisorAvailability.add(new Availability(davidH, 0L, 1, masterProjectClass));
|
||||
unmatchedProjectIdeas.add(masterProjectIdea);
|
||||
unmatchedProjectIdeas.add(bachelorProjectIdea);
|
||||
supervisorAvailability.add(new Availability(henrikH, 0L, 5, bachelorProjectClass));
|
||||
supervisorAvailability.add(new Availability(henrikH, 1L, 5, masterProjectClass));
|
||||
supervisorList.add(henrikH);
|
||||
|
||||
ProjectIdea secondBachelorIdea = createProjectIdea(bachelorProjectClass, applicationPeriod);
|
||||
projectIdeaList.clear();
|
||||
projectIdeaList.add(secondBachelorIdea); // David Hallberg is preferred supervisor for this project idea
|
||||
secondBachelorIdea.setPreferredSupervisor(davidH);
|
||||
addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeArea, "ICT for Development", false));
|
||||
addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeArea, "ICT for Development__", false));
|
||||
|
||||
unmatchedProjectIdeas.add(secondBachelorIdea);
|
||||
|
||||
Result result = new GreedyMatchingAlgorithm().match(supervisorAvailability, unmatchedProjectIdeas, weights);
|
||||
assertTrue(result.matches.size() > 0);
|
||||
assertTrue(result.matches.get(0).getProjectIdea().equals(masterProjectIdea));
|
||||
assertTrue(result.matches.size() == 1);
|
||||
assertTrue(result.matches.get(0).getPoints() == 10);
|
||||
assertTrue(result.matches.get(0).getSupervisor().equals(henrikH));
|
||||
assertTrue(result.matches.get(1).getProjectIdea().equals(bachelorProjectIdea));
|
||||
assertTrue(result.matches.get(1).getSupervisor().equals(henrikH));
|
||||
assertTrue(result.unmatched.size() == 0);
|
||||
assertTrue(result.matches.get(0).getProjectIdea().equals(secondBachelorIdea));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Transactional
|
||||
@Rollback
|
||||
/* three supervisors are matched against three project ideas */
|
||||
public void testThreeSupervisorsAndThreeProjectIdeas() {
|
||||
/* .
|
||||
* 2.
|
||||
* ==================================================================================
|
||||
* Prerequisites: two supervisors are matched against one bachelor project idea,
|
||||
* both supervisors have the SAME "total availability" (9)
|
||||
* and they both have a calculated match of 10 points,
|
||||
*
|
||||
* Tests: In the second test we verify that "davidH" is found, because "henrikH"
|
||||
* has less availability slots (4) for bachelor project ideas
|
||||
* */
|
||||
public void testHenrikH_Has_Less_Available_Slots_For_Bachelor() {
|
||||
List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>();
|
||||
List<Employee> supervisorList = new ArrayList<Employee>();
|
||||
Employee davidH = createEmployee("David", "Hallberg", languages);
|
||||
supervisorAvailability.add(new Availability(davidH, 0L, 5, bachelorProjectClass));
|
||||
supervisorAvailability.add(new Availability(davidH, 1L, 5, masterProjectClass));
|
||||
|
||||
Employee henrikH = createEmployee("Henrik", "Hansson", languages);
|
||||
supervisorAvailability.add(new Availability(henrikH, 1L, 5, bachelorProjectClass));
|
||||
supervisorAvailability.add(new Availability(henrikH, 0L, 5, masterProjectClass));
|
||||
supervisorList.add(henrikH);
|
||||
|
||||
ProjectIdea secondBachelorIdea = createProjectIdea(bachelorProjectClass, applicationPeriod);
|
||||
projectIdeaList.clear();
|
||||
projectIdeaList.add(secondBachelorIdea); // David Hallberg is preferred supervisor for this project idea
|
||||
secondBachelorIdea.setPreferredSupervisor(davidH);
|
||||
addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeArea, "ICT for Development", false));
|
||||
addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeArea, "ICT for Development__", false));
|
||||
|
||||
unmatchedProjectIdeas.add(secondBachelorIdea);
|
||||
|
||||
Result result = new GreedyMatchingAlgorithm().match(supervisorAvailability, unmatchedProjectIdeas, weights);
|
||||
assertTrue(result.matches.size() == 1);
|
||||
assertTrue(result.matches.get(0).getPoints() == 10);
|
||||
assertTrue(result.matches.get(0).getSupervisor().equals(davidH));
|
||||
assertTrue(result.matches.get(0).getProjectIdea().equals(secondBachelorIdea));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Transactional
|
||||
@Rollback
|
||||
/* 3.
|
||||
* ==================================================================================
|
||||
* Prerequisites: two supervisors are matched against one bachelor project idea,
|
||||
* both supervisors have "open" availability slots for both master and bachelor projects
|
||||
* the "total availability" is DIFFERENT 8 slots vs. 9 slots for the supervisors but they have both a calculated match of 10 points,
|
||||
*
|
||||
* Tests: We now perform a third test "testDavidH_Has_Less_Total_Available_Slots", here we test that "henrikH" is found, because "davidH"
|
||||
* has less "total available" slots (8) compared to 9 for "henrikH" for project ideas (master + bachelor)
|
||||
* */
|
||||
public void testDavidH_Has_Less_Total_Available_Slots() {
|
||||
List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>();
|
||||
List<Employee> supervisorList = new ArrayList<Employee>();
|
||||
Employee davidH = createEmployee("David", "Hallberg", languages);
|
||||
supervisorAvailability.add(new Availability(davidH, 0L, 4, bachelorProjectClass));
|
||||
supervisorAvailability.add(new Availability(davidH, 1L, 5, masterProjectClass));
|
||||
|
||||
Employee henrikH = createEmployee("Henrik", "Hansson", languages);
|
||||
supervisorAvailability.add(new Availability(henrikH, 1L, 5, bachelorProjectClass));
|
||||
supervisorAvailability.add(new Availability(henrikH, 0L, 5, masterProjectClass));
|
||||
supervisorList.add(henrikH);
|
||||
|
||||
ProjectIdea secondBachelorIdea = createProjectIdea(bachelorProjectClass, applicationPeriod);
|
||||
projectIdeaList.clear();
|
||||
projectIdeaList.add(secondBachelorIdea); // David Hallberg is preferred supervisor for this project idea
|
||||
secondBachelorIdea.setPreferredSupervisor(davidH);
|
||||
addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeArea, "ICT for Development", false));
|
||||
addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeArea, "ICT for Development__", false));
|
||||
|
||||
unmatchedProjectIdeas.add(secondBachelorIdea);
|
||||
|
||||
Result result = new GreedyMatchingAlgorithm().match(supervisorAvailability, unmatchedProjectIdeas, weights);
|
||||
assertTrue(result.matches.size() == 1);
|
||||
assertTrue(result.matches.get(0).getPoints() == 10);
|
||||
assertTrue(result.matches.get(0).getSupervisor().equals(henrikH));
|
||||
assertTrue(result.matches.get(0).getProjectIdea().equals(secondBachelorIdea));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Transactional
|
||||
@Rollback
|
||||
/* three supervisors are matched against three project ideas
|
||||
* tests that project classes are regarded when matching project ideas and supervisors
|
||||
* when available slots are exactly the same
|
||||
* this test, which may be a duplicate, is done only to test if the matching algorithm can handle a more "complicated" match
|
||||
* */
|
||||
public void testThreeSupervisorsAndThreeProjectIdeas_Available_Slots_Are_The_Same() {
|
||||
List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>();
|
||||
List<Employee> supervisorList = new ArrayList<Employee>();
|
||||
Employee davidH = createEmployee("David", "Hallberg", languages);
|
||||
supervisorAvailability.add(new Availability(davidH, 0L, 5, bachelorProjectClass));
|
||||
supervisorAvailability.add(new Availability(davidH, 0L, 5, masterProjectClass));
|
||||
|
||||
supervisorList.clear();
|
||||
supervisorList.add(davidH);
|
||||
addKeyWords(supervisorList, null, createKeyword(keywordTypeArea, "IT för lärande", false));
|
||||
addKeyWords(supervisorList, null, createKeyword(keywordTypeWord, "Flexibelt lärande", false));
|
||||
|
||||
Employee henrikH = createEmployee("Henrik", "Hansson", languages);
|
||||
supervisorAvailability.add(new Availability(henrikH, 0L, 5, bachelorProjectClass));
|
||||
supervisorAvailability.add(new Availability(henrikH, 0L, 5, masterProjectClass));
|
||||
|
||||
supervisorList.clear();
|
||||
supervisorList.add(henrikH);
|
||||
addKeyWords(supervisorList, null, createKeyword(keywordTypeArea, "ICT for Development", false));
|
||||
addKeyWords(supervisorList, null, createKeyword(keywordTypeWord, "Flexibelt lärande", false));
|
||||
addKeyWords(supervisorList, null, createKeyword(keywordTypeArea, "ICT for Development__", false));
|
||||
|
||||
Employee henrikBergstr = createEmployee("Henrik", "Bergström", languages); // login henrikbe
|
||||
supervisorAvailability.add(new Availability(henrikBergstr, 0L, 5, bachelorProjectClass));
|
||||
supervisorAvailability.add(new Availability(henrikBergstr, 0L, 5, masterProjectClass));
|
||||
|
||||
supervisorList.clear();
|
||||
supervisorList.add(henrikBergstr);
|
||||
addKeyWords(supervisorList, null, createKeyword(keywordTypeWord, "System development", false));
|
||||
addKeyWords(supervisorList, null, createKeyword(keywordTypeWord, "IT-architectures", false));
|
||||
|
||||
ProjectIdea firstBachelorIdea = createProjectIdea(bachelorProjectClass, applicationPeriod);
|
||||
projectIdeaList.clear();
|
||||
@ -541,6 +641,8 @@ public class TestGreedyMatchingAlgorithm {
|
||||
projectIdeaList.clear();
|
||||
projectIdeaList.add(secondBachelorIdea); // David Hallberg is preferred supervisor for this project idea
|
||||
secondBachelorIdea.setPreferredSupervisor(davidH);
|
||||
addKeyWords(null, projectIdeaList, createKeyword(keywordTypeArea, "ICT for Development", false));
|
||||
addKeyWords(null, projectIdeaList, createKeyword(keywordTypeArea, "ICT for Development__", false));
|
||||
|
||||
unmatchedProjectIdeas.add(firstBachelorIdea);
|
||||
unmatchedProjectIdeas.add(secondBachelorIdea);
|
||||
@ -561,4 +663,5 @@ public class TestGreedyMatchingAlgorithm {
|
||||
assertTrue(result.matches.get(2).getSupervisor().equals(henrikH));
|
||||
assertTrue(result.matches.get(2).getProjectIdea().equals(masterIdea));
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user