From f547468a501eae756f15d7cde2227502891e4d4e Mon Sep 17 00:00:00 2001 From: Tom Vahlman <tom@dsv.su.se> Date: Mon, 27 Feb 2012 16:32:01 +0100 Subject: [PATCH] Added a test with three project ideas which where matched against three supervisors. There is a need for more extensive tests for covering all cases. --- .../match/TestGreedyMatchingAlgorithm.java | 249 ++++++++++++++---- 1 file changed, 197 insertions(+), 52 deletions(-) diff --git a/src/test/java/se/su/dsv/scipro/match/TestGreedyMatchingAlgorithm.java b/src/test/java/se/su/dsv/scipro/match/TestGreedyMatchingAlgorithm.java index 541f700bc2..998d5fd839 100644 --- a/src/test/java/se/su/dsv/scipro/match/TestGreedyMatchingAlgorithm.java +++ b/src/test/java/se/su/dsv/scipro/match/TestGreedyMatchingAlgorithm.java @@ -71,8 +71,9 @@ public class TestGreedyMatchingAlgorithm { private Set<Language> languages; private KeywordType keywordTypeArea; private KeywordType keywordTypeWord; + private ApplicationPeriod applicationPeriod; - private Employee createSupervisor(final String firstName, final String lastName, Set<Language> languages1) { + private Employee createEmployee(final String firstName, final String lastName, Set<Language> languages1) { Employee employee = new Employee(); User user = new User(); user.setFirstName(firstName); @@ -109,17 +110,30 @@ public class TestGreedyMatchingAlgorithm { keywordTypeWord = keywordTypeDao.save(new KeywordType("Word")); } - private void addKeyWords(final Employee supervisor, final ProjectIdea projectIdea, final Keyword keyword) { - supervisor.getKeywords().getAll().add(keyword); - projectIdea.getKeywords().getAll().add(keyword); + private void addKeyWords(List<Employee> supervisorList, List<ProjectIdea> projectIdeaList, final Keyword keyword) { + if(supervisorList != null && !supervisorList.isEmpty()) { + for(int i = 0; i < supervisorList.size(); i++) { + supervisorList.get(i).getKeywords().getAll().add(keyword); + } + } + if(projectIdeaList != null && !projectIdeaList.isEmpty()) { + for(int i = 0; i < projectIdeaList.size(); i++) { + projectIdeaList.get(i).getKeywords().getAll().add(keyword); + } + } } private Keyword createKeyword(final KeywordType keyWordType , final String keyWordName, final boolean deleted) { - Keyword keyword = new Keyword(); - keyword.setType(keyWordType); - keyword.setKeyword(keyWordName); - keyword.setDeleted(deleted); - return keywordDao.save(keyword); + Keyword keyword = keywordDao.getKeywordByNameAndType(keyWordName, keyWordType); + if(keyword == null) { + keyword = new Keyword(); + keyword.setType(keyWordType); + keyword.setKeyword(keyWordName); + keyword.setDeleted(deleted); + return keywordDao.save(keyword); + } else { + return keyword; + } } @Before @@ -131,17 +145,17 @@ public class TestGreedyMatchingAlgorithm { languages = new HashSet<Language>(); languages.add(languageDao.save(new Language("Swedish"))); languages.add(languageDao.save(new Language("English"))); - bachelorSupervisor = createSupervisor("Henrik", "Hansson", languages); + bachelorSupervisor = createEmployee("Henrik", "Hansson", languages); bachelorProjectClass = createProjectClass(ProjectClass.BACHELOR, "Bachelor", "Bachelor project class"); Set<ProjectClass> projectClassSet = new HashSet<ProjectClass>(); projectClassSet.add(bachelorProjectClass); projectClassSet.add(masterProjectClass); List<ApplicationPeriod> myList = new ArrayList<ApplicationPeriod>(); myList.addAll(applicationPeriodDao.findAll()); - ApplicationPeriod applicationPeriod = applicationPeriodFacade.createApplicationPeriod(projectClassSet, "name1"); + applicationPeriod = applicationPeriodFacade.createApplicationPeriod(projectClassSet, "name1"); bachelorProjectIdea = createProjectIdea(bachelorProjectClass, applicationPeriod); - masterSupervisor = createSupervisor("Birger", "Andersson", languages); + masterSupervisor = createEmployee("Birger", "Andersson", languages); masterProjectClass = createProjectClass(ProjectClass.MASTER, "Master", "Master project class"); masterProjectIdea = createProjectIdea(masterProjectClass, applicationPeriod); } @@ -239,10 +253,14 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* a bachelor supervisor can handle a projectIdea which has been rejected by another (bachelor) supervisor, even if the other supervisor has a higher score */ public void testRejectByOtherSupervisor() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); supervisorAvailability.add(new Availability(bachelorSupervisor, 0L, 1, bachelorProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 1, bachelorProjectClass)); - addKeyWords(bachelorSupervisor2, bachelorProjectIdea, createKeyword(keywordTypeWord, "test unit", false)); // 3 + List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>(); + projectIdeaList.add(bachelorProjectIdea); + List<Employee> supervisorList = new ArrayList<Employee>(); + supervisorList.add(bachelorSupervisor2); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "test unit", false)); // 3 addRejectedMatch(bachelorSupervisor2, bachelorProjectIdea); unmatchedProjectIdeas.add(bachelorProjectIdea); Result result = new GreedyMatchingAlgorithm().match(supervisorAvailability, unmatchedProjectIdeas, weights); @@ -256,7 +274,7 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* a preferred bachelor supervisor should be chosen prior to another bachelor supervisor */ public void testPreferredSupervisor() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 1, bachelorProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor, 0L, 1, bachelorProjectClass)); bachelorProjectIdea.setPreferredSupervisor(bachelorSupervisor2); @@ -274,7 +292,7 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* a preferred "bachelor" supervisor should NOT handle a master projectIdea */ public void testIncorrectProjectClass() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 1, bachelorProjectClass)); supervisorAvailability.add(new Availability(masterSupervisor, 0L, 1, masterProjectClass)); masterProjectIdea.setPreferredSupervisor(bachelorSupervisor2); @@ -291,10 +309,14 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* keywords of 16 points should supersede a preferred supervisor of 15 points */ public void testHighestScore() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); - addKeyWords(bachelorSupervisor2, bachelorProjectIdea, createKeyword(keywordTypeArea, "test area", false)); // 10 - addKeyWords(bachelorSupervisor2, bachelorProjectIdea, createKeyword(keywordTypeWord, "test unit", false)); // 3 - addKeyWords(bachelorSupervisor2, bachelorProjectIdea, createKeyword(keywordTypeWord, "Java", false)); // 3 + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); + List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>(); + projectIdeaList.add(bachelorProjectIdea); + List<Employee> supervisorList = new ArrayList<Employee>(); + supervisorList.add(bachelorSupervisor2); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeArea, "test area", false)); // 10 + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "test unit", false)); // 3 + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "Java", false)); // 3 supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 1, bachelorProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor, 0L, 1, bachelorProjectClass)); bachelorProjectIdea.setPreferredSupervisor(bachelorSupervisor); // 15 @@ -311,10 +333,16 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* keywords of 6 points should supersede keywords of 3 points */ public void testHighestScore_v2() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); - addKeyWords(bachelorSupervisor, bachelorProjectIdea, createKeyword(keywordTypeWord, "test unit", false)); // 3 - addKeyWords(bachelorSupervisor2, bachelorProjectIdea, createKeyword(keywordTypeWord, "UML", false)); // 3 - addKeyWords(bachelorSupervisor2, bachelorProjectIdea, createKeyword(keywordTypeWord, "Design", false)); // 3 + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); + List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>(); + projectIdeaList.add(bachelorProjectIdea); + List<Employee> supervisorList = new ArrayList<Employee>(); + supervisorList.add(bachelorSupervisor); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "test unit", false)); // 3 + supervisorList.clear(); + supervisorList.add(bachelorSupervisor2); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "UML", false)); // 3 + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "Design", false)); // 3 supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 1, bachelorProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor, 0L, 1, bachelorProjectClass)); unmatchedProjectIdeas.add(bachelorProjectIdea); @@ -330,10 +358,16 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* deleted keywords of 6 points should NOT supersede valid keywords of 3 points */ public void testHighestScore_v3() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); - addKeyWords(bachelorSupervisor, bachelorProjectIdea, createKeyword(keywordTypeWord, "test unit", false)); // 3 - addKeyWords(bachelorSupervisor2, bachelorProjectIdea, createKeyword(keywordTypeWord, "UML", true)); // 3 - addKeyWords(bachelorSupervisor2, bachelorProjectIdea, createKeyword(keywordTypeWord, "Design", true)); // 3 + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); + List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>(); + projectIdeaList.add(bachelorProjectIdea); + List<Employee> supervisorList = new ArrayList<Employee>(); + supervisorList.add(bachelorSupervisor); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "test unit", false)); // 3 + supervisorList.clear(); + supervisorList.add(bachelorSupervisor2); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "UML", true)); // 3 + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "Design", true)); // 3 supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 1, bachelorProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor, 0L, 1, bachelorProjectClass)); unmatchedProjectIdeas.add(bachelorProjectIdea); @@ -352,18 +386,23 @@ public class TestGreedyMatchingAlgorithm { Set<Language> languageSet = new HashSet<Language>(); Language language_sv = languageDao.save(new Language("Swedish")); languageSet.add(language_sv); - Employee bachelorSupervisor_sv = createSupervisor("David", "Hallberg", languageSet); + Employee bachelorSupervisor_sv = createEmployee("David", "Hallberg", languageSet); bachelorSupervisor.getCapabilities().getLanguages().clear(); bachelorSupervisor.getCapabilities().getLanguages().add(languageDao.save(new Language("English"))); bachelorProjectIdea.getLanguages().clear(); bachelorProjectIdea.getLanguages().add(language_sv); bachelorProjectIdea.setPreferredSupervisor(bachelorSupervisor); // 15 - - addKeyWords(bachelorSupervisor, bachelorProjectIdea, createKeyword(keywordTypeWord, "C++", false)); // 3 - addKeyWords(bachelorSupervisor, bachelorProjectIdea, createKeyword(keywordTypeWord, "Java", false)); // 3 - addKeyWords(bachelorSupervisor, bachelorProjectIdea, createKeyword(keywordTypeWord, "Design", false)); // 3 - addKeyWords(bachelorSupervisor_sv, bachelorProjectIdea, createKeyword(keywordTypeWord, "UML", false)); // 3 + List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>(); + projectIdeaList.add(bachelorProjectIdea); + List<Employee> supervisorList = new ArrayList<Employee>(); + supervisorList.add(bachelorSupervisor); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "C++", false)); // 3 + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "Java", false)); // 3 + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "Design", false)); // 3 + supervisorList.clear(); + supervisorList.add(bachelorSupervisor_sv); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "UML", false)); // 3 supervisorAvailability.add(new Availability(bachelorSupervisor_sv, 0L, 1, bachelorProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor, 0L, 1, bachelorProjectClass)); unmatchedProjectIdeas.add(bachelorProjectIdea); @@ -379,10 +418,14 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* a supervisor should not be chosen if he/she is "deleted" */ public void testForDeletedSupervisor() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); bachelorSupervisor2.setDeleted(true); - addKeyWords(bachelorSupervisor2, bachelorProjectIdea, createKeyword(keywordTypeWord, "UML", false)); // 3 + List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>(); + projectIdeaList.add(bachelorProjectIdea); + List<Employee> supervisorList = new ArrayList<Employee>(); + supervisorList.add(bachelorSupervisor2); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "UML", false)); // 3 supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 1, bachelorProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor, 0L, 1, bachelorProjectClass)); unmatchedProjectIdeas.add(bachelorProjectIdea); @@ -399,13 +442,16 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* a supervisor cannot be supervisor to herself */ public void testSupervisorCannotSuperviseHerself() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); Role role = new Student(); role.setUser(bachelorSupervisor2.getUser()); role = roleDao.save(role); bachelorProjectIdea.getAuthors().add((Student) role); - - addKeyWords(bachelorSupervisor2, bachelorProjectIdea, createKeyword(keywordTypeWord, "UML", false)); // 3 + List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>(); + projectIdeaList.add(bachelorProjectIdea); + List<Employee> supervisorList = new ArrayList<Employee>(); + supervisorList.add(bachelorSupervisor2); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "UML", false)); // 3 supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 1, bachelorProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor, 0L, 1, bachelorProjectClass)); unmatchedProjectIdeas.add(bachelorProjectIdea); @@ -422,8 +468,12 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* the supervisor with no available "slots" should NOT be chosen even when this supervisor has the highest score */ public void testNoAvailableSlots() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); - addKeyWords(bachelorSupervisor, bachelorProjectIdea, createKeyword(keywordTypeWord, "Design", false)); // 3 + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); + List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>(); + projectIdeaList.add(bachelorProjectIdea); + List<Employee> supervisorList = new ArrayList<Employee>(); + supervisorList.add(bachelorSupervisor); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "Design", false)); // 3 supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 1, bachelorProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor, 1L, 1, bachelorProjectClass)); // availability = numCapable - numMatched unmatchedProjectIdeas.add(bachelorProjectIdea); @@ -441,9 +491,12 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* a supervisor with the highest available slot should NOT be chosen when this supervisor has less score */ public void testHighestAvailableSlot() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); - - addKeyWords(bachelorSupervisor, bachelorProjectIdea, createKeyword(keywordTypeWord, "UML", false)); // 3 + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); + List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>(); + projectIdeaList.add(bachelorProjectIdea); + List<Employee> supervisorList = new ArrayList<Employee>(); + supervisorList.add(bachelorSupervisor); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "UML", false)); // 3 supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 4, bachelorProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor, 0L, 1, bachelorProjectClass)); unmatchedProjectIdeas.add(bachelorProjectIdea); @@ -460,7 +513,7 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* test that the number Availability#numMatched has increased with one and that the supervisor with highest available slots are chosen */ public void testNumMatchedHasIncreased() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 4, bachelorProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor, 0L, 1, bachelorProjectClass)); unmatchedProjectIdeas.add(bachelorProjectIdea); @@ -497,10 +550,14 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* neither a bachelor or a master supervisor are preferred to handle a bachelor idea when compatibility, keywords, scores etc are equal */ public void testBachelorOrMaster() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); supervisorAvailability.add(new Availability(masterSupervisor, 0L, 1, bachelorProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 1, bachelorProjectClass)); - addKeyWords(bachelorSupervisor2, bachelorProjectIdea, createKeyword(keywordTypeWord, "Design", false)); + List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>(); + projectIdeaList.add(bachelorProjectIdea); + List<Employee> supervisorList = new ArrayList<Employee>(); + supervisorList.add(bachelorSupervisor2); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "Design", false)); unmatchedProjectIdeas.add(bachelorProjectIdea); Result result = new GreedyMatchingAlgorithm().match(supervisorAvailability, unmatchedProjectIdeas, weights); assertTrue(result.matches.size() > 0); @@ -514,7 +571,7 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* test that a master which has filled up his slot for bachelor but has slots left for master can supervise a bachelor idea */ public void testSlotForMasterSupervisor() { -//Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); +//Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); supervisorAvailability.add(new Availability(masterSupervisor, 3L, 3, bachelorProjectClass)); supervisorAvailability.add(new Availability(masterSupervisor, 3L, 4, bachelorProjectClass)); //supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 1, bachelorProjectClass)); @@ -531,7 +588,7 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* test that a master which has filled up his slot for bachelor but has slots left for master can supervise a bachelor idea */ public void testIncreaseSlotForMasterSupervisor() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); supervisorAvailability.add(new Availability(masterSupervisor, 3L, 3, bachelorProjectClass)); supervisorAvailability.add(new Availability(masterSupervisor, 3L, 4, masterProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 1, bachelorProjectClass)); @@ -561,7 +618,10 @@ public class TestGreedyMatchingAlgorithm { @Rollback /* test that a master which has filled up his slot for bachelor but has slots left for master can supervise a bachelor idea */ public void testIncreaseSlotForMasterSupervisor_v2() { - Employee bachelorSupervisor2 = createSupervisor("David", "Hallberg", languages); + /* + supervisorAvailability.clear(); + unmatchedProjectIdeas.clear(); + Employee bachelorSupervisor2 = createEmployee("David", "Hallberg", languages); supervisorAvailability.add(new Availability(masterSupervisor, 3L, 3, bachelorProjectClass)); supervisorAvailability.add(new Availability(masterSupervisor, 3L, 4, masterProjectClass)); supervisorAvailability.add(new Availability(bachelorSupervisor2, 0L, 1, bachelorProjectClass)); @@ -569,7 +629,11 @@ public class TestGreedyMatchingAlgorithm { unmatchedProjectIdeas.add(masterProjectIdea); bachelorProjectIdea.setPreferredSupervisor(masterSupervisor); masterProjectIdea.setPreferredSupervisor(masterSupervisor); - addKeyWords(masterSupervisor, masterProjectIdea, createKeyword(keywordTypeWord, "UML", false)); + List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>(); + projectIdeaList.add(bachelorProjectIdea); + List<Employee> supervisorList = new ArrayList<Employee>(); + supervisorList.add(masterSupervisor); + addKeyWords(supervisorList, projectIdeaList, createKeyword(keywordTypeWord, "UML", false)); Result result = new GreedyMatchingAlgorithm().match(supervisorAvailability, unmatchedProjectIdeas, weights); assertTrue(result.matches.size() > 0); boolean foundMasterProjIdea = false; @@ -593,7 +657,88 @@ public class TestGreedyMatchingAlgorithm { assertTrue(foundBachelorProjIdea); assertTrue(foundBachelorSuperVisor); assertTrue(foundMasterSuperVisor); - assertTrue(result.unmatched.size() == 0); + assertTrue(result.unmatched.size() == 0); */ } + @Test + @Transactional + @Rollback + /* three supervisors which are matched against three project ideas */ + public void testIncreaseSlotForMasterSupervisor_v3() { + List<ProjectIdea> projectIdeaList = new ArrayList<ProjectIdea>(); + List<Employee> supervisorList = new ArrayList<Employee>(); + + Employee davidH = createEmployee("David", "Hallberg", languages); + supervisorAvailability.clear(); + 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, "Business process management (BPM)", 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, "Technology Enhanced Learning", false)); + addKeyWords(supervisorList, null, createKeyword(keywordTypeArea, "ICT for Development", false)); + addKeyWords(supervisorList, null, createKeyword(keywordTypeWord, "Flexibelt lärande", 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, "ACT Agera i kommunikation med teknik", false)); + addKeyWords(supervisorList, null, createKeyword(keywordTypeWord, "System development", false)); + addKeyWords(supervisorList, null, createKeyword(keywordTypeWord, "IT-architectures", false)); + + ProjectIdea firstBachelorIdea = createProjectIdea(bachelorProjectClass, applicationPeriod); + projectIdeaList.clear(); + projectIdeaList.add(firstBachelorIdea); // no preferred supervisor for this project idea + addKeyWords(null, projectIdeaList, createKeyword(keywordTypeArea, "ICT for Development", false)); + addKeyWords(null, projectIdeaList, createKeyword(keywordTypeWord, "System development", false)); + addKeyWords(null, projectIdeaList, createKeyword(keywordTypeWord, "Enterprise 2.0", false)); + + ProjectIdea masterIdea = createProjectIdea(masterProjectClass, applicationPeriod); + projectIdeaList.clear(); + projectIdeaList.add(masterIdea); // no preferred supervisor for this project idea + addKeyWords(null, projectIdeaList, createKeyword(keywordTypeArea, "Interaction design", false)); + addKeyWords(null, projectIdeaList, createKeyword(keywordTypeArea, "ICT for Development", false)); + addKeyWords(null, projectIdeaList, createKeyword(keywordTypeArea, "Digital Systems Security", false)); + addKeyWords(null, projectIdeaList, createKeyword(keywordTypeWord, "System development", false)); + addKeyWords(null, projectIdeaList, createKeyword(keywordTypeWord, "Information system theory", false)); + + ProjectIdea secondBachelorIdea = createProjectIdea(bachelorProjectClass, applicationPeriod); + projectIdeaList.clear(); + projectIdeaList.add(secondBachelorIdea); // David Hallberg is preferred supervisor for this project idea + secondBachelorIdea.setPreferredSupervisor(davidH); + addKeyWords(null, projectIdeaList, createKeyword(keywordTypeArea, "E-government and E-democracy", false)); + + unmatchedProjectIdeas.clear(); + unmatchedProjectIdeas.add(firstBachelorIdea); + unmatchedProjectIdeas.add(secondBachelorIdea); + unmatchedProjectIdeas.add(masterIdea); + + Result result = new GreedyMatchingAlgorithm().match(supervisorAvailability, unmatchedProjectIdeas, weights); + assertTrue(result.matches.size() == 3); + + assertTrue(result.matches.get(0).getPoints() == 10); + assertTrue(result.matches.get(1).getPoints() == 5); + assertTrue(result.matches.get(2).getPoints() == 5); + + assertTrue(result.matches.get(0).getSupervisor().equals(davidH)); + assertTrue(result.matches.get(1).getSupervisor().equals(henrikH)); + assertTrue(result.matches.get(2).getSupervisor().equals(henrikH)); + + assertTrue(result.matches.get(0).getProjectIdea().equals(secondBachelorIdea)); + assertTrue(result.matches.get(1).getProjectIdea().equals(firstBachelorIdea)); + assertTrue(result.matches.get(2).getProjectIdea().equals(masterIdea)); + } }