/*
* Copyright or © or Copr. Amaury Carrade (2014 - 2016)
*
* http://amaury.carrade.eu
*
* This software is governed by the CeCILL-B license under French law and
* abiding by the rules of distribution of free software. You can use,
* modify and/ or redistribute the software under the terms of the CeCILL-B
* license as circulated by CEA, CNRS and INRIA at the following URL
* "http://www.cecill.info".
*
* As a counterpart to the access to the source code and rights to copy,
* modify and redistribute granted by the license, users are provided only
* with a limited warranty and the software's author, the holder of the
* economic rights, and the successive licensors have only limited
* liability.
*
* In this respect, the user's attention is drawn to the risks associated
* with loading, using, modifying and/or developing or reproducing the
* software by the user in light of its specific status of free software,
* that may mean that it is complicated to manipulate, and that also
* therefore means that it is reserved for developers and experienced
* professionals having in-depth computer knowledge. Users are therefore
* encouraged to load and test the software's suitability as regards their
* requirements in conditions enabling the security of their systems and/or
* data to be ensured and, more generally, to use and operate it in the
* same conditions as regards security.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-B license and that you accept its terms.
*/
package eu.carrade.amaury.UHCReloaded.commands;
import eu.carrade.amaury.UHCReloaded.TestsUtils;
import eu.carrade.amaury.UHCReloaded.UHCReloaded;
import eu.carrade.amaury.UHCReloaded.commands.core.AbstractCommand;
import eu.carrade.amaury.UHCReloaded.commands.core.AbstractCommandExecutor;
import eu.carrade.amaury.UHCReloaded.commands.core.annotations.Command;
import fr.zcraft.zlib.components.i18n.I;
import fr.zcraft.zlib.components.i18n.I18n;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.util.HashSet;
import java.util.Set;
@RunWith(PowerMockRunner.class)
@PrepareForTest({UHCReloaded.class, I18n.class, I.class})
public class TestCommandsAnnotation
{
@Test
public void testCommandAnnotationIsPresentEverywhere()
{
TestsUtils.mockStaticPlugin();
TestsUtils.mockI18n();
TestsUtils.mockConfig();
// Data
Set<AbstractCommandExecutor> executors = new HashSet<>();
executors.add(new UHCommandExecutor(TestsUtils.getMockedPluginInstance()));
// Tests
for(AbstractCommandExecutor executor : executors)
for (AbstractCommand command : executor.getMainCommands().values())
testCommandAnnotationIsPresentEverywhere(command);
}
/**
* Recursively tests if the command annotation is present on every registered class.
*
* @param command The command to start with.
*/
private void testCommandAnnotationIsPresentEverywhere(AbstractCommand command)
{
Assert.assertTrue("Missing command annotation for the class " + command.getClass().getCanonicalName(), command.getClass().isAnnotationPresent(Command.class));
for(AbstractCommand subCommand : command.getSubcommands().values())
{
testCommandAnnotationIsPresentEverywhere(subCommand);
}
}
}