/*******************************************************************************
* Copyright 2017 Ivan Shubin http://galenframework.com
*
* 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 com.galenframework.reports;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
import com.galenframework.reports.model.*;
import com.galenframework.reports.nodes.TestReportNode;
import com.galenframework.specs.page.PageSection;
import com.galenframework.validation.*;
import com.galenframework.specs.Spec;
import com.galenframework.suite.GalenPageAction;
public class LayoutReportListener implements ValidationListener {
private Stack<LayoutReportStack> reportStack = new Stack<>();
private LayoutReport rootLayoutReport;
public LayoutReportListener(LayoutReport layoutReport) {
this.rootLayoutReport = layoutReport;
reportStack.push(new LayoutReportStack(layoutReport));
}
@Override
public void onBeforeSection(PageValidation pageValidation, PageSection pageSection) {
currentReport().pushSection(pageSection);
}
@Override
public void onAfterSection(PageValidation pageValidation, PageSection pageSection) {
currentReport().popSection();
}
@Override
public void onSubLayout(PageValidation pageValidation, String objectName) {
LayoutReport subLayout = new LayoutReport();
currentReport().getCurrentSpec().setSubLayout(subLayout);
reportStack.push(new LayoutReportStack(subLayout));
}
@Override
public void onAfterSubLayout(PageValidation pageValidation, String objectName) {
reportStack.pop();
}
@Override
public void onObject(PageValidation pageValidation, String objectName) {
// Searching for the same object if it was already reported
LayoutObject object = currentSection().findObject(objectName);
if (object == null) {
object = new LayoutObject();
object.setName(objectName);
currentSection().getObjects().add(object);
}
currentReport().setCurrentObject(object);
}
@Override
public void onAfterObject(PageValidation pageValidation, String objectName) {
}
@Override
public void onBeforeSpec(PageValidation pageValidation, String objectName, Spec originalSpec) {
LayoutSpec spec = new LayoutSpec();
spec.setPlace(originalSpec.getPlace());
spec.setName(originalSpec.getOriginalText());
if (originalSpec.getAlias() != null) {
LayoutSpecGroup group = new LayoutSpecGroup();
group.setName(originalSpec.getAlias());
group.addSpec(spec);
currentReport().getCurrentObject().addSpecGroup(group);
} else {
currentReport().getCurrentSpecCollector().add(spec);
}
currentReport().setCurrentSpec(spec);
}
@Override
public void onSpecSuccess(PageValidation pageValidation, String objectName, Spec originalSpec, ValidationResult result) {
LayoutSpec spec = currentReport().getCurrentSpec();
addResultToSpec(spec, result);
}
@Override
public void onSpecError(PageValidation pageValidation, String objectName, Spec originalSpec, ValidationResult result) {
LayoutSpec spec = currentReport().getCurrentSpec();
addResultToSpec(spec, result);
if (originalSpec.isOnlyWarn()) {
spec.setStatus(TestReportNode.Status.WARN);
}
try {
if (result.getError().getImageComparison() != null) {
spec.setImageComparison(convertImageComparison(objectName, result.getError().getImageComparison()));
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onSpecGroup(PageValidation pageValidation, String specGroupName) {
LayoutSpecGroup specGroup = new LayoutSpecGroup();
specGroup.setName(specGroupName);
specGroup.setSpecs(new LinkedList<LayoutSpec>());
currentReport().getCurrentObject().addSpecGroup(specGroup);
currentReport().setCurrentSpecCollector(specGroup.getSpecs());
}
@Override
public void onAfterSpecGroup(PageValidation pageValidation, String specGroupName) {
currentReport().setCurrentSpecCollector(currentReport().getCurrentObject().getSpecs());
}
private LayoutImageComparison convertImageComparison(String objectName, ImageComparison imageComparison) throws IOException {
LayoutImageComparison layoutImageComparison = new LayoutImageComparison();
layoutImageComparison.setActualImage(rootLayoutReport.registerImageFile(objectName + "-actual", imageComparison.getOriginalFilteredImage()));
layoutImageComparison.setExpectedImage(rootLayoutReport.registerImageFile(objectName + "-expected", imageComparison.getSampleFilteredImage()));
layoutImageComparison.setComparisonMapImage(rootLayoutReport.registerImageFile(objectName + "-map", imageComparison.getComparisonMap()));
return layoutImageComparison;
}
private List<String> convertToObjectNames(List<ValidationObject> validationObjects) {
List<String> names = new LinkedList<>();
if (validationObjects != null) {
for (ValidationObject validationObject : validationObjects) {
names.add(validationObject.getName());
}
}
return names;
}
@Override
public void onGlobalError(Exception e) {
// not needed here
}
@Override
public void onBeforePageAction(GalenPageAction action) {
// not needed here
}
@Override
public void onAfterPageAction(GalenPageAction action) {
// not needed here
}
private LayoutReportStack currentReport() {
return reportStack.peek();
}
private LayoutSection currentSection() {
return reportStack.peek().peekSection();
}
private void addResultToSpec(LayoutSpec spec, ValidationResult result) {
currentReport().putObjects(result.getValidationObjects());
spec.setHighlight(convertToObjectNames(result.getValidationObjects()));
if (result.getError() != null) {
spec.setErrors(result.getError().getMessages());
if (result.getError().isOnlyWarn()) {
spec.setStatus(TestReportNode.Status.WARN);
} else {
spec.setStatus(TestReportNode.Status.ERROR);
}
}
}
}