package de.cologneintelligence.fitgoodies.htmlparser; import de.cologneintelligence.fitgoodies.Counts; import org.jsoup.nodes.Element; import org.jsoup.nodes.TextNode; public class FitCell { private final FitRow row; private final Element td; private State state = State.NONE; private String actual; private String info; public FitCell(FitRow fitRow, Element td) { this.row = fitRow; this.td = td; } public FitRow getRow() { return row; } public Element getTd() { return td; } public String getFitValue() { if (td.hasAttr("data-fit-value")) { return td.attr(Constants.ATTR_VALUE); } else { return td.html(); } } public void finishExecution(Counts counts) { if (state != State.NONE) { td.addClass(state.cssClass); switch (state) { case WRONG: counts.wrong++; break; case RIGHT: counts.right++; break; case EXCEPTION: counts.exceptions++; break; case IGNORED: counts.ignores++; break; } } if (actual != null || info != null) { String html = "<span class=\"fit-expected\">" + td.html() + "</span>"; if (actual != null) { html += " <span class=\"fit-info\">(expected)</span><br>"; if (state != State.EXCEPTION) { html += " <span class=\"fit-actual\">" + actual + "</span>"; html += " <span class=\"fit-info\">(actual)</span>"; } else { html += " <span class=\"fit-actual-exception\">" + actual + "</span>"; html += " <span class=\"fit-info\">(exception)</span>"; } } if (info != null) { html += "<br><span class=\"fit-info\">[" + info + "]</span>"; } td.html(html); } } public void right() { right(null, null); } public void right(String actual) { right(actual, null); } public void right(String actual, String info) { this.state = State.RIGHT; this.actual = actual; info(info); } public void exception(Throwable t) { this.state = State.EXCEPTION; this.actual = ParserUtils.getHtmlStackTrace(t); } public void exception(String message) { this.state = State.EXCEPTION; this.actual = message; } public void ignore() { ignore(null); } public void ignore(String info) { this.state = State.IGNORED; this.actual = null; info(info); } public void info(String message) { if (message == null) { return; } rawInfo(new TextNode(message, td.baseUri()).outerHtml()); } public void wrong() { wrong(null, null); } public void wrong(String actual) { wrong(actual, null); } public void wrong(String actual, String info) { this.state = State.WRONG; this.actual = actual; info(info); } public void setFitValue(String value) { if (td.hasAttr("data-fit-value")) { td.attr(Constants.ATTR_VALUE, value); } else { setDisplayValue(value); } } public void setDisplayValue(String s) { td.text(s); } public void setDisplayValueRaw(String s) { td.html(s); } public void addDisplayValue(String text) { setDisplayValue(td.text() + text); } public void addDisplayValueRaw(String s) { td.html(td.html() + s); } public void blank(String info, int length) { td.attr("colspan", Integer.toString(length)); info(info); } public void rawInfo(String html) { if (this.info == null) { this.info = ""; } else { this.info += " "; } this.info += html; } @Override public String toString() { return "[Cell: " + td.outerHtml() + ", at " + row.getIndex() + "/" + td.siblingIndex() + "]"; } }