// Copyright Keysight Technologies 2012-2019
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at http://mozilla.org/MPL/2.0/.
using OpenTap.Addin;
using System;
using System.Xml.Linq;
namespace OpenTap.Plugins
{
/// Serializer implementation for TestStepList.
internal class TestStepListSerializer : TapSerializerPlugin
{
static XName testStepName = "TestStep";
static XName SequenceName = "SequenceName";
static XName varName = "Variable";
static XName paramName = "Parameters";
static XName DebugIds = "DebugIds";
public override string TargetName { get; } = "TestStepList";
/// The order of this serializer.
public override double Order
{
get { return 2; }
}
/// Deserialization implementation.
public override bool Deserialize(XElement elem, ITypeData t, Action setResult)
{
if (t.IsA(typeof(TestStepList)) == false) return false;
var steps = new TestStepList();
var sequenceNameAttr = elem.Attribute("SequenceName");
steps.SequenceName = sequenceNameAttr?.Value ?? string.Empty;
foreach (var subnode in elem.Elements())
{
if (subnode.Name == varName)
{
TestVariable v = null;
try
{
if (!Serializer.Deserialize(subnode, x => v = (TestVariable)x))
{
Serializer.PushError(subnode, "Unable to deserialize test step.");
continue; // skip to next step.
}
}
catch (Exception ex)
{
Serializer.PushError(subnode, "Unable to deserialize test step.", ex);
continue;
}
if (v != null)
steps.Variables.Add(v);
}
else if (subnode.Name == paramName)
{
TestVariable v = null;
try
{
if (!Serializer.Deserialize(subnode, x => v = (TestVariable)x))
{
Serializer.PushError(subnode, "Unable to deserialize test step.");
continue; // skip to next step.
}
}
catch (Exception ex)
{
Serializer.PushError(subnode, "Unable to deserialize test step.", ex);
continue;
}
if (v != null)
steps.Parameters.Add(v);
}
else if (subnode.Name == DebugIds)
{
Guid id = Guid.Empty;
try
{
if (!Serializer.Deserialize(subnode, x => id = (Guid)x))
{
Serializer.PushError(subnode, "Unable to deserialize DebugId.");
continue; // skip to next step.
}
}
catch (Exception ex)
{
Serializer.PushError(subnode, "Unable to deserialize DebugId.", ex);
continue;
}
if (id != Guid.Empty)
steps.DebugIds.Add(id);
}
else
{
ITestStep result = null;
try
{
if (!Serializer.Deserialize(subnode, x => result = (ITestStep)x))
{
Serializer.PushError(subnode, "Unable to deserialize test step.");
continue; // skip to next step.
}
}
catch (Exception ex)
{
Serializer.PushError(subnode, "Unable to deserialize test step.", ex);
continue;
}
if (result != null)
steps.Add(result);
}
}
setResult(steps);
return true;
}
/// Serialization implementation.
public override bool Serialize(XElement elem, object target, ITypeData expectedType)
{
if (target is TestStepList)
{
TestStepList list = (TestStepList)target;
if (!string.IsNullOrEmpty(list.SequenceName))
{
elem.Add(new XAttribute(SequenceName, list.SequenceName));
}
for (int i = 0; i < list.Count; i++)
{
var item = list[i];
var newelem = new XElement(testStepName);
Serializer.Serialize(newelem, item, null, true);
elem.Add(newelem);
}
{
var vars = list.Variables;
if (vars != null && vars.Count > 0)
{
for (int i = 0; i < vars.Count; i++)
{
var item = vars[i];
var newelem = new XElement(varName);
Serializer.Serialize(newelem, item, null, true);
elem.Add(newelem);
}
}
}
{
var parameters = list.Parameters;
if (parameters != null && parameters.Count > 0)
{
for (int i = 0; i < parameters.Count; i++)
{
var item = parameters[i];
var newelem = new XElement(paramName);
Serializer.Serialize(newelem, item, null, true);
elem.Add(newelem);
}
}
}
{
var debugIds = list.DebugIds;
if (debugIds != null && debugIds.Count > 0)
{
for (int i = 0; i < debugIds.Count; i++)
{
var item = debugIds[i];
var newelem = new XElement(DebugIds);
Serializer.Serialize(newelem, item, null, true);
elem.Add(newelem);
}
}
}
return true;
}
return false;
}
}
}