/* * DataTest.java * Copyright James Dempsey, 2013 * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Created on 23/05/2013 7:02:42 AM * * $Id$ */ package pcgen.persistence.lst; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.logging.LogRecord; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.SystemUtils; import org.junit.AfterClass; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import pcgen.core.Campaign; import pcgen.core.GameMode; import pcgen.core.Globals; import pcgen.core.SettingsHandler; import pcgen.core.SystemCollections; import pcgen.facade.core.CampaignFacade; import pcgen.facade.core.SourceSelectionFacade; import pcgen.facade.core.UIDelegate; import pcgen.gui2.facade.MockUIDelegate; import pcgen.persistence.CampaignFileLoader; import pcgen.persistence.GameModeFileLoader; import pcgen.persistence.SourceFileLoader; import pcgen.system.ConfigurationSettings; import pcgen.system.FacadeFactory; import pcgen.system.Main; import pcgen.system.PCGenSettings; import pcgen.system.PCGenTask; import pcgen.system.PCGenTaskEvent; import pcgen.system.PCGenTaskListener; import pcgen.system.PropertyContextFactory; import pcgen.util.Logging; import pcgen.util.TestHelper; /** * The Class <code>DataLoadTest</code> checks each basic source for errors on load. * * <br/> * * @author James Dempsey <jdempsey@users.sourceforge.net> */ @RunWith(Parameterized.class) public class DataLoadTest implements PCGenTaskListener { /** The name of our dummy config file. */ private static final String TEST_CONFIG_FILE = "config.ini.junit"; /** A list of sources that are currently broken, but are lower priority. * These should be activated when the data team is ready. */ private static String[] excludedSources = new String[]{}; private List<LogRecord> errors = new ArrayList<>(); private SourceSelectionFacade sourceSelection; /** * Tidy up the config file we created. */ @AfterClass public static void afterClass() { new File(TEST_CONFIG_FILE).delete(); } /** * Build the list of sources to be checked. Also initialises the plugins and * loads the game mode and campaign files. */ @Parameters(name = "{1}") public static Collection<Object[]> data() { // Set things up loadGameModes(); SettingsHandler.setOutputDeprecationMessages(false); SettingsHandler.setInputUnconstructedMessages(false); PCGenSettings.OPTIONS_CONTEXT.setBoolean( PCGenSettings.OPTION_ALLOW_OVERRIDE_DUPLICATES, true); List<String> exclusions = Arrays.asList(excludedSources); List<SourceSelectionFacade> basicSources = getBasicSources(); assertFalse("No sources found", basicSources.isEmpty()); List<Object[]> params = new ArrayList<>(); for (SourceSelectionFacade ssf : basicSources) { String testName = ssf.toString().replaceAll("[\\(\\)]", "_"); if (!exclusions.contains(testName)) { params.add(new Object[]{ssf, testName}); } } return params; } /** * Create a parameterised instance of the test class for a specific source. * @param sourceSelection The basic source we will be testing. * @param testName The display name, needs to be sanitised for IDE display. */ public DataLoadTest(SourceSelectionFacade sourceSelection, String testName) { this.sourceSelection = sourceSelection; } /** * Test the load of the current source. This will check for any load errors or warnings but ignores deprecation warnings. */ @Test public void testLoadSources() { UIDelegate uiDelegate = new MockUIDelegate(); SourceFileLoader loader = new SourceFileLoader(sourceSelection, uiDelegate); errors = new ArrayList<>(); loader.addPCGenTaskListener(this); loader.execute(); List<String> errorList = new ArrayList<>(); List<String> warningList = new ArrayList<>(); for (LogRecord logRecord : errors) { if (logRecord.getLevel().intValue() > Logging.WARNING.intValue()) { errorList.add(logRecord.getMessage()); } else if (logRecord.getLevel().intValue() > Logging.INFO.intValue()) { warningList.add(logRecord.getMessage()); } } assertEquals("Errors encountered while loading " + sourceSelection, "", StringUtils.join(errorList, ",\n")); assertEquals("Warnings encountered while loading " + sourceSelection, "", StringUtils.join(errorList, ",\n")); } private static void loadGameModes() { String configFolder = "testsuite"; String pccLoc = TestHelper.findDataFolder(); System.out.println("Got data folder of " + pccLoc); try { TestHelper.createDummySettingsFile(TEST_CONFIG_FILE, configFolder, pccLoc); } catch (IOException e) { Logging.errorPrint("DataTest.loadGameModes failed", e); } PropertyContextFactory configFactory = new PropertyContextFactory(SystemUtils.USER_DIR); configFactory.registerAndLoadPropertyContext(ConfigurationSettings .getInstance(TEST_CONFIG_FILE)); Main.loadProperties(false); PCGenTask loadPluginTask = Main.createLoadPluginTask(); loadPluginTask.execute(); GameModeFileLoader gameModeFileLoader = new GameModeFileLoader(); gameModeFileLoader.execute(); CampaignFileLoader campaignFileLoader = new CampaignFileLoader(); campaignFileLoader.execute(); } private static List<SourceSelectionFacade> getBasicSources() { List<SourceSelectionFacade> basicSources = new ArrayList<>(); for (Campaign campaign : Globals.getCampaignList()) { if (campaign.showInMenu()) { SourceSelectionFacade sourceSelection = FacadeFactory.createSourceSelection(campaign.getGameModes() .getElementAt(0), Collections.singletonList(campaign), campaign.getName()); basicSources.add(sourceSelection); } } for (GameMode mode : SystemCollections.getUnmodifiableGameModeList()) { String title = mode.getDefaultSourceTitle(); if (title == null && !mode.getDefaultDataSetList().isEmpty()) { title = mode.getName(); } if (!mode.getDefaultDataSetList().isEmpty()) { List<CampaignFacade> qcamps = new ArrayList<>(); List<String> sources = mode.getDefaultDataSetList(); for (String string : sources) { Campaign camp = Globals.getCampaignKeyed(string); assertNotNull("Cannot find source " + string + " for game mode " + mode, camp); qcamps.add(camp); } basicSources.add(FacadeFactory.createSourceSelection( mode, qcamps, mode.getDefaultSourceTitle())); } } return basicSources; } @Override public void progressChanged(PCGenTaskEvent event) { // Ignore } /** * Record any log messages written by the source load. */ @Override public void errorOccurred(PCGenTaskEvent event) { errors.add(event.getErrorRecord()); } }