XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension.NetCore.AutoConfig

【DLL】自动实现配置文件的存储

公开
关注 0 Fork 0 Star 0
UTF-8
using Xunit;

namespace XFEExtension.NetCore.AutoConfig.Tests;

public sealed class MessagePackPersistenceTests
{
    [Fact]
    public async Task LargeObjectRoundTripsThroughBinaryFile()
    {
        var directory = CreateTestDirectory();
        try
        {
            LargeObjectProfile.Current = new LargeObjectProfile();
            LargeObjectProfile.ProfilePath = Path.Combine(directory, nameof(LargeObjectProfile));
            var source = CreateLargeDocument(12_000);
            LargeObjectProfile.Current.InstanceData = source;

            await LargeObjectProfile.SaveProfileAsync();

            var profilePath = LargeObjectProfile.ProfilePath + ".mpk";
            Assert.True(File.Exists(profilePath));
            var persisted = await File.ReadAllBytesAsync(profilePath);
            Assert.Equal(LargeObjectProfile.ExportProfileBytes(), persisted);

            LargeObjectProfile.Current.InstanceData = new LargeSettingsDocument { Name = "changed" };
            LargeObjectProfile.LoadProfile();

            Assert.Equal(source.Name, LargeObjectProfile.Data.Name);
            Assert.Equal(source.Metadata, LargeObjectProfile.Data.Metadata);
            Assert.Equal(source.Items.Count, LargeObjectProfile.Data.Items.Count);
            Assert.Equal(source.Items[7_777].Samples, LargeObjectProfile.Data.Items[7_777].Samples);
            Assert.Equal(1, LargeObjectProfile.Current.LoadedProfileVersion);
        }
        finally
        {
            LargeObjectProfile.DeleteProfile();
            DeleteDirectory(directory);
        }
    }

    [Fact]
    public void ByteAndBase64ImportExportRoundTripWithoutStreams()
    {
        var source = CreateLargeDocument(256);
        LargeObjectProfile.Current = new LargeObjectProfile { InstanceData = source };

        var bytes = LargeObjectProfile.ExportProfileBytes();
        LargeObjectProfile.Current.InstanceData = new LargeSettingsDocument();
        LargeObjectProfile.ImportProfileBytes(bytes);
        Assert.Equal(source.Items.Count, LargeObjectProfile.Data.Items.Count);

        var base64 = LargeObjectProfile.ExportProfile();
        Assert.Equal(bytes, Convert.FromBase64String(base64));
        LargeObjectProfile.Current.InstanceData = new LargeSettingsDocument();
        LargeObjectProfile.ImportProfile(base64);
        Assert.Equal(source.Items[128].Name, LargeObjectProfile.Data.Items[128].Name);
    }

    [Fact]
    public void MessagePackMigrationRenamesLargeObjectProperty()
    {
        var source = CreateLargeDocument(64);
        UnversionedLargeObjectProfile.Current = new UnversionedLargeObjectProfile { InstanceData = source };
        var versionZero = UnversionedLargeObjectProfile.ExportProfileBytes();

        MigratingLargeObjectProfile.Current = new MigratingLargeObjectProfile();
        MigratingLargeObjectProfile.ImportProfileBytes(versionZero);

        Assert.Equal(0, MigratingLargeObjectProfile.Current.LoadedProfileVersion);
        Assert.Equal(source.Name, MigratingLargeObjectProfile.CurrentData.Name);
        Assert.Equal(source.Items[42].Samples, MigratingLargeObjectProfile.CurrentData.Items[42].Samples);
    }

    private static LargeSettingsDocument CreateLargeDocument(int count)
    {
        var document = new LargeSettingsDocument
        {
            Name = "large-settings",
            Metadata = Enumerable.Range(0, 64).ToDictionary(index => $"key-{index}", index => $"value-{index}"),
            Items = new List<LargeSettingsItem>(count)
        };
        for (var index = 0; index < count; index++)
        {
            document.Items.Add(new LargeSettingsItem
            {
                Id = index,
                Name = $"item-{index}",
                Samples = [index * 0.25, index * 0.5, index * 0.75, index]
            });
        }
        return document;
    }

    private static string CreateTestDirectory()
    {
        var directory = Path.Combine(Path.GetTempPath(), "XFEAutoConfigTests", Guid.NewGuid().ToString("N"));
        Directory.CreateDirectory(directory);
        return directory;
    }

    private static void DeleteDirectory(string directory)
    {
        if (Directory.Exists(directory))
            Directory.Delete(directory, true);
    }
}