chr
2026-04-05 fe750b791d5b517cc4e9bc8e99a9a75139a0cfba
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using System;
using System.Xml.Linq;
using NUnit.Framework;
 
namespace OpenTap.Engine.UnitTests
{
    [TestFixture]
    public class ResourceReference
    {
        public class RefListener : ResultListener
        {
            public IInstrument InstrRef { get; set; }
        }
 
        [Test]
        public void SerializeResourceRefInResource()
        {
            try
            {
                // Make sure we have two profiles with a SCPIInstrument in each:
                ComponentSettings.SetSettingsProfile("Bench", "Test1");
                InstrumentSettings.Current.Clear();
                InstrumentSettings.Current.Add(new DummyInstrument { Name = "Dum" });
                InstrumentSettings.Current.Add(new ScpiInstrument { Name = "INST1" });
                InstrumentSettings.Current.Save();
                ComponentSettings.SetSettingsProfile("Bench", "Test2");
                InstrumentSettings.Current.Clear();
                InstrumentSettings.Current.Add(new ScpiInstrument { Name = "INST2" });
                InstrumentSettings.Current.Save();
 
                // Add a RefListener to ResultSettings
                var res = new RefListener();
                ResultSettings.Current.RemoveIf<IResultListener>(l => l is RefListener);
                ResultSettings.Current.Add(res);
                res.InstrRef = InstrumentSettings.Current.GetDefault<ScpiInstrument>();
                ResultSettings.Current.Save();
 
                Assert.AreEqual("INST2", res.InstrRef.Name);
 
                // Switch profile
                ComponentSettings.SetSettingsProfile("Bench", "Test1");
 
                // Reload ResultSettings
                var invRes = ResultSettings.Current.GetDefault<RefListener>();
 
                // Check that Instument reference now refers to instument from other profile
                Assert.IsNotNull(invRes.InstrRef);
                Assert.AreEqual("INST1", invRes.InstrRef.Name);
            }
            finally
            {
                ResultSettings.Current.Clear();
                ResultSettings.Current.Save();
                InstrumentSettings.Current.Clear();
            }
        }
 
        class CloneEnforcer : ITapSerializerPlugin
        {
            public double Order => 10;
 
            public bool Deserialize(XElement node, ITypeData t, Action<object> setter)
            {
                return false;
            }
 
            public Object TheObject;
            public bool Serialize(XElement node, object obj, ITypeData expectedType)
            {
                if (obj == TheObject)
                {
                    node.SetAttributeValue("Source", "None");
                }
                return false;
            }
        }
 
        [Test]
        public void SkipSerializePluginResourceTest()
        {
            var newinst = new LogResultListener() { FilePath = new MacroString() { Text = "hello" } };
            ResultSettings.Current.Add(newinst);
            var serializer = new TapSerializer();
 
            var clone1 = (LogResultListener)serializer.Clone(newinst); 
            // not actually a clone.
            Assert.AreSame(newinst, clone1);
            Assert.AreEqual(newinst.FilePath.Text, clone1.FilePath.Text);
 
            serializer.AddSerializers(new[] { new CloneEnforcer() { TheObject = newinst } });
 
            // a memberwise clone.
            var clone2 = (LogResultListener)serializer.Clone(newinst);
            Assert.AreNotSame(newinst, clone2);
            Assert.AreEqual(newinst.FilePath.Text, clone1.FilePath.Text);
        }
 
    }
}