blob: 18f54ef6e3a6e204e57c0cce137ae21404614efa [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 Tasktop Technologies and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.tests.report;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import org.eclipse.mylyn.internal.tests.report.TestCaseResult.TestCaseResultType;
/**
* @author Steffen Pingel
*/
public class JUnitReportParser {
private static final String TAG_TEST_CASE = "testcase";
private static final String TAG_TEST_CASE_FAILURE = "failure";
private static final String TAG_TEST_CASE_ERROR = "error";
private static final String ATTRIBUTE_CLASS_NAME = "classname";
private static final String ATTRIBUTE_TEST_NAME = "name";
private static final String ATTRIBUTE_MESSAGE = "message";
private static final String ATTRIBUTE_TYPE = "type";
private final TestCaseVisitor reportVisitor;
public JUnitReportParser(TestCaseVisitor reportVisitor) {
this.reportVisitor = reportVisitor;
}
private String getAttributeValue(StartElement element, String name) throws XMLStreamException {
Attribute attribute = element.getAttributeByName(new QName(name));
if (attribute == null) {
throw new XMLStreamException("Missing mandatory attribute: " + name, element.getLocation());
}
return attribute.getValue();
}
private String getOptionalAttributeValue(StartElement element, String name) {
Attribute attribute = element.getAttributeByName(new QName(name));
if (attribute == null) {
return null;
}
return attribute.getValue();
}
public void parse(XMLEventReader reader) throws XMLStreamException {
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
if (event.isStartElement()) {
StartElement element = event.asStartElement();
if (TAG_TEST_CASE.equals(element.getName().getLocalPart())) {
TestCase testCase = parseTestCase(reader, element);
if (testCase != null) {
reportVisitor.visit(testCase);
}
}
}
}
}
private TestCase parseTestCase(XMLEventReader reader, StartElement testCaseElement) throws XMLStreamException {
String className = getAttributeValue(testCaseElement, ATTRIBUTE_CLASS_NAME);
String testName = getAttributeValue(testCaseElement, ATTRIBUTE_TEST_NAME);
TestCaseResult result = null;
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
if (event.isStartElement()) {
StartElement element = event.asStartElement();
if (TAG_TEST_CASE_FAILURE.equals(element.getName().getLocalPart())) {
result = parseTestCaseResult(reader, element, TestCaseResultType.FAILURE);
} else if (TAG_TEST_CASE_ERROR.equals(element.getName().getLocalPart())) {
result = parseTestCaseResult(reader, element, TestCaseResultType.FAILURE);
}
} else if (event.isEndElement()) {
break;
}
}
return new TestCase(className, testName, result);
}
private TestCaseResult parseTestCaseResult(XMLEventReader reader, StartElement resultElement,
TestCaseResultType resultType) throws XMLStreamException {
String type = getAttributeValue(resultElement, ATTRIBUTE_TYPE);
String message = getOptionalAttributeValue(resultElement, ATTRIBUTE_MESSAGE);
return new TestCaseResult(resultType, type, message, reader.getElementText());
}
}