/*******************************************************************************
* 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.datacontainer.traitholdercontainer;
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 java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import de.tobiyas.racesandclasses.RacesAndClasses;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.exceptions.HolderTraitParseException;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.permissionsettings.HolderPermissions;
import de.tobiyas.racesandclasses.generate.plugin.GenerateRaces;
import de.tobiyas.racesandclasses.generate.traits.InvisibleTrait;
import de.tobiyas.racesandclasses.generate.traits.TraitWithConfigAnnotations;
import de.tobiyas.racesandclasses.generate.traits.TraitWithNoAnnotations;
import de.tobiyas.racesandclasses.generate.traits.VisibleTrait;
import de.tobiyas.racesandclasses.traitcontainer.TraitStore;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.Trait;
import de.tobiyas.racesandclasses.util.items.ItemUtils.ItemQuality;
import de.tobiyas.racesandclasses.util.traitutil.TraitConfigParser;
import de.tobiyas.util.config.YAMLConfigExtended;
import de.tobiyas.utils.tests.generate.server.GenerateBukkitServer;
@RunWith(PowerMockRunner.class)
@PrepareForTest({TraitStore.class, TraitConfigParser.class})
public abstract class AbstractTraitHolderTest {
protected final AbstractTraitHolder sut;
protected final String holderName;
protected final String holderTag;
protected AbstractHolderManager manager;
protected YAMLConfigExtended config;
protected AbstractTraitHolderTest(String holderName, String holderTag, AbstractTraitHolder sut){
this.holderName = holderName;
this.holderTag = holderTag;
this.sut = sut;
this.config = sut.config;
}
@Before
public void init(){
GenerateBukkitServer.generateServer();
GenerateRaces.generateRaces();
manager = getHolderManager();
}
protected abstract AbstractHolderManager getHolderManager();
@After
public void teardown(){
GenerateRaces.dropMock();
GenerateBukkitServer.dropServer();
}
@Test
public void constructor_sets_all_values_correct(){
assertTrue(sut.getArmorPerms().isEmpty());
assertEquals("", sut.getArmorString());
assertEquals(0, sut.getManaBonus(), 0.001);
assertTrue(sut.getVisibleTraits().isEmpty());
assertTrue(sut.getTraits().isEmpty());
assertTrue(sut.getPermissions().getPermissions().isEmpty());
assertTrue(sut.getParsingExceptionsHappened().isEmpty());
assertEquals(this.holderName, sut.getName());
assertEquals(this.holderTag, sut.getTag());
assertEquals(this.holderName, sut.toString());
}
@Test
public void check_containsPlayer_works(){
String playerName = "testPlayer";
when(manager.getHolderOfPlayer(playerName)).thenReturn(sut);
assertTrue(sut.containsPlayer(playerName));
when(manager.getHolderOfPlayer(playerName)).thenReturn(null);
assertFalse(sut.containsPlayer(playerName));
AbstractTraitHolder otherMockHolder = mock(AbstractTraitHolder.class);
when(otherMockHolder.getName()).thenReturn("other");
when(manager.getHolderOfPlayer(playerName)).thenReturn(otherMockHolder);
assertFalse(sut.containsPlayer(playerName));
}
@Test
public void readArmor_works(){
sut.config.set(holderName + ".config.armor", "leather,iron,gold,diamond,chain");
sut.readArmor();
assertEquals(ItemQuality.values().length - 1, sut.getArmorPerms().size());
}
@Test
public void readArmor_with_all_works(){
sut.config.set(holderName + ".config.armor", "all");
sut.readArmor();
assertEquals(ItemQuality.values().length - 1, sut.getArmorPerms().size());
}
@Test
public void readPermissions_works(){
List<String> permissions = new LinkedList<String>();
permissions.add("perm1");
permissions.add("perm2");
permissions.add("perm3");
sut.config.set(holderName + ".permissions", permissions);
sut.readPermissionSection();
HolderPermissions perms = sut.getPermissions();
assertEquals(permissions.size(), perms.getPermissions().size());
for(String permission : permissions){
assertTrue(perms.getPermissions().contains(permission));
}
}
@Test
public void readPermissions_is_empty_when_section_does_not_exist_works(){
sut.readPermissionSection();
HolderPermissions perms = sut.getPermissions();
assertTrue(perms.getPermissions().isEmpty());
}
@Test
public abstract void test_config_load_works_with_full_config();
@Test
public abstract void test_config_load_works_with_empty_config();
@Test
public void loading_valid_traits_works() throws IOException{
PowerMockito.mockStatic(TraitStore.class);
Trait mock = mock(Trait.class);
Trait mock2 = mock(Trait.class);
Trait mock3 = mock(Trait.class);
PowerMockito.when(TraitStore.buildTraitByName("test1", sut)).thenReturn(mock);
PowerMockito.when(TraitStore.buildTraitByName("test2", sut)).thenReturn(mock2);
PowerMockito.when(TraitStore.buildTraitByName("NormalArrow", sut)).thenReturn(mock3);
PowerMockito.mockStatic(TraitConfigParser.class);
config.createSection(holderName);
config.createSection(holderName + ".traits");
config.createSection(holderName + ".traits.test1");
config.createSection(holderName + ".traits.test2");
config.set(holderName + ".traits.test1.value", 42);
config.set(holderName + ".traits.test2.value", 43);
sut.readTraitSection();
assertTrue(sut.getTraits().contains(mock));
assertTrue(sut.getTraits().contains(mock2));
if(manager == RacesAndClasses.getPlugin().getRaceManager()){
assertTrue(sut.getTraits().contains(mock3));
}
}
@Test
public void loading_invalid_traits_adds_expcetions_to_list_works() throws IOException{
String traitExceptionMessage1 = "Field: 'test.traits.test1.needed' not found in Config for Trait: ";
String traitExceptionMessage2 = "Field: 'test.traits.test2.needed' not found in Config for Trait: ";
PowerMockito.mockStatic(TraitStore.class);
Trait trait1 = new TraitWithConfigAnnotations();
Trait trait2 = new TraitWithConfigAnnotations();
Trait trait3 = mock(Trait.class);
when(trait3.getName()).thenReturn("NormalArrow");
PowerMockito.when(TraitStore.buildTraitByName("test1", sut)).thenReturn(trait1);
PowerMockito.when(TraitStore.buildTraitByName("test2", sut)).thenReturn(trait2);
PowerMockito.when(TraitStore.buildTraitByName("NormalArrow", sut)).thenReturn(trait3);
config.createSection(holderName);
config.createSection(holderName + ".traits");
config.createSection(holderName + ".traits.test1");
config.createSection(holderName + ".traits.test2");
config.set(holderName + ".traits.test1.value", 42);
config.set(holderName + ".traits.test2.value", 43);
sut.readTraitSection();
if(manager == RacesAndClasses.getPlugin().getRaceManager()){
assertTrue(sut.getTraits().contains(trait3));
}
assertEquals(2, sut.getParsingExceptionsHappened().size());
HolderTraitParseException actualExp = sut.getParsingExceptionsHappened().get(0);
assertEquals(traitExceptionMessage1, actualExp.getMessage());
HolderTraitParseException actualExp2 = sut.getParsingExceptionsHappened().get(1);
assertEquals(traitExceptionMessage2, actualExp2.getMessage());
}
@Test
public void get_visible_traits_only_returns_visible_trais() throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException{
Trait invisibleTrait = new InvisibleTrait();
Trait visibleTrait = new VisibleTrait();
Trait traitWithoutAnnotations = new TraitWithNoAnnotations();
sut.traits.add(invisibleTrait);
sut.traits.add(visibleTrait);
sut.traits.add(traitWithoutAnnotations);
Set<Trait> traits = sut.getVisibleTraits();
assertTrue(traits.contains(visibleTrait));
assertFalse(traits.contains(invisibleTrait));
assertFalse(traits.contains(traitWithoutAnnotations));
}
}