package br.gov.frameworkdemoiselle.behave.regression.report; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.maven.plugin.logging.Log; import org.apache.maven.plugin.logging.SystemStreamLog; import br.gov.frameworkdemoiselle.behave.exception.BehaveException; import br.gov.frameworkdemoiselle.behave.regression.Result; import br.gov.frameworkdemoiselle.behave.regression.report.exception.BehaveRegressionReportException; import br.gov.frameworkdemoiselle.behave.regression.report.imagemagick.ImageMagickCompare; import br.gov.frameworkdemoiselle.behave.regression.repository.FactoryRepository; public class ReportContext { private ReportConfig config; private static Log log; public Log getLog() { if (log == null) { log = new SystemStreamLog(); } return log; } public void run(File target) { // Carrega as configurações config = new ReportConfig(target, getLog()); String enabled = config.getProperty("behave.regression.enabled"); if (enabled != null && Boolean.parseBoolean(enabled)) { String defaultType = config.getProperty("behave.regression.defaultType"); if (defaultType == null) throw new BehaveRegressionReportException("Deve ser informado um navegador (Type) padrão para comparação."); // Verifica se o defaultType existe nos Locations List<String> locationsListForVerifyDefault = FactoryRepository.getInstance().getLocations(); defaultType = (defaultType.indexOf("/") == -1) ? "/" + defaultType : defaultType; if (locationsListForVerifyDefault.indexOf(defaultType) == -1) throw new BehaveRegressionReportException("O navegador parão (Default Type) deve existir nos Locations para comparação."); defaultType = defaultType.replaceAll("^/", ""); List<Result> defaultTypeResults = FactoryRepository.getInstance().getResulstByLocation(defaultType); List<File> expectedFilesList = new ArrayList<File>(); ArrayList<List<File>> browserFilesList = new ArrayList<List<File>>(); List<String> types = new ArrayList<String>(); getLog().info("Default Type/Location: " + defaultType); for (Result res : defaultTypeResults) { getLog().info("Default Type => Location: " + res.getFile().getAbsolutePath()); expectedFilesList.add(res.getFile()); } // Outros locations para comparação List<String> locationsList = FactoryRepository.getInstance().getLocations(); for (String location : locationsList) { List<File> actualFilesList = new ArrayList<File>(); String actualType = location.replaceAll("^/", ""); // Se for o navegador padrão ele pula if (defaultType != null && defaultType.equals(actualType)) continue; types.add(location); getLog().info("Location: " + location); List<Result> results = FactoryRepository.getInstance().getResulstByLocation(location); for (Result res : results) { if (res.getFile() != null) { getLog().info("Location: " + res.getFile().getAbsolutePath()); actualFilesList.add(res.getFile()); } } if (actualFilesList.size() != expectedFilesList.size()) throw new BehaveException("Erro: os arrays não tem a mesma quantidade de cópias de tela! actualFilesList: " + actualFilesList.size() + " / expectedFilesList: " + expectedFilesList.size()); browserFilesList.add(actualFilesList); } // Faz todas as comparações ImageMagickCompare comp = new ImageMagickCompare(config, getLog()); comp.compareAndCaptureResultsWithLists(types, browserFilesList, defaultType, expectedFilesList); } else { getLog().info("Funcionalidade de teste de regressão de layout desativada."); } } }