// 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; } } }