blob: bf004e010aa8a5fb29c0870c062aeab342275473 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2020 Christian Pontesegger and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Christian Pontesegger - initial API and implementation
*******************************************************************************/
package org.eclipse.skills.service;
import static org.junit.Assert.assertThrows;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.eclipse.skills.model.IQuest;
import org.eclipse.skills.model.ISkill;
import org.eclipse.skills.model.ISkillsFactory;
import org.eclipse.skills.model.IUser;
import org.eclipse.skills.model.IUserTitle;
import org.eclipse.skills.service.questprovider.IQuestProvider;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class UserTitleGeneratorTest {
private IUser fUser;
private QuestProviderMock fQuestProvider;
private UserTitleGenerator fTitleGenerator;
@BeforeEach
public void setup() {
fUser = new UserFactory().createUser();
fQuestProvider = new QuestProviderMock();
fTitleGenerator = new UserTitleGenerator(fUser, fQuestProvider);
}
@Test
@DisplayName("throw IllegalArgumentexception when user is null")
public void throwIfUserIsNull() {
assertThrows(IllegalArgumentException.class, () -> new UserTitleGenerator(null, fQuestProvider));
}
@Test
@DisplayName("throw IllegalArgumentexception when questProvider is null")
public void throwIfQuestProviderIsNull() {
assertThrows(IllegalArgumentException.class, () -> new UserTitleGenerator(fUser, null));
}
@Test
@DisplayName("empty string is returned when no titles are defined")
public void createDefaultUserTitle() {
assertEquals("", fTitleGenerator.createUserTitle());
}
@Test
@DisplayName("skill name is replaced in title string")
public void replaceSkillName() {
addTitle("${skill.name} expert", 0, "mySkill");
final ISkill skill = ISkillsFactory.eINSTANCE.createSkill();
skill.setName("mySkill");
fUser.getSkills().add(skill);
assertEquals("mySkill expert", fTitleGenerator.createUserTitle());
}
@Test
@DisplayName("skill name is not replaced when no skill is defined")
public void discardSkillName() {
addTitle("${skill.name} expert", 0, null);
assertEquals("expert", fTitleGenerator.createUserTitle());
}
@Test
@DisplayName("select title for highest matching skill (level = 1)")
public void selectTitleForBestMatchingSkillA() {
addTitle("Beginner", 0, null);
addTitle("Intermediate", 2, null);
addTitle("Advanced", 3, null);
addTitle("Expert", 4, null);
final int xpNeeded = fUser.getExperience().getProgression().getMinimumXpForLevel(2);
fUser.getExperience().setExperience(xpNeeded - 1);
assertEquals("Beginner", fTitleGenerator.createUserTitle());
}
@Test
@DisplayName("select title for highest matching skill (level = 2)")
public void selectTitleForBestMatchingSkillB() {
addTitle("Beginner", 0, null);
addTitle("Intermediate", 2, null);
addTitle("Advanced", 3, null);
addTitle("Expert", 4, null);
final int xpNeeded = fUser.getExperience().getProgression().getMinimumXpForLevel(2);
fUser.getExperience().setExperience(xpNeeded);
assertEquals("Intermediate", fTitleGenerator.createUserTitle());
}
@Test
@DisplayName("select title for highest matching skill (level = 4)")
public void selectTitleForBestMatchingSkillC() {
addTitle("Beginner", 0, null);
addTitle("Intermediate", 2, null);
addTitle("Advanced", 3, null);
addTitle("Expert", 4, null);
final int xpNeeded = fUser.getExperience().getProgression().getMinimumXpForLevel(4);
fUser.getExperience().setExperience(xpNeeded);
assertEquals("Expert", fTitleGenerator.createUserTitle());
}
private void addTitle(String displayString, int minLevel, String skillName) {
final IQuest quest = fQuestProvider.getQuests().iterator().next();
ISkill skill = null;
if (skillName != null) {
skill = ISkillsFactory.eINSTANCE.createSkill();
skill.setName(skillName);
quest.getSkills().add(skill);
}
final IUserTitle title = ISkillsFactory.eINSTANCE.createUserTitle();
title.setDisplayString(displayString);
title.setMinLevel(minLevel);
title.setSkill(skill);
quest.getUserTitles().add(title);
}
private class QuestProviderMock implements IQuestProvider {
private final List<IQuest> fQuests;
public QuestProviderMock() {
fQuests = Arrays.asList(ISkillsFactory.eINSTANCE.createQuest());
}
@Override
public Collection<IQuest> getQuests() {
return fQuests;
}
}
}