package net.jsunit.model;
import net.jsunit.XmlRenderable;
import net.jsunit.utility.StringUtility;
import org.jdom.Document;
import org.jdom.Element;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class BrowserResult extends AbstractResult implements XmlRenderable {
private Browser browser;
private String remoteAddress;
private String id;
private String jsUnitVersion;
private String userAgent;
private String baseURL;
private double time;
private List<TestPageResult> testPageResults = new ArrayList<TestPageResult>();
private String serverSideExceptionStackTrace;
private ResultType resultType;
private String userProperty;
public BrowserResult() {
this.id = String.valueOf(System.currentTimeMillis());
}
public Browser getBrowser() {
return browser;
}
public String getId() {
return id;
}
public void setId(String id) {
if (id != null)
this.id = id;
}
public boolean hasId(String id) {
return this.id.equals(id);
}
public String getJsUnitVersion() {
return jsUnitVersion;
}
public void setJsUnitVersion(String jsUnitVersion) {
this.jsUnitVersion = jsUnitVersion;
}
public String getBaseURL() {
return baseURL;
}
public void setBaseURL(String baseURL) {
this.baseURL = baseURL;
}
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public double getTime() {
return time;
}
public void setTime(double time) {
this.time = time;
}
public List<TestCaseResult> _getTestCaseResults() {
List<TestCaseResult> result = new ArrayList<TestCaseResult>();
for (TestPageResult pageResult : _getTestPageResults())
result.addAll(pageResult._getTestCaseResults());
return result;
}
public void _setTestCaseStrings(String[] testCaseResultStrings) {
buildTestCaseResults(testCaseResultStrings);
}
public String getRemoteAddress() {
return remoteAddress;
}
public void setRemoteAddress(String remoteAddress) {
this.remoteAddress = remoteAddress;
}
private void buildTestCaseResults(String[] testCaseResultStrings) {
if (testCaseResultStrings == null)
return;
for (String testCaseResultString : testCaseResultStrings)
addTestCaseResult(TestCaseResult.fromString(testCaseResultString));
}
public Element asXml() {
return new BrowserResultWriter(this).writeXml();
}
public String asXmlFragment() {
return new BrowserResultWriter(this).writeXmlFragment();
}
public void addTestCaseResult(TestCaseResult testCaseResult) {
String testPageName = testCaseResult.getTestPageName();
TestPageResult testPageResult = findTestPageResultForTestPageWithName(testPageName);
if (testPageResult == null) {
testPageResult = new TestPageResult(testPageName);
testPageResults.add(testPageResult);
}
testPageResult.addTestCaseResult(testCaseResult);
}
private TestPageResult findTestPageResultForTestPageWithName(String testPageName) {
for (TestPageResult testPageResult : testPageResults)
if (testPageResult.getTestPageName().equals(testPageName))
return testPageResult;
return null;
}
public ResultType _getResultType() {
if (resultType == null)
return super._getResultType();
return resultType;
}
public Document asXmlDocument() {
return new Document(asXml());
}
public List<TestPageResult> _getTestPageResults() {
return testPageResults;
}
public TestPageResult[] getTestPageResults() {
return testPageResults.toArray(new TestPageResult[testPageResults.size()]);
}
public void setTestPageResults(TestPageResult[] results) {
testPageResults = Arrays.asList(results);
}
public String getDisplayString() {
return _getResultType().getDisplayString();
}
public boolean completedTestRun() {
return _getResultType().completedTestRun();
}
public boolean timedOut() {
return _getResultType().timedOut();
}
public boolean failedToLaunch() {
return _getResultType().failedToLaunch();
}
public void _setServerSideException(Throwable throwable) {
serverSideExceptionStackTrace = StringUtility.stackTraceAsString(throwable);
}
public String getServerSideExceptionStackTrace() {
return serverSideExceptionStackTrace;
}
public void setServerSideExceptionStackTrace(String serverSideExceptionStackTrace) {
this.serverSideExceptionStackTrace = serverSideExceptionStackTrace;
}
public boolean hasServerSideExceptionStackTrace() {
return serverSideExceptionStackTrace != null;
}
protected List<? extends Result> getChildren() {
return testPageResults;
}
public void setBrowser(Browser browser) {
this.browser = browser;
}
public boolean isForBrowser(Browser browser) {
return this.browser.equals(browser);
}
public String getBrowserDisplayString() {
return browser.getDisplayName();
}
protected void addMyErrorStringTo(StringBuffer buffer) {
buffer.append(" ");
buffer.append(getBrowserDisplayString());
buffer.append(" (");
buffer.append(getUserAgent());
buffer.append(")\n");
if (resultType != null && !resultType.completedTestRun()) {
buffer.append(" Tests were not run: ");
buffer.append(resultType.getDisplayString());
buffer.append("\n");
}
}
public void _setResultType(ResultType type) {
this.resultType = type;
}
public String getLogUrl(String baseURLString) {
String path = "/jsunit/displayer?id=" + getId() + "&browserId=" + getBrowser().getId();
try {
URL baseURL = new URL(baseURLString);
return new URL(baseURL.getProtocol(), baseURL.getHost(), baseURL.getPort(), path).toString();
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
public boolean hasBrowserType(BrowserType browserType) {
return getBrowser()._getType() == browserType;
}
public String getTestPageName() {
if (baseURL == null)
return null;
else
return baseURL.substring(baseURL.lastIndexOf("/") + 1);
}
public String getUserProperty() {
return this.userProperty;
}
public void setUserProperty(String userProperty) {
this.userProperty = userProperty;
}
}