using System.Collections.Generic;
using System.Xml.Serialization;
using System.IO.Compression;
public class MeanVarianceTestResultsData
public int ResultsID { get; set; }
public DateTime DateExecuted { get; set; }
public string UserExecuted { get; set; }
public string CorrectedMean { get; set; }
public string CorrectedVariance { get; set; }
public bool TestPassed { get; set; }
public string TestResultImageFile { get; set; }
public Stream TestResultImage { get; set; }
public static class MeanVarianceTestResultsDataExtensions
public static List<MeanVarianceTestResultsData> ReadResultListFrom(XmlReader reader, Func<MeanVarianceTestResultsData, Stream> openStream, Func<Stream, Stream> closeStream)
return reader.ReadSubtrees("TestResult").Select(r => ReadResultFrom(r, openStream, closeStream)).ToList();
public static MeanVarianceTestResultsData ReadResultFrom(XmlReader reader, Func<MeanVarianceTestResultsData, Stream> openStream, Func<Stream, Stream> closeStream)
if (reader == null || openStream == null)
throw new ArgumentNullException();
var result = new MeanVarianceTestResultsData();
var isEmpty = reader.IsEmptyElement;
if (reader.NodeType == XmlNodeType.EndElement)
else if (reader.NodeType != XmlNodeType.Element)
else if (reader.Name == "ResultsID")
result.ResultsID = reader.ReadElementContentAsInt();
else if (reader.Name == "DateExecuted")
result.DateExecuted = reader.ReadElementContentAsDateTime();
else if (reader.Name == "UserExecuted")
result.UserExecuted = reader.ReadElementContentAsString();
else if (reader.Name == "CorrectedMean")
result.CorrectedMean = reader.ReadElementContentAsString();
else if (reader.Name == "TestPassed")
result.TestPassed = reader.ReadElementContentAsBoolean();
else if (reader.Name == "TestResultImage")
result.TestResultImage = reader.ReadElementContentAsStream(() => openStream(result), closeStream);
public static class XmlReaderExtensions
public static Stream ReadElementContentAsStream(this XmlReader reader, Func<Stream> openStream, Func<Stream, Stream> closeStream)
if (reader == null || openStream == null)
throw new ArgumentNullException();
byte[] buffer = new byte[4096];
while ((readBytes = reader.ReadElementContentAsBase64(buffer, 0, buffer.Length)) > 0)
stream.Write(buffer, 0, readBytes);
if (closeStream != null && stream != null)
stream = closeStream(stream);
public static IEnumerable<XmlReader> ReadSubtrees(this XmlReader reader, string name)
while (reader.ReadToFollowing(name))
using (var subReader = reader.ReadSubtree())
public static void Test()
var fileName = "Question49159697.xml";
var bytes = Enumerable.Range(0, 1024).Select(i => unchecked((byte)i)).ToArray();
foreach (var xml in GetXml(resultId, bytes))
Console.WriteLine("\nTesting XML: ");
File.WriteAllText(fileName, xml);
Test(fileName, resultId, bytes);
TestToFile(fileName, resultId, bytes);
if (File.Exists(fileName))
Console.WriteLine("\nAll tests passed.");
static void TestToFile(string fileName, int resultId, byte[] bytes)
List<MeanVarianceTestResultsData> results;
using (var reader = XmlReader.Create(fileName))
results = MeanVarianceTestResultsDataExtensions.ReadResultListFrom(
m => { m.TestResultImageFile = Path.GetTempFileName(); return File.Open(m.TestResultImageFile, FileMode.Create); },
s => { s.Dispose(); return null; });
Console.WriteLine("Read {0} results of type {1}", results.Count, typeof(MeanVarianceTestResultsData));
Assert.IsTrue(results.Count == 2);
foreach (var result in results)
Assert.IsTrue(File.ReadAllBytes(result.TestResultImageFile).SequenceEqual(bytes));
Assert.IsTrue(result.ResultsID == resultId);
File.Delete(result.TestResultImageFile);
static void Test(string fileName, int resultId, byte[] bytes)
List<MeanVarianceTestResultsData> results;
using (var reader = XmlReader.Create(fileName))
results = MeanVarianceTestResultsDataExtensions.ReadResultListFrom(reader, m => new MemoryStream(), s => { s.Position = 0; return s; });
Console.WriteLine("Read {0} results of type {1}", results.Count, typeof(MeanVarianceTestResultsData));
Assert.IsTrue(results.Count == 2);
foreach (var result in results)
Assert.IsTrue(((MemoryStream)result.TestResultImage).ToArray().SequenceEqual(bytes));
Assert.IsTrue(result.ResultsID == resultId);
static IEnumerable<string> GetXml(int resultId, byte [] bytes)
var template = @"<Root><SubRoot>
<ResultsID>{0}</ResultsID>
<DateExecuted>2018-02-20T09:36:12.787</DateExecuted>
<UserExecuted>xxx</UserExecuted>
<IrrelevantTag><IrrelevantTag>AA<n />{1}</IrrelevantTag>ss</IrrelevantTag>
<CorrectedMean>1966.32245</CorrectedMean>
<CorrectedVariance>19525.66320199{0}</CorrectedVariance>
<TestPassed>true</TestPassed>
<TestResultImage>{1}</TestResultImage>
<IrrelevantTag><IrrelevantTag>AA<n />{1}</IrrelevantTag>ss</IrrelevantTag>
<TestResult>Ignore This Text
<ResultsID>{0}</ResultsID>
<DateExecuted>2018-02-20T09:36:12.787</DateExecuted>
<IrrelevantTag><IrrelevantTag>AA<n />{1}</IrrelevantTag>ss</IrrelevantTag>
<CorrectedMean>1966.32245</CorrectedMean>
<CorrectedVariance>19525.66320199{0}</CorrectedVariance>
<TestPassed>true</TestPassed>
<TestResultImage>{1}</TestResultImage>
<IrrelevantTag><IrrelevantTag>AA<n />{1}</IrrelevantTag>ss><IrrelevantTag>AA<n />{1}</IrrelevantTag>ss
<IrrelevantTag>AA<n />{1}</IrrelevantTag>ss><IrrelevantTag>AA<n />{1}</IrrelevantTag>ss
var xml = string.Format(template, resultId, Convert.ToBase64String(bytes));
XDocument.Parse(xml).ToString(SaveOptions.DisableFormatting),
XDocument.Parse(xml).ToString(),
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static class Assert
public static void IsTrue(bool value)
public static void IsTrue(bool value, string message)
throw new AssertionFailedException(message ?? "failed");
public static void Main()
Console.WriteLine("Roslyn 2.0 Compiler; Environment version: " + Environment.Version);
Console.WriteLine("Uncaught exception: ");
public static string GetTempFileName()
return Guid.NewGuid().ToString();