#nullable enable using System; using System.IO; using System.Linq; using System.Xml.Linq; using ShrinkSDK.Godot.Editor; using ShrinkSDK.Installer; var root = Path.Combine(Path.GetTempPath(), "ShrinkSDK.InstallerFixture", Guid.NewGuid().ToString("N")); Directory.CreateDirectory(root); try { var project = Path.Combine(root, "Fixture.csproj"); File.WriteAllText(project, """ net8.0keep 3.4.5 """); var config = Path.Combine(root, "NuGet.Config"); File.WriteAllText(config, """ """); ShrinkProjectPackageEditor.SetPackageReference(project, "ShrinkSDK.EventBus", "2.1.0"); ShrinkProjectPackageEditor.SetPackageReference(project, "ShrinkSDK.EventBus", "2.1.0"); var installed = XDocument.Load(project); Require(installed.Descendants("PackageReference").Count(element => (string?)element.Attribute("Include") == "ShrinkSDK.EventBus") == 1, "package reference was duplicated"); Require(installed.ToString().Contains("Existing.Package") && installed.ToString().Contains("FixtureValue"), "unrelated project content was changed"); var installedVersions = ShrinkProjectPackageEditor.ReadPackageReferences(project); Require(installedVersions["ShrinkSDK.EventBus"] == "2.1.0", "installed version was not read correctly"); Require(installedVersions["Child.Version.Package"] == "3.4.5", "child Version element was not read correctly"); Require(ShrinkPackageVersion.Classify("2.2.0", "2.1.0") == ShrinkPackageVersionRelation.Newer, "newer installed version was classified as outdated"); Require(ShrinkPackageVersion.Classify("2.1.0-preview.10", "2.1.0-preview.2") == ShrinkPackageVersionRelation.Newer, "prerelease versions were not ordered semantically"); ShrinkProjectPackageEditor.SetPackageReference(project, "ShrinkSDK.EventBus", null); Require(!XDocument.Load(project).Descendants("PackageReference").Any(element => (string?)element.Attribute("Include") == "ShrinkSDK.EventBus"), "package reference was not removed"); ShrinkProjectPackageEditor.EnsureShrinkFeed(config); ShrinkProjectPackageEditor.EnsureShrinkFeed(config); var sources = XDocument.Load(config).Descendants("add").ToArray(); Require(sources.Count(element => (string?)element.Attribute("key") == "ShrinkSDK") == 1, "ShrinkSDK feed was duplicated"); Require(sources.Any(element => (string?)element.Attribute("key") == "Existing"), "existing NuGet source was removed"); Console.WriteLine("PASS Godot Installer atomic package/feed install-update-remove merge"); } finally { Directory.Delete(root, true); } static void Require(bool condition, string message) { if (!condition) throw new InvalidOperationException(message); }