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));
+    }
 }