using DTS.Common.XMLUtils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
namespace DTS.Common.ISO
{
public class TestPlan : IXmlSerializable
{
///
/// part of IXmlSerializable - from MS documentation this should return null
/// when implementing IXmlSerializable
/// https://learn.microsoft.com/en-us/dotnet/api/system.xml.serialization.ixmlserializable.getschema?view=net-9.0
///
public XmlSchema GetSchema() { return null; }
///
/// deserializes class from xml
///
public void ReadXml(XmlReader reader)
{
if (null == reader) { throw new ArgumentException("TestPlan::ReadXml - XmlReader was null"); }
reader.ReadStartElement("TestPlan");
ReadFields(reader);
ReadTestObjects(reader);
ReadExtraProperties(reader);
ReadTestObjectFiles(reader);
reader.ReadEndElement();
}
///
/// serializes class to xml
///
public void WriteXml(XmlWriter writer)
{
if (null == writer) { throw new ArgumentException("TestPlan::WriteXml - XmlWriter was null"); }
writer.WriteStartElement("TestPlan");
writer.WriteAttributeString("Version", "1");
WriteFields(writer);
WriteTestObjects(writer);
WriteExtraProperties(writer);
WriteTestObjectFiles(writer);
writer.WriteEndElement();
}
private void ReadExtraProperties(XmlReader reader)
{
if (null == reader) { throw new ArgumentException("TestPlan::ReadExtraProperties - XmlReader was null"); }
var properties = new List>();
if (reader.Name == "ExtraProperties" && reader.IsEmptyElement) { reader.Read(); }
else
{
reader.ReadStartElement("ExtraProperties");
while (reader.IsStartElement("ExtraProperty"))
{
var key = reader.GetAttribute("Key");
var value = reader.GetAttribute("Value");
properties.Add(new KeyValuePair(key, value));
reader.Read();
}
reader.ReadEndElement();
}
ExtraProperties = properties.ToArray();
}
private void WriteExtraProperties(XmlWriter writer)
{
if (null == writer) { throw new ArgumentException("TestPlan::WriteExtraProperties - XmlWriter was null"); }
writer.WriteStartElement("ExtraProperties");
foreach (var property in ExtraProperties)
{
writer.WriteStartElement("ExtraProperty");
writer.WriteAttributeString("Key", property.Key);
writer.WriteAttributeString("Value", property.Value);
writer.WriteEndElement();
}
writer.WriteEndElement();
}
private void ReadTestObjects(XmlReader reader)
{
if (null == reader) { throw new ArgumentException("TestPlan::ReadTestObjects - XmlReader was null"); }
reader.ReadStartElement("TestObjects");
var list = new List();
while (reader.IsStartElement() && reader.Name == "TestObject")
{
var wrapper = new MMETestObjectWrapper();
wrapper.ReadXml(reader);
if (!Array.Exists(ISOTestObjects, x => x.TypeOfTestObject.Equals(wrapper.TypeOfTestObject)))
{
//if the test object from the xml file doesn't exist in the test, ignore it.
//this is the case where the xml file contains test objects not in the test
continue;
}
list.Add(wrapper);
}
//now for any test objects in the test that _aren't_ in the xml, add them to the list
//this is the case where the test has test objects not in the xml
var existingObjectsNotInXml = from existingTestObject in ISOTestObjects where !list.Exists(y => y.TypeOfTestObject.Equals(existingTestObject.TypeOfTestObject)) select existingTestObject;
if (existingObjectsNotInXml.Any())
{
foreach (var existingObject in existingObjectsNotInXml)
{
list.Add(existingObject);
}
}
ISOTestObjects = list.ToArray();
reader.ReadEndElement();
}
private void WriteTestObjects(XmlWriter writer)
{
if (null == writer) { throw new ArgumentException("TestPlan::WriteTestObjects - XmlWriter was null"); }
writer.WriteStartElement("TestObjects");
if (null != ISOTestObjects)
{
foreach (var obj in ISOTestObjects)
{
obj.WriteXml(writer);
}
}
writer.WriteEndElement();
}
private void ReadTestObjectFiles(XmlReader reader)
{
if (null == reader) { throw new ArgumentException("TestPlan::ReadTestObjectFiles - XmlReader was null"); }
var list = new List();
if (reader.IsEmptyElement) { reader.Read(); }
else
{
reader.ReadStartElement("ISOFiles");
while (reader.IsStartElement() && reader.Name == "File")
{
list.Add(DTSXMLFile.GetInnerXML(reader));
}
reader.ReadEndElement();
}
TestObjectFiles = list.ToArray();
}
private void WriteTestObjectFiles(XmlWriter writer)
{
if (null == writer) { throw new ArgumentException("TestPlan::WriteTestObjectFiles - XmlWriter was null"); }
writer.WriteStartElement("ISOFiles");
foreach (var file in IsoTestObjectFiles)
{
writer.WriteStartElement("File");
writer.WriteString(file);
writer.WriteEndElement();
}
writer.WriteEndElement();
}
private void ReadFields(XmlReader reader)
{
if (null == reader) { throw new ArgumentException("TestPlan::ReadFields - XmlReader was null"); }
if (reader.Name != "Fields") { throw new XmlException("Invalid XML"); }
var fields = Enum.GetValues(typeof(IsoFields)).Cast().ToArray();
foreach (var field in fields)
{
//skip title since it comes from the setup name, we probably don't want to overwrite it
if (field == IsoFields.Title) { continue; }
SetField(field, reader.GetAttribute(field.ToString()));
}
//it's all in one element, so read the start and end element all in one
reader.ReadStartElement("Fields");
}
private void WriteFields(XmlWriter writer)
{
if (null == writer) { throw new ArgumentException("TestPlan::WriteFields - XmlWriter was null"); }
writer.WriteStartElement("Fields");
var fields = Enum.GetValues(typeof(IsoFields)).Cast().ToArray();
foreach (var field in fields)
{
writer.WriteAttributeString(field.ToString(), GetField(field));
}
writer.WriteEndElement();
}
public string Name { get; set; } = "New Test Plan";
public string Description { get; set; } = "New Test";
public DateTime InceptionDate { get; } = DateTime.Now;
public string[] TestObjectFiles { get; set; } = new string[0];
public MMETestObjectWrapper[] ISOTestObjects { get; set; } = new MMETestObjectWrapper[0];
private LabratoryDetails _lab;
private LabratoryDetails GetLabratoryDetails()
{
return _lab ?? (_lab = new LabratoryDetails());
}
private CustomerDetails _customer;
private CustomerDetails GetCustomer()
{
return _customer ?? (_customer = new CustomerDetails());
}
private TestEngineerDetails _testEngineer;
private TestEngineerDetails GetTestEngineer()
{
return _testEngineer ?? (_testEngineer = new TestEngineerDetails());
}
public string Title { get; set; } = "NOVALUE";
public string MediaNumber { get; set; }
public string TypeOfTest { get; set; } = "NOVALUE";
public string SubTypeofTest { get; set; } = "NOVALUE";
public string Regulation { get; set; } = "NOVALUE";
public string ReferenceTemperature { get; set; } = "NOVALUE";
public string RelativeAirHumidity { get; set; } = "NOVALUE";
public string DateOfTest { get; set; } = "NOVALUE";
public string TestComment { get; set; } = "NOVALUE";
public KeyValuePair[] ExtraProperties { get; set; } = new KeyValuePair[0];
public string[] IsoTestObjectFiles { get; set; } = new string[0];
public enum IsoFields
{
CustName,
CustomerCostUnit,
CustomerName,
CustomerOrderNumber,
CustomerProjectReferenceNumber,
TEName,
TestEngineerEmail,
TestEngineerFax,
TestEngineerName,
TestEngineerPhone,
CustomerTestReferenceNumber,
Date,
ExtraProperties,
LabName,
LaboratoryContactEmail,
LaboratoryContactFax,
LaboratoryContactName,
LaboratoryContactPhone,
LaboratoryName,
LaboratoryTestReferenceNumber,
LaboratoryProjectReferenceNumber,
NumberOfMedia,
NumberOfTestObjects,
ReferenceTemperature,
Regulation,
RelativeAirHumidity,
Subtype,
TestComment,
Title,
Type
}
public string NumberOfMedia { get; set; }
public string NumberOfTestObjects => ISOTestObjects.Length.ToString();
public string GetField(IsoFields field)
{
switch (field)
{
case IsoFields.CustName:
return GetCustomer().Name;
case IsoFields.CustomerCostUnit:
return GetCustomer().CustomerCostUnit;
case IsoFields.CustomerName:
return GetCustomer().CustomerName;
case IsoFields.CustomerOrderNumber:
return GetCustomer().CustomerOrderNumber;
case IsoFields.CustomerProjectReferenceNumber:
return GetCustomer().ProjectRefNumber;
case IsoFields.TEName:
return GetTestEngineer().Name;
case IsoFields.TestEngineerEmail:
return GetTestEngineer().TestEngineerEmail;
case IsoFields.TestEngineerFax:
return GetTestEngineer().TestEngineerFax;
case IsoFields.TestEngineerName:
return GetTestEngineer().TestEngineerName;
case IsoFields.TestEngineerPhone:
return GetTestEngineer().TestEngineerPhone;
case IsoFields.CustomerTestReferenceNumber:
return GetCustomer().CustomerTestRefNumber;
case IsoFields.Date:
return DateOfTest;
case IsoFields.LabName:
return GetLabratoryDetails().Name;
case IsoFields.LaboratoryContactEmail:
return GetLabratoryDetails().LabratoryContactEmail;
case IsoFields.LaboratoryContactFax:
return GetLabratoryDetails().LabratoryContactFax;
case IsoFields.LaboratoryContactName:
return GetLabratoryDetails().LabratoryContactName;
case IsoFields.LaboratoryContactPhone:
return GetLabratoryDetails().LabratoryContactPhone;
case IsoFields.LaboratoryName:
return GetLabratoryDetails().LabratoryName;
case IsoFields.LaboratoryTestReferenceNumber:
return GetLabratoryDetails().LabratoryTestRefNumber;
case IsoFields.LaboratoryProjectReferenceNumber:
return GetLabratoryDetails().LabratoryProjectRefNumber;
case IsoFields.NumberOfMedia:
return NumberOfMedia;
case IsoFields.NumberOfTestObjects:
return NumberOfTestObjects;
case IsoFields.ReferenceTemperature:
return ReferenceTemperature;
case IsoFields.Regulation:
return Regulation;
case IsoFields.RelativeAirHumidity:
return RelativeAirHumidity;
case IsoFields.Subtype:
return SubTypeofTest;
case IsoFields.TestComment:
return TestComment;
case IsoFields.Title:
return Title;
case IsoFields.Type:
return TypeOfTest;
default:
return "NOVALUE";
}
}
public void SetField(IsoFields field, string value)
{
if (string.IsNullOrEmpty(value)) { return; }
switch (field)
{
case IsoFields.CustName:
GetCustomer().Name = value;
break;
case IsoFields.CustomerCostUnit:
GetCustomer().CustomerCostUnit = value;
break;
case IsoFields.CustomerName:
GetCustomer().CustomerName = value;
break;
case IsoFields.CustomerOrderNumber:
GetCustomer().CustomerOrderNumber = value;
break;
case IsoFields.CustomerProjectReferenceNumber:
GetCustomer().ProjectRefNumber = value;
break;
case IsoFields.TEName:
GetTestEngineer().Name = value;
break;
case IsoFields.TestEngineerEmail:
GetTestEngineer().TestEngineerEmail = value;
break;
case IsoFields.TestEngineerFax:
GetTestEngineer().TestEngineerFax = value;
break;
case IsoFields.TestEngineerName:
GetTestEngineer().TestEngineerName = value;
break;
case IsoFields.TestEngineerPhone:
GetTestEngineer().TestEngineerPhone = value;
break;
case IsoFields.CustomerTestReferenceNumber:
GetCustomer().CustomerTestRefNumber = value;
break;
case IsoFields.Date:
DateOfTest = value;
break;
case IsoFields.ExtraProperties:
break;
case IsoFields.LabName:
GetLabratoryDetails().Name = value;
break;
case IsoFields.LaboratoryContactEmail:
GetLabratoryDetails().LabratoryContactEmail = value;
break;
case IsoFields.LaboratoryContactFax:
GetLabratoryDetails().LabratoryContactFax = value;
break;
case IsoFields.LaboratoryContactName:
GetLabratoryDetails().LabratoryContactName = value;
break;
case IsoFields.LaboratoryContactPhone:
GetLabratoryDetails().LabratoryContactPhone = value;
break;
case IsoFields.LaboratoryName:
GetLabratoryDetails().LabratoryName = value;
break;
case IsoFields.LaboratoryTestReferenceNumber:
GetLabratoryDetails().LabratoryTestRefNumber = value;
break;
case IsoFields.LaboratoryProjectReferenceNumber:
GetLabratoryDetails().LabratoryProjectRefNumber = value;
break;
case IsoFields.NumberOfMedia:
NumberOfMedia = value;
break;
case IsoFields.NumberOfTestObjects:
break;
case IsoFields.ReferenceTemperature:
ReferenceTemperature = value;
break;
case IsoFields.Regulation:
Regulation = value;
break;
case IsoFields.RelativeAirHumidity:
RelativeAirHumidity = value;
break;
case IsoFields.Subtype:
SubTypeofTest = value;
break;
case IsoFields.TestComment:
TestComment = value;
break;
case IsoFields.Title:
Title = value;
break;
case IsoFields.Type:
TypeOfTest = value;
break;
default:
throw new NotSupportedException("unknown iso field " + field);
}
}
}
}