/*******************************************************************************
* Copyright 2014 Tobias Welther
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package de.tobiyas.racesandclasses.playermanagement.spellmanagement;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import de.tobiyas.racesandclasses.RacesAndClasses;
import de.tobiyas.racesandclasses.configuration.member.MemberConfigManager;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.classes.ClassContainer;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.race.RaceContainer;
import de.tobiyas.racesandclasses.generate.plugin.GenerateRaces;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.MagicSpellTrait;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.MagicSpellTrait.CostType;
import de.tobiyas.utils.tests.generate.server.GenerateBukkitServer;
public class ManaManagerTest {
private ManaManager sut;
private String playerName = "player";
private void mockRaceManaAddition(double value){
RaceContainer raceContainer = mock(RaceContainer.class);
when(raceContainer.getManaBonus()).thenReturn(value);
when(RacesAndClasses.getPlugin().getRaceManager().getHolderOfPlayer(playerName)).thenReturn(raceContainer);
}
private void mockClassManaAddition(double value){
ClassContainer classContainer = mock(ClassContainer.class);
when(classContainer.getManaBonus()).thenReturn(value);
when(RacesAndClasses.getPlugin().getClassManager().getHolderOfPlayer(playerName)).thenReturn(classContainer);
}
@Before
public void setupSut(){
GenerateBukkitServer.generateServer();
GenerateRaces.generateRaces();
when(RacesAndClasses.getPlugin().getConfigManager().getMemberConfigManager()).thenReturn(mock(MemberConfigManager.class, Mockito.RETURNS_DEEP_STUBS));
when(RacesAndClasses.getPlugin().getConfigManager().getMemberConfigManager().getConfigOfPlayer(playerName)
.getValueDisplayName("displayType")).thenReturn("score");
sut = new ManaManager(playerName);
}
@After
public void tearDown(){
GenerateRaces.dropMock();
GenerateBukkitServer.dropServer();
}
@Test
public void test_constructor_and_getters(){
assertEquals(playerName, sut.getPlayerUUID());
assertEquals(0, sut.getCurrentMana(), 0.001);
assertEquals(0, sut.getMaxMana(), 0.001);
}
@Test
public void test_adding_mana_by_race_works(){
double valueAdded = 42;
mockRaceManaAddition(valueAdded);
sut.rescanPlayer();
assertEquals(valueAdded, sut.getMaxMana(), 0.001);
}
@Test
public void setting_current_mana_to_max_when_max_sincs_works(){
double valueAdded = 42;
mockRaceManaAddition(valueAdded);
sut.rescanPlayer();
sut.fillMana(valueAdded);
mockRaceManaAddition(valueAdded / 2);
sut.rescanPlayer();
assertEquals(valueAdded / 2, sut.getCurrentMana(), 0.001);
}
@Test
public void test_adding_mana_by_class_works(){
double valueAdded = 42;
mockClassManaAddition(valueAdded);
sut.rescanPlayer();
assertEquals(valueAdded, sut.getMaxMana(), 0.001);
}
@Test
public void test_filling_current_mana_works(){
double valueAdded = 42;
mockRaceManaAddition(valueAdded);
sut.rescanPlayer();
sut.fillMana(valueAdded);
assertEquals(valueAdded, sut.getCurrentMana(), 0.001);
}
@Test
public void test_filling_current_mana_over_max_fills_to_max_works(){
double valueAdded = 42;
mockRaceManaAddition(valueAdded);
sut.rescanPlayer();
sut.fillMana(valueAdded * 2);
assertEquals(valueAdded, sut.getCurrentMana(), 0.001);
}
@Test
public void test_drowning_current_mana_works(){
double valueAdded = 42;
mockRaceManaAddition(valueAdded);
sut.rescanPlayer();
sut.fillMana(valueAdded);
sut.drownMana(valueAdded / 2);
assertEquals(valueAdded / 2, sut.getCurrentMana(), 0.001);
}
@Test
public void test_drowning_empty_current_mana_drowns_nothing_works(){
double valueAdded = 42;
mockRaceManaAddition(valueAdded);
sut.rescanPlayer();
sut.drownMana(valueAdded);
assertEquals(0, sut.getCurrentMana(), 0.001);
}
@Test
public void test_spell_casting_works_with_enough_mana(){
double maxMana = 42;
mockRaceManaAddition(maxMana);
sut.rescanPlayer();
sut.fillMana(maxMana);
MagicSpellTrait spell = mock(MagicSpellTrait.class);
when(spell.getCost()).thenReturn(maxMana / 2);
when(spell.getCostType()).thenReturn(CostType.MANA);
assertTrue(sut.playerCastSpell(spell));
}
@Test
public void test_spell_casting_fails_with_not_enough_mana(){
double maxMana = 42;
mockRaceManaAddition(maxMana);
sut.rescanPlayer();
sut.fillMana(maxMana / 2);
MagicSpellTrait spell = mock(MagicSpellTrait.class);
when(spell.getCost()).thenReturn((maxMana / 2 ) + 1);
when(spell.getCostType()).thenReturn(CostType.MANA);
assertFalse(sut.playerCastSpell(spell));
}
@Test
public void test_spell_casting_fails_with_CostType_HEALTH_needed(){
double maxMana = 42;
mockRaceManaAddition(maxMana);
sut.rescanPlayer();
sut.fillMana(maxMana);
MagicSpellTrait spell = mock(MagicSpellTrait.class);
when(spell.getCost()).thenReturn(maxMana / 2);
when(spell.getCostType()).thenReturn(CostType.HEALTH);
assertFalse(sut.playerCastSpell(spell));
}
@Test
public void test_spell_casting_fails_with_CostType_ITEM_needed(){
double maxMana = 42;
mockRaceManaAddition(maxMana);
sut.rescanPlayer();
sut.fillMana(maxMana);
MagicSpellTrait spell = mock(MagicSpellTrait.class);
when(spell.getCost()).thenReturn(maxMana / 2);
when(spell.getCostType()).thenReturn(CostType.ITEM);
assertFalse(sut.playerCastSpell(spell));
}
@Test
public void test_player_has_enough_mana_works(){
double maxMana = 42;
mockRaceManaAddition(maxMana);
sut.rescanPlayer();
assertFalse(sut.hasEnoughMana(maxMana/ 2));
sut.fillMana(maxMana);
assertTrue(sut.hasEnoughMana(maxMana / 2));
}
@Test
public void test_player_has_enough_mana_with_spells_works(){
double maxMana = 42;
mockRaceManaAddition(maxMana);
sut.rescanPlayer();
MagicSpellTrait spell = mock(MagicSpellTrait.class);
when(spell.getCost()).thenReturn(maxMana / 2);
when(spell.getCostType()).thenReturn(CostType.MANA);
assertFalse(sut.hasEnoughMana(spell));
sut.fillMana(maxMana);
assertTrue(sut.hasEnoughMana(spell));
when(spell.getCostType()).thenReturn(CostType.HEALTH);
assertFalse(sut.hasEnoughMana(spell));
when(spell.getCostType()).thenReturn(CostType.ITEM);
assertFalse(sut.hasEnoughMana(spell));
}
}