#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);
}