package crmdna.calling;
import crmdna.interaction.InteractionScoreProp;
import org.junit.Test;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Created by sathya on 25/7/15.
*/
public class CallAssignmentHelperTest {
@Test
public void withoutMaxLimit() {
//members: 1, 2, 3, 4, ..., 100
//users: 1, 2, 3, 4
//random score: member id + user id
final int NUM_MEMBERS = 100;
Set<Long> memberIds = new HashSet<>();
for (long i = 1; i <= NUM_MEMBERS; i++) {
memberIds.add(i);
}
final int NUM_USERS = 4;
Set<Long> userIds = new HashSet<>();
for (long i = 1; i <= NUM_USERS; i++) {
userIds.add(i);
}
List<InteractionScoreProp> scores = getUserIdPlusMemberIdScores(memberIds, userIds);
CallAssignmentResult result = CallAssignmentHelper.assignMembersBasedOnScore(scores, null);
assertTrue(result.allMembersAssigned());
//all members should be assigned to user4
assertEquals(1, result.userIdVsMemberIds.size());
assertEquals(100, result.userIdVsMemberIds.get(4l).size());
assertTrue(result.userIdVsMemberIds.get(4l).containsAll(memberIds));
}
@Test
public void withMaxLimit() {
//members: 1, 2, 3, 4, ..., 100
//users: 1, 2, 3, 4
//random score: member id + user id
final int NUM_MEMBERS = 100;
Set<Long> memberIds = new HashSet<>();
for (long i = 1; i <= NUM_MEMBERS; i++) {
memberIds.add(i);
}
final int NUM_USERS = 4;
Set<Long> userIds = new HashSet<>();
for (long i = 1; i <= NUM_USERS; i++) {
userIds.add(i);
}
List<InteractionScoreProp> scores = getUserIdPlusMemberIdScores(memberIds, userIds);
Map<Long, Integer> userIdVsMaxMembers = new HashMap<>();
//set limit for each user as 30
userIdVsMaxMembers.put(1l, 30);
userIdVsMaxMembers.put(2l, 30);
userIdVsMaxMembers.put(3l, 30);
userIdVsMaxMembers.put(4l, 30);
CallAssignmentResult result = CallAssignmentHelper.assignMembersBasedOnScore(scores, userIdVsMaxMembers);
assertTrue(result.allMembersAssigned());
//user4 should get members 71 to 100
//user3 should get members 41 to 70
//user2 should get members 11 to 40
//user1 should get members 1 to 10
assertEquals(4, result.userIdVsMemberIds.size());
//user4
memberIds = result.userIdVsMemberIds.get(4l);
assertEquals(30, memberIds.size());
for (long memberId = 71; memberId <= 100; memberId++) {
assertTrue(memberIds.contains(memberId));
}
//user3
memberIds = result.userIdVsMemberIds.get(3l);
assertEquals(30, memberIds.size());
for (long memberId = 41; memberId <= 70; memberId++) {
assertTrue(memberIds.contains(memberId));
}
//user2
memberIds = result.userIdVsMemberIds.get(2l);
assertEquals(30, memberIds.size());
for (long memberId = 11; memberId <= 40; memberId++) {
assertTrue(memberIds.contains(memberId));
}
//user1
memberIds = result.userIdVsMemberIds.get(1l);
assertEquals(10, memberIds.size());
for (long memberId = 1; memberId <= 10; memberId++) {
assertTrue(memberIds.contains(memberId));
}
}
@Test
public void moreMembersThanSpaceAvailable() {
//members: 1, 2, 3, 4, ..., 100
//users: 1, 2, 3, 4
//random score: member id + user id
final int NUM_MEMBERS = 100;
Set<Long> memberIds = new HashSet<>();
for (long i = 1; i <= NUM_MEMBERS; i++) {
memberIds.add(i);
}
final int NUM_USERS = 4;
Set<Long> userIds = new HashSet<>();
for (long i = 1; i <= NUM_USERS; i++) {
userIds.add(i);
}
List<InteractionScoreProp> scores = getUserIdPlusMemberIdScores(memberIds, userIds);
Map<Long, Integer> userIdVsMaxMembers = new HashMap<>();
//set limit for each user as 10
userIdVsMaxMembers.put(1l, 10);
userIdVsMaxMembers.put(2l, 10);
userIdVsMaxMembers.put(3l, 10);
userIdVsMaxMembers.put(4l, 10);
CallAssignmentResult result = CallAssignmentHelper.assignMembersBasedOnScore(scores, userIdVsMaxMembers);
//user4 should get members 91 to 100
//user3 should get members 81 to 90
//user2 should get members 71 to 80
//user1 should get members 61 to 70
//members 1 to 60 will be unassigned
assertTrue(! result.allMembersAssigned());
assertEquals(4, result.userIdVsMemberIds.size());
//user4
memberIds = result.userIdVsMemberIds.get(4l);
assertEquals(10, memberIds.size());
for (long memberId = 91; memberId <= 100; memberId++) {
assertTrue(memberIds.contains(memberId));
}
//user3
memberIds = result.userIdVsMemberIds.get(3l);
assertEquals(10, memberIds.size());
for (long memberId = 81; memberId <= 90; memberId++) {
assertTrue(memberIds.contains(memberId));
}
//user2
memberIds = result.userIdVsMemberIds.get(2l);
assertEquals(10, memberIds.size());
for (long memberId = 71; memberId <= 80; memberId++) {
assertTrue(memberIds.contains(memberId));
}
//user1
memberIds = result.userIdVsMemberIds.get(1l);
assertEquals(10, memberIds.size());
for (long memberId = 61; memberId <= 70; memberId++) {
assertTrue(memberIds.contains(memberId));
}
for (long memberId = 1; memberId <= 60; memberId++) {
assertTrue(result.unassignedMembers.contains(memberId));
}
assertEquals(60, result.unassignedMembers.size());
}
private List<InteractionScoreProp> getUserIdPlusMemberIdScores(Set<Long> memberIds, Set<Long> userIds) {
List<InteractionScoreProp> scores = new ArrayList<>();
for (long memberId : memberIds) {
for (long userId : userIds) {
InteractionScoreProp score = new InteractionScoreProp();
score.memberId = memberId;
score.userId = userId;
score.interactionScore = (int)(memberId + userId);
scores.add(score);
}
}
return scores;
}
}