/******************************************************************************* * 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.commands.races; import static de.tobiyas.racesandclasses.translation.languages.Keys.already_are; import static de.tobiyas.racesandclasses.translation.languages.Keys.already_have_race; import static de.tobiyas.racesandclasses.translation.languages.Keys.no_race_selected; import static de.tobiyas.racesandclasses.translation.languages.Keys.plugin_pre; import static de.tobiyas.racesandclasses.translation.languages.Keys.race_changed_to; import static de.tobiyas.racesandclasses.translation.languages.Keys.race_not_exist; import static de.tobiyas.racesandclasses.translation.languages.Keys.your_race; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.LinkedList; import java.util.List; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Player; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.racesandclasses.commands.classes.CommandExecutor_Class; import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.race.RaceContainer; import de.tobiyas.racesandclasses.generate.PluginCommandFactory; import de.tobiyas.racesandclasses.generate.plugin.GenerateRaces; import de.tobiyas.racesandclasses.tutorial.TutorialStepContainer; import de.tobiyas.utils.tests.generate.server.GenerateBukkitServer; public class CommandExecutor_RacesTest { private CommandExecutor_Race sut; private CommandSender consoleSender; private String consoleSenderName = "console"; private Player player; private String playerName = "player1"; @Before public void init(){ GenerateBukkitServer.generateServer(); GenerateRaces.generateRaces(); sut = new CommandExecutor_Race(); sut.addObserver(RacesAndClasses.getPlugin().getTutorialManager()); consoleSender = mock(CommandSender.class); when(consoleSender.getName()).thenReturn(consoleSenderName); player = mock(Player.class); when(player.getName()).thenReturn(playerName); when(RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig().isConfig_enableRaces()).thenReturn(true); } @After public void tearDown(){ GenerateRaces.dropMock(); GenerateBukkitServer.dropServer(); } @Test public void registering_command_works(){ String commandName = "race"; PluginCommand command = PluginCommandFactory.create(commandName, RacesAndClasses.getPlugin()); when(RacesAndClasses.getPlugin().getCommand(commandName)).thenReturn(command); sut = new CommandExecutor_Race(); Assert.assertEquals(command.getExecutor(), sut); } //Send help private void verifyHelp(CommandSender sender, boolean permissions, boolean wrongUse){ if(wrongUse){ verify(sender).sendMessage(ChatColor.RED + "Wrong usage. The correct usage is one of the following:"); }else{ verify(sender).sendMessage(ChatColor.RED + "Use one of the following commands:"); } verify(sender).sendMessage(ChatColor.RED + "/race " + ChatColor.LIGHT_PURPLE + "info"); verify(sender).sendMessage(ChatColor.RED + "/race " + ChatColor.LIGHT_PURPLE + "list"); verify(sender, permissions ? times(1) : never()).sendMessage(ChatColor.RED + "/race " + ChatColor.LIGHT_PURPLE + "select " + ChatColor.YELLOW + "<racename>"); verify(sender, permissions ? times(1) : never()).sendMessage(ChatColor.RED + "/race " + ChatColor.LIGHT_PURPLE + "change " + ChatColor.YELLOW + "<racename>"); } @Test public void test_help_with_no_permissions_from_console_sender(){ sut.onCommand(consoleSender, null, "", new String[] {}); verifyHelp(consoleSender, false, false); } @Test public void test_sending_wrong_command_sends_help_from_console_sender(){ sut.onCommand(consoleSender, null, "", new String[] {"wrongCommand"}); verifyHelp(consoleSender, false, true); } @Test public void test_help_with_permissions_from_console_sender(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissionsSilent(any(CommandSender.class), anyString())).thenReturn(true); sut.onCommand(consoleSender, null, "", new String[] {}); verifyHelp(consoleSender, true, false); } //Info command @Test public void test_info_with_console_sender(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); String command = "info"; sut.onCommand(consoleSender, null, "", new String[] {command}); verify(consoleSender).sendMessage(plugin_pre + race_not_exist); } @Test public void test_info_with_unknown_race_and_console_sender(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); String command = "info"; String raceToSelect = "Banane"; sut.onCommand(consoleSender, null, "", new String[] {command, raceToSelect}); verify(consoleSender).sendMessage(plugin_pre + race_not_exist); } @Test public void test_info_with_classes_present_from_console_sender(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); String command = "info"; String raceName = "race1"; List<String> raceList = new LinkedList<String>(); raceList.add(raceName); when(RacesAndClasses.getPlugin().getRaceManager().getAllHolderNames()).thenReturn(raceList); RaceContainer raceContainer = mock(RaceContainer.class); when(RacesAndClasses.getPlugin().getRaceManager().getHolderOfPlayer(consoleSenderName)).thenReturn(raceContainer); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName(raceName)).thenReturn(raceContainer); when(raceContainer.getName()).thenReturn(raceName); when(raceContainer.getTag()).thenReturn(raceName); when(raceContainer.getArmorString()).thenReturn("Armor"); sut.onCommand(consoleSender, null, "", new String[] {command}); verify(consoleSender).sendMessage(ChatColor.YELLOW + "Race name: " + ChatColor.LIGHT_PURPLE + raceContainer.getName()); verify(consoleSender).sendMessage(ChatColor.YELLOW + "Race tag: " + ChatColor.LIGHT_PURPLE + raceContainer.getTag()); verify(consoleSender).sendMessage(ChatColor.YELLOW + "Allowed armor: " + ChatColor.LIGHT_PURPLE + raceContainer.getArmorString()); verify(consoleSender).sendMessage(ChatColor.YELLOW + "=========" + ChatColor.RED + "Traits" + ChatColor.YELLOW + "========="); } //List command @Test public void test_list_with_console_sender(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); String command = "list"; sut.onCommand(consoleSender, null, "", new String[] {command}); verify(consoleSender).sendMessage(ChatColor.YELLOW + "======LIST OF RACES======"); verify(consoleSender).sendMessage(ChatColor.RED + "DefaultRace�e <-- " + your_race); } @Test public void test_list_with_multiple_races_console_sender(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); String command = "list"; List<String> raceList = new LinkedList<String>(); raceList.add("race1"); raceList.add("race2"); raceList.add("race3"); List<String> copiedList = new LinkedList<String>(raceList); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(copiedList); sut.onCommand(consoleSender, null, "", new String[] {command}); verify(consoleSender).sendMessage(ChatColor.YELLOW + "======LIST OF RACES======"); for(String race : raceList){ verify(consoleSender).sendMessage(ChatColor.BLUE + race); } verify(consoleSender).sendMessage(ChatColor.RED + "DefaultRace" + ChatColor.YELLOW +" <-- " + your_race); } @Test public void test_list_with_multiple_races_and_own_race_console_sender(){ String command = "list"; List<String> raceList = new LinkedList<String>(); raceList.add("race1"); raceList.add("race2"); raceList.add("race3"); List<String> copiedList = new LinkedList<String>(raceList); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(copiedList); RaceContainer raceContainer = mock(RaceContainer.class); when(RacesAndClasses.getPlugin().getRaceManager().getHolderOfPlayer(consoleSenderName)).thenReturn(raceContainer); when(raceContainer.getName()).thenReturn("race1"); sut.onCommand(consoleSender, null, "", new String[] {command}); verify(consoleSender).sendMessage(ChatColor.YELLOW + "======LIST OF RACES======"); verify(consoleSender).sendMessage(ChatColor.RED + "race1" + ChatColor.YELLOW +" <-- " + your_race); verify(consoleSender).sendMessage(ChatColor.BLUE + "race2"); verify(consoleSender).sendMessage(ChatColor.BLUE + "race3"); } @Test public void test_list_with_player_triggers_observer(){ String command = "list"; sut.onCommand(player, null, "", new String[] {command}); verify(RacesAndClasses.getPlugin().getTutorialManager()).update(any(CommandExecutor_Class.class), any(TutorialStepContainer.class)); } //selecting @Test public void test_select_with_console_sender_fails(){ String command = "select"; String race = "nothing"; sut.onCommand(consoleSender, null, "", new String[] {command, race}); verify(consoleSender).sendMessage(plugin_pre + "only_players"); } @Test public void test_player_opening_race_with_no_container_selection_screen(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); when(RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig().isConfig_useRaceGUIToSelect()).thenReturn(true); String command = "select"; List<String> raceList = new LinkedList<String>(); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(raceList); sut.onCommand(player, null, "", new String[] {command}); verify(player).sendMessage(plugin_pre + "no_race_to_select"); } @Test public void test_player_opening_race_selection_screen(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); when(RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig().isConfig_useRaceGUIToSelect()).thenReturn(true); String command = "select"; String raceName = "race1"; List<String> raceList = new LinkedList<String>(); raceList.add(raceName); RaceContainer classContainer = mock(RaceContainer.class, Mockito.RETURNS_DEEP_STUBS); when(classContainer.getName()).thenReturn(raceName); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName(raceName)).thenReturn(classContainer); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(raceList); sut.onCommand(player, null, "", new String[] {command}); verify(player).sendMessage(plugin_pre + "open_holder"); } @Test public void test_player_opening_race_selection_fails_because_already_has_race(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); when(RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig().isConfig_useRaceGUIToSelect()).thenReturn(true); String command = "select"; String raceName = "race1"; List<String> raceList = new LinkedList<String>(); raceList.add(raceName); RaceContainer classContainer = mock(RaceContainer.class, Mockito.RETURNS_DEEP_STUBS); when(classContainer.getName()).thenReturn(raceName); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName(raceName)).thenReturn(classContainer); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(raceList); when(RacesAndClasses.getPlugin().getRaceManager().getHolderOfPlayer(playerName)).thenReturn(classContainer); sut.onCommand(player, null, "", new String[] {command}); verify(player).sendMessage(plugin_pre + "already_have_race"); } //Changing @Test public void test_change_with_console_sender_fails(){ String command = "change"; String race = "nothing"; sut.onCommand(consoleSender, null, "", new String[] {command, race}); verify(consoleSender).sendMessage(plugin_pre + "only_players"); } @Test public void test_player_opening_race_changer_with_no_container_selected_screen(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); when(RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig().isConfig_useRaceGUIToSelect()).thenReturn(true); String command = "change"; List<String> raceList = new LinkedList<String>(); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(raceList); sut.onCommand(player, null, "", new String[] {command}); verify(player).sendMessage(plugin_pre + "no_race_selected"); } @Test public void test_player_opening_race_with_no_changeable_race_fails(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); when(RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig().isConfig_useRaceGUIToSelect()).thenReturn(true); String command = "change"; String raceName = "race1"; List<String> raceList = new LinkedList<String>(); RaceContainer raceContainer = mock(RaceContainer.class, Mockito.RETURNS_DEEP_STUBS); when(raceContainer.getName()).thenReturn(raceName); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName(raceName)).thenReturn(raceContainer); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(raceList); when(RacesAndClasses.getPlugin().getRaceManager().getHolderOfPlayer(playerName)).thenReturn(raceContainer); sut.onCommand(player, null, "", new String[] {command}); verify(player).sendMessage(plugin_pre + "no_race_to_select"); } @Test public void test_player_opening_race_change_success_because_already_has_race(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); when(RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig().isConfig_useRaceGUIToSelect()).thenReturn(true); String command = "change"; String raceName = "race1"; List<String> raceList = new LinkedList<String>(); raceList.add(raceName); RaceContainer raceContainer = mock(RaceContainer.class, Mockito.RETURNS_DEEP_STUBS); when(raceContainer.getName()).thenReturn(raceName); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName(raceName)).thenReturn(raceContainer); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(raceList); when(RacesAndClasses.getPlugin().getRaceManager().getHolderOfPlayer(playerName)).thenReturn(raceContainer); sut.onCommand(player, null, "", new String[] {command}); verify(player).sendMessage(plugin_pre + "open_holder"); } //////////////////////// //CHAT INTERACTION // //////////////////////// //selecting @Test public void test_select_with_console_sender_fails_chat(){ String command = "select"; String race = "nothing"; sut.onCommand(consoleSender, null, "", new String[] {command, race}); verify(consoleSender).sendMessage(plugin_pre + "only_players"); } @Test public void test_player_selecting_race_with_no_container_chat(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); String command = "select"; List<String> raceList = new LinkedList<String>(); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(raceList); sut.onCommand(player, null, "", new String[] {command}); verify(player).sendMessage(plugin_pre + "needs_1_arg"); } @Test public void test_player_selecting_race_chat(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); String command = "select"; String raceName = "race1"; List<String> raceList = new LinkedList<String>(); raceList.add(raceName); RaceContainer raceContainer = mock(RaceContainer.class, Mockito.RETURNS_DEEP_STUBS); when(raceContainer.getName()).thenReturn(raceName); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName(raceName)).thenReturn(raceContainer); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(raceList); when(RacesAndClasses.getPlugin().getRaceManager().addPlayerToHolder(anyString(), anyString(), anyBoolean())).thenReturn(true); sut.onCommand(player, null, "", new String[] {command, raceName}); verify(player).sendMessage(plugin_pre + race_changed_to); } @Test public void test_player_selecting_race_chat_fails_because_already_has_race(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); String command = "select"; String raceName = "race1"; List<String> classList = new LinkedList<String>(); classList.add(raceName); RaceContainer raceContainer = mock(RaceContainer.class, Mockito.RETURNS_DEEP_STUBS); when(raceContainer.getName()).thenReturn(raceName); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName(raceName)).thenReturn(raceContainer); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(classList); when(RacesAndClasses.getPlugin().getRaceManager().getHolderOfPlayer(playerName)).thenReturn(raceContainer); sut.onCommand(player, null, "", new String[] {command, raceName}); verify(player).sendMessage(plugin_pre + already_have_race); } @Test public void test_player_selecting_race_chat_fails_because_not_exist_has_class(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); String command = "select"; String raceName = "race1"; List<String> raceList = new LinkedList<String>(); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(raceList); sut.onCommand(player, null, "", new String[] {command, raceName}); verify(player).sendMessage(plugin_pre + "race_not_exist"); } //changing @Test public void test_change_with_console_sender_fails_chat(){ String command = "change"; String race = "nothing"; sut.onCommand(consoleSender, null, "", new String[] {command, race}); verify(consoleSender).sendMessage(plugin_pre + "only_players"); } @Test public void test_player_changing_race_with_no_container_chat(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); String command = "change"; List<String> raceList = new LinkedList<String>(); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(raceList); sut.onCommand(player, null, "", new String[] {command}); verify(player).sendMessage(plugin_pre + "needs_1_arg"); } @Test public void test_player_changing_race_chat(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); when(RacesAndClasses.getPlugin().getRaceManager().changePlayerHolder(anyString(), anyString(), anyBoolean())).thenReturn(true); String command = "change"; String raceName = "race1"; String currentRace = "race2"; List<String> raceList = new LinkedList<String>(); raceList.add(raceName); RaceContainer raceContainer = mock(RaceContainer.class, Mockito.RETURNS_DEEP_STUBS); when(raceContainer.getName()).thenReturn(raceName); RaceContainer raceContainerCurrent = mock(RaceContainer.class, Mockito.RETURNS_DEEP_STUBS); when(raceContainer.getName()).thenReturn(currentRace); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName(raceName)).thenReturn(raceContainer); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName(currentRace)).thenReturn(raceContainerCurrent); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(raceList); when(RacesAndClasses.getPlugin().getRaceManager().getHolderOfPlayer(playerName)).thenReturn(raceContainerCurrent); when(RacesAndClasses.getPlugin().getRaceManager().addPlayerToHolder(anyString(), anyString(), anyBoolean())).thenReturn(true); sut.onCommand(player, null, "", new String[] {command, raceName}); verify(player).sendMessage(plugin_pre + race_changed_to); } @Test public void test_player_changing_to_same_race_chat_fails(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); String command = "change"; String raceName = "race1"; List<String> raceList = new LinkedList<String>(); raceList.add(raceName); RaceContainer raceContainer = mock(RaceContainer.class, Mockito.RETURNS_DEEP_STUBS); when(raceContainer.getName()).thenReturn(raceName); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName(raceName)).thenReturn(raceContainer); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(raceList); when(RacesAndClasses.getPlugin().getRaceManager().getHolderOfPlayer(playerName)).thenReturn(raceContainer); when(RacesAndClasses.getPlugin().getRaceManager().addPlayerToHolder(anyString(), anyString(), anyBoolean())).thenReturn(true); sut.onCommand(player, null, "", new String[] {command, raceName}); verify(player).sendMessage(already_are); } @Test public void test_player_changing_race_chat_fails_because_has_no_race(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); String command = "change"; String raceName = "race1"; List<String> raceList = new LinkedList<String>(); raceList.add(raceName); RaceContainer raceContainer = mock(RaceContainer.class, Mockito.RETURNS_DEEP_STUBS); when(raceContainer.getName()).thenReturn(raceName); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName(raceName)).thenReturn(raceContainer); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(raceList); when(RacesAndClasses.getPlugin().getRaceManager().getHolderOfPlayer(playerName)).thenReturn(null); sut.onCommand(player, null, "", new String[] {command, raceName}); verify(player).sendMessage(plugin_pre + no_race_selected); } @Test public void test_player_changing_race_chat_fails_because_not_exist_race(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); String command = "change"; String raceName = "race1"; RaceContainer raceContainer = mock(RaceContainer.class, Mockito.RETURNS_DEEP_STUBS); when(RacesAndClasses.getPlugin().getRaceManager().getHolderOfPlayer(playerName)).thenReturn(raceContainer); sut.onCommand(player, null, "", new String[] {command, raceName}); verify(player).sendMessage(plugin_pre + race_not_exist); } @Test public void test_player_changing_race_chat_without_permissions_fails(){ String command = "change"; String className = "race1"; when(RacesAndClasses.getPlugin().getRaceManager().getHolderOfPlayer(playerName)).thenReturn(null); sut.onCommand(player, null, "", new String[] {command, className}); verify(RacesAndClasses.getPlugin().getPermissionManager()).checkPermissions(any(CommandSender.class), anyString()); } }