/**
 * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
 * 
 * Please see distribution for license.
 */
package com.opengamma.util.test;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

import com.opengamma.OpenGammaRuntimeException;

/**
 * Converts an MS-Test (.trx) file to a set of XML files in Junit format.
 */
public class MSTestToJUnit extends AbstractJUnitResults {

  private XMLStreamReader createXMLReader() throws XMLStreamException {
    final XMLInputFactory factory = XMLInputFactory.newInstance();
    try {
      final Reader reader = new FileReader(getInputFile());
      // Read past the funny character prefix and <?...> bit which upset the parser
      while (reader.read() != '>') {
      }
      return factory.createXMLStreamReader(reader);
    } catch (IOException e) {
      throw new OpenGammaRuntimeException("Couldn't open file", e);
    }
  }

  private static double parseTime(final String time) {
    if (time == null) {
      return 0;
    } else {
      final String[] times = time.split(":");
      return (double) (((Integer.parseInt(times[0]) * 60) + Integer.parseInt(times[1])) * 60)
          + Double.parseDouble(times[2]);
    }
  }

  @Override
  protected void readTests() throws IOException {
    try {
      final XMLStreamReader reader = createXMLReader();
      try {
        final Map<String, UnitTest> unitTestsById = new HashMap<>();
        UnitTest currentUnitTest = null;
        while (reader.hasNext()) {
          switch (reader.next()) {
            case XMLStreamConstants.START_ELEMENT: {
              final QName element = reader.getName();
              if (currentUnitTest == null) {
                if ("UnitTest".equals(element.getLocalPart())) {
                  currentUnitTest = new UnitTest(reader.getAttributeValue(null, "name"));
                  unitTestsById.put(reader.getAttributeValue(null, "id"), currentUnitTest);
                } else if ("UnitTestResult".equals(element.getLocalPart())) {
                  currentUnitTest = unitTestsById.get(reader.getAttributeValue(null, "testId"));
                  if (currentUnitTest != null) {
                    if ("Passed".equals(reader.getAttributeValue(null, "outcome"))) {
                      currentUnitTest.setPassed();
                    }
                    currentUnitTest.setComputerName(reader.getAttributeValue(null, "computerName"));
                    currentUnitTest.setStartTime(reader.getAttributeValue(null, "startTime"));
                    currentUnitTest.setDuration(parseTime(reader.getAttributeValue(null, "duration")));
                  }
                }
              } else {
                if ("TestMethod".equals(element.getLocalPart())) {
                  final String[] codeBase = reader.getAttributeValue(null, "codeBase").split("/");
                  final String[] className = reader.getAttributeValue(null, "className").split(", ");
                  final String suite = codeBase[codeBase.length - 2] + "." + codeBase[codeBase.length - 1] + "."
                      + className[0];
                  storeTest(suite, currentUnitTest);
                }
              }
              break;
            }
            case XMLStreamConstants.CHARACTERS: {
              if (currentUnitTest != null) {
                final String text = reader.getText();
                currentUnitTest.appendText(text);
              }
              break;
            }
            case XMLStreamConstants.END_ELEMENT: {
              final QName element = reader.getName();
              if (currentUnitTest != null) {
                if ("UnitTestResult".equals(element.getLocalPart())) {
                  currentUnitTest = null;
                }
              }
              break;
            }
          }
        }
      } finally {
        reader.close();
      }
    } catch (XMLStreamException e) {
      throw new IOException("XMLStreamException", e);
    }
  }

  public static void processOutput(final String inputFile, final String outputDir) {
    final MSTestToJUnit exec = new MSTestToJUnit();
    exec.setInputFile(inputFile);
    exec.setOutputDir(outputDir);
    exec.run();
  }

  /**
   * @param args command line arguments
   */
  public static void main(final String[] args) {
    processOutput(args[0], args[1]);
  }

}


@@ -3904,32 +3904,77 @@
             if (
+%22UnitTest%22.equals(element.getLocalPart()) %7C%7C 
 %22UnitTestResult%22

Fix MS-Test to JUnit conversion (cherry-picking from commit 474c69f911f90332f798e8919edea8ac792c3f08)