Skip to content

Commit

Permalink
merged #ft-389-spec-metadata. Reimplemented all html-reports
Browse files Browse the repository at this point in the history
  • Loading branch information
ishubin committed Aug 15, 2018
1 parent 4a6c6ef commit fd9d5d3
Show file tree
Hide file tree
Showing 60 changed files with 13,718 additions and 10,288 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,9 @@ public void dumpPage(Browser browser, PageSpec pageSpec, String reportFolderPath
pageDump.setPageName(pageName);
exportAsJson(pageDump, new File(reportFolder.getAbsoluteFile() + File.separator + "page.json"));
exportAsHtml(pageDump, pageName, new File(reportFolder.getAbsoluteFile() + File.separator + "page.html"));
copyResource("/html-report/jquery-1.11.2.min.js", new File(reportFolder.getAbsolutePath() + File.separator + "jquery-1.11.2.min.js"));
copyResource("/pagedump/galen-pagedump.js", new File(reportFolder.getAbsolutePath() + File.separator + "galen-pagedump.js"));
copyResource("/pagedump/galen-pagedump.css", new File(reportFolder.getAbsolutePath() + File.separator + "galen-pagedump.css"));
copyResource("/html-report/vue.js", new File(reportFolder.getAbsolutePath() + File.separator + "vue.js"));
copyResource("/html-report/galen-report.js", new File(reportFolder.getAbsolutePath() + File.separator + "galen-report.js"));
copyResource("/html-report/galen-report.css", new File(reportFolder.getAbsolutePath() + File.separator + "galen-report.css"));
}

exportAllScreenshots(pageDump, browser, reportFolder);
Expand Down Expand Up @@ -151,7 +151,7 @@ public void exportAsHtml(PageDump pageDump, String title, File file) throws IOEx
ObjectMapper objectMapper = new ObjectMapper();
String jsonText = objectMapper.writeValueAsString(pageDump);

String template = IOUtils.toString(getClass().getResourceAsStream("/pagedump/page.html"));
String template = IOUtils.toString(getClass().getResourceAsStream("/html-report/page-dump.tpl.html"));

String htmlText = template.replace("${title}", title);
htmlText = htmlText.replace("${json}", jsonText);
Expand Down
15 changes: 15 additions & 0 deletions galen-core/src/main/java/com/galenframework/page/Rect.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import static java.lang.String.format;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.galenframework.specs.Side;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

Expand Down Expand Up @@ -225,5 +226,19 @@ public Rect drag(int offsetLeft, int offsetTop) {
public Rect distort(int offsetLeft, int offsetTop, int offsetWidth, int offsetHeight) {
return new Rect(left + offsetLeft, top + offsetTop, width + offsetWidth, height + offsetHeight);
}

public int getEdgePosition(Side edge) {
if (edge == Side.LEFT) {
return getLeft();
} else if (edge == Side.RIGHT) {
return getRight();
} else if (edge == Side.TOP) {
return getTop();
} else if (edge == Side.BOTTOM) {
return getBottom();
} else {
throw new IllegalArgumentException("Unknown edge: " + edge);
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,9 @@
public class HtmlReportBuilder {
private static final String[] resources = new String[]{
"galen-report.js",
"handlebars-v2.0.0.js",
"icon-sprites.png",
"jquery-1.11.2.min.js",
"report.css",
"tablesorter.css",
"tablesorter.js"
"galen-report.css",
"vue.js"
};


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,8 @@ private void addResultToSpec(LayoutSpec spec, ValidationResult result) {
currentReport().putObjects(result.getValidationObjects());
spec.setHighlight(convertToObjectNames(result.getValidationObjects()));

spec.setMeta(result.getMeta());

if (result.getError() != null) {
spec.setErrors(result.getError().getMessages());
if (result.getError().isOnlyWarn()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.galenframework.reports.json;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;

public class ToStringSerializer extends JsonSerializer {
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(o.toString());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
package com.galenframework.reports.model;


import com.galenframework.specs.Side;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;

public class LayoutMeta {

private ObjectEdge from;
private ObjectEdge to;
private String expectedDistance;
private String realDistance;

public ObjectEdge getFrom() {
return from;
}

public void setFrom(ObjectEdge from) {
this.from = from;
}

public ObjectEdge getTo() {
return to;
}

public void setTo(ObjectEdge to) {
this.to = to;
}

public String getExpectedDistance() {
return expectedDistance;
}

public void setExpectedDistance(String expectedDistance) {
this.expectedDistance = expectedDistance;
}

public String getRealDistance() {
return realDistance;
}

public void setRealDistance(String realDistance) {
this.realDistance = realDistance;
}


public LayoutMeta() {
}

public LayoutMeta(ObjectEdge from, ObjectEdge to, String expectedDistance, String realDistance) {
this.from = from;
this.to = to;
this.expectedDistance = expectedDistance;
this.realDistance = realDistance;
}

public static class ObjectEdge {
private String object;
private Side edge;

public ObjectEdge() {
}

public ObjectEdge(String object, Side edge) {
this.object = object;
this.edge = edge;
}

public Side getEdge() {
return edge;
}

public void setEdge(Side edge) {
this.edge = edge;
}

public String getObject() {
return object;
}

public void setObject(String object) {
this.object = object;
}

@Override
public String toString() {
return new ToStringBuilder(this)
.append("object", object)
.append("edge", edge)
.toString();
}

@Override
public boolean equals(Object o) {
if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

ObjectEdge that = (ObjectEdge) o;

return new EqualsBuilder()
.append(object, that.object)
.append(edge, that.edge)
.isEquals();
}

@Override
public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(object)
.append(edge)
.toHashCode();
}
}


public static LayoutMeta distance(String firstObject, Side firstEdge, String secondObject, Side secondEdge, String expectedDistance, String realDistance) {
return new LayoutMeta(new ObjectEdge(firstObject, firstEdge), new ObjectEdge(secondObject, secondEdge), expectedDistance, realDistance);
}

@Override
public String toString() {
return new ToStringBuilder(this)
.append("from", from)
.append("to", to)
.append("expectedDistance", expectedDistance)
.append("realDistance", realDistance)
.toString();
}

@Override
public boolean equals(Object o) {
if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

LayoutMeta that = (LayoutMeta) o;

return new EqualsBuilder()
.append(from, that.from)
.append(to, that.to)
.append(expectedDistance, that.expectedDistance)
.append(realDistance, that.realDistance)
.isEquals();
}

@Override
public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(from)
.append(to)
.append(expectedDistance)
.append(realDistance)
.toHashCode();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public class LayoutSpec {
private Place place;
private String name;
private List<String> errors;
private List<LayoutMeta> meta;

// List of object names to be highlighted in report
private List<String> highlight = new LinkedList<>();
Expand Down Expand Up @@ -92,4 +93,12 @@ public LayoutImageComparison getImageComparison() {
public void setImageComparison(LayoutImageComparison imageComparison) {
this.imageComparison = imageComparison;
}

public List<LayoutMeta> getMeta() {
return meta;
}

public void setMeta(List<LayoutMeta> meta) {
this.meta = meta;
}
}
19 changes: 18 additions & 1 deletion galen-core/src/main/java/com/galenframework/specs/Side.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,13 @@
import java.util.Arrays;
import java.util.List;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.galenframework.parser.SyntaxException;
import com.galenframework.reports.json.ToStringSerializer;

import static java.lang.String.format;

@JsonSerialize(using = ToStringSerializer.class)
public enum Side {

LEFT, RIGHT, TOP, BOTTOM;
Expand Down Expand Up @@ -60,5 +63,19 @@ public String toString() {
public static List<Side> sides(Side...sides) {
return Arrays.asList(sides);
}


public Side opposite() {
switch (this) {
case LEFT:
return RIGHT;
case RIGHT:
return LEFT;
case TOP:
return BOTTOM;
case BOTTOM:
return TOP;
default:
throw new IllegalStateException("Don't know opposite side for: " + this.toString());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package com.galenframework.validation;

import com.galenframework.page.Rect;
import com.galenframework.reports.model.LayoutMeta;
import com.galenframework.specs.Range;
import com.galenframework.specs.RangeValue;
import com.galenframework.specs.Side;

import static java.lang.String.format;

/**
* This class is used in order to validate distance between edges of two objects.
* It is used by different specs so that it can also construct layout meta for each validation
*/
public class MetaBasedValidation {
private final String firstObject;
private final String secondObject;
private final Range expectedRange;
private Side firstEdge = Side.LEFT;
private Side secondEdge = Side.LEFT;
private boolean isInverted = false;

private MetaBasedValidation(String firstObject, String secondObject, Range expectedRange) {

this.firstObject = firstObject;
this.secondObject = secondObject;
this.expectedRange = expectedRange;
}

public static MetaBasedValidation forObjectsWithRange(String firstObject, String secondObject, Range expectedRange) {
return new MetaBasedValidation(firstObject, secondObject, expectedRange);
}

public MetaBasedValidation withBothEdges(Side side) {
this.firstEdge = side;
this.secondEdge = side;
return this;
}


public SimpleValidationResult validate(Rect firstArea, Rect secondArea, PageValidation pageValidation, String direction) {
int offset = getOffset(firstArea, secondArea);
double calculatedOffset = pageValidation.convertValue(expectedRange, offset);

;
if (!expectedRange.holds(calculatedOffset)) {
if (expectedRange.isPercentage()) {
int precision = expectedRange.findPrecision();


String actualDistance = format("%s%% [%dpx]", new RangeValue(calculatedOffset, precision).toString(), offset);
return SimpleValidationResult.error(
format("%s %s", actualDistance, direction),
LayoutMeta.distance(firstObject, firstEdge, secondObject, secondEdge, expectedRange.prettyString("%"), actualDistance)
);
} else {
return SimpleValidationResult.error(
format("%dpx %s", offset, direction),
LayoutMeta.distance(firstObject, firstEdge, secondObject, secondEdge, expectedRange.prettyString(), offset + "px")
);
}
}
return SimpleValidationResult.success(LayoutMeta.distance(firstObject, firstEdge, secondObject, secondEdge, expectedRange.prettyString(), offset + "px"));
}

private int getOffset(Rect firstArea, Rect secondArea) {
int offset = firstArea.getEdgePosition(firstEdge) - secondArea.getEdgePosition(secondEdge);
if (isInverted) {
return -offset;
} else {
return offset;
}
}

public MetaBasedValidation withInvertedCalculation(boolean isInverted) {
this.isInverted = isInverted;
return this;
}

public MetaBasedValidation withFirstEdge(Side firstEdge) {
this.firstEdge = firstEdge;
return this;
}

public MetaBasedValidation withSecondEdge(Side secondEdge) {
this.secondEdge = secondEdge;
return this;
}
}
Loading

0 comments on commit fd9d5d3

Please sign in to comment.