using System.IO; using System.Linq; using System.Threading; using NUnit.Framework; namespace OpenTap.Package.UnitTests; [TestFixture] public class SupportedModelsTest { [SupportedModels("OpenTAP", "N9002A")] public class SupportedModelsInstrument : Instrument { } [SupportedModels("OpenTAP 2", "N9002B", "N9002C")] [SupportedModels("Not OpenTAP", "N9002D")] [SupportedModels("Not OpenTAP", "N9002E")] public class SupportedModelsInstrument2 : Instrument { } [Test] public void TestSupportedModelsAddedToPackageXml() { var path = typeof(SupportedModelsTest).Assembly.Location; var xml = $@" "; var tmp = Path.GetTempFileName(); try { File.WriteAllText(tmp, xml); { // Test creating package from raw xml var inputXmlPackage = PackageDefExt.FromInputXml(tmp, Path.GetDirectoryName(path)); testContent(inputXmlPackage); } { // Test real package var outFile = Path.GetTempFileName(); File.Delete(outFile); try { var act = new PackageCreateAction { PackageXmlFile = tmp, OutputPaths = [outFile] }; act.Execute(CancellationToken.None); var realPackage = PackageDef.FromPackage(outFile); testContent(realPackage); } finally { File.Delete(outFile); } } void testContent(PackageDef pkg) { { // Test that the first instrument supports 1 model from 1 manufacturer var manufacturerOne = pkg.Files.SelectMany(x => x.Plugins) .First(plugin => plugin.Name == nameof(SupportedModelsInstrument)); Assert.That(manufacturerOne.SupportedModels.Length, Is.EqualTo(1)); Assert.That(manufacturerOne.SupportedModels[0].Models.Length, Is.EqualTo(1)); Assert.That(manufacturerOne.SupportedModels[0].Models[0], Is.EqualTo("N9002A")); } { // Test that the second instrument supports 2 manufacturers, and furthermore that // the models from the 2nd manufacturer were correctly merged despite being declared in two different attributes var manufacturerTwo = pkg.Files.SelectMany(x => x.Plugins) .First(plugin => plugin.Name == nameof(SupportedModelsInstrument2)); var attrs = manufacturerTwo.SupportedModels; Assert.That(attrs.Length, Is.EqualTo(2)); var o1 = attrs.FirstOrDefault(x => x.Manufacturer == "OpenTAP 2"); Assert.NotNull(o1); var o2 = attrs.FirstOrDefault(x => x.Manufacturer == "Not OpenTAP"); Assert.NotNull(o2); Assert.That(o1.Models, Is.EqualTo(new string[] { "N9002B", "N9002C" })); Assert.That(o2.Models, Is.EqualTo(new string[] { "N9002D", "N9002E" })); } } } finally { File.Delete(tmp); } } }