优化SHA,未传入key时,仅对数据进行哈希,不做消息认证
智能大石头 authored at 2025-12-25 16:40:59
3.73 KiB
X
using NewLife.Configuration;
using Xunit;

namespace XUnitTest.Configuration;

public class ConfigHelperTests
{
    private static IConfigSection NewRoot()
    {
        return new ConfigSection { Key = "Root", Childs = [] };
    }

    private static IConfigSection NewElement(String key, String? value)
    {
        return new ConfigSection { Key = key, Value = value };
    }

    [Fact]
    public void MapToList_FillsWhenPropertyIsNull()
    {
        // Arrange: Root with two list nodes: Numbers (Int32 values) and Names (String values)
        var root = NewRoot();
        var numbers = root.AddChild("Numbers");
        numbers.Childs =
        [
            NewElement(nameof(Int32), "1"),
            NewElement(nameof(Int32), "2"),
            NewElement(nameof(Int32), "3"),
        ];
        var names = root.AddChild("Names");
        names.Childs =
        [
            NewElement(nameof(String), "Alice"),
            NewElement(nameof(String), "Bob"),
        ];

        var model = new ListModel();
        var provider = new XmlConfigProvider();

        // Act
        root.MapTo(model, provider);

        // Assert
        Assert.NotNull(model.Numbers);
        Assert.Equal(new[] { 1, 2, 3 }, model.Numbers);
        Assert.NotNull(model.Names);
        Assert.Equal(["Alice", "Bob"], model.Names);
    }

    [Fact]
    public void MapFrom_List_SerializesAsAttributeElementsAndResets()
    {
        // Arrange
        var root = NewRoot();
        var model = new ListModel
        {
            Numbers = [3, 4, 5],
            Names = ["A"]
        };

        // Act 1: Map to section
        root.MapFrom(model);

        // Assert structure after first mapping
        var numbers = root.Find("Numbers");
        Assert.NotNull(numbers);
        Assert.NotNull(numbers.Childs);
        Assert.Equal(3, numbers.Childs.Count);
        foreach (var it in numbers.Childs)
        {
            Assert.Equal(nameof(Int32), it.Key);
        }
        Assert.Equal(new[] { "3", "4", "5" }, numbers.Childs.Select(e => e.Value).ToArray());

        var names = root.Find("Names");
        Assert.NotNull(names);
        Assert.NotNull(names.Childs);
        Assert.Single(names.Childs);
        Assert.Equal(nameof(String), names.Childs[0].Key);
        Assert.Equal("A", names.Childs[0].Value);

        // Act 2: Change model and map again (should reset, not append)
        model.Numbers = [7];
        model.Names = ["B", "C"];
        root.MapFrom(model);

        // Assert after second mapping
        numbers = root.Find("Numbers");
        Assert.NotNull(numbers);
        Assert.NotNull(numbers.Childs);
        Assert.Single(numbers.Childs);
        Assert.Equal("7", numbers.Childs[0].Value);

        names = root.Find("Names");
        Assert.NotNull(names);
        Assert.NotNull(names.Childs);
        Assert.Equal(2, names.Childs.Count);
        Assert.Equal(new[] { "B", "C" }, names.Childs.Select(e => e.Value).ToArray());
    }

    [Fact]
    public void SetValue_Boolean_UsesLowerInvariant()
    {
        // Arrange
        var root = NewRoot();
        var model = new BoolModel { Flag = true };

        // Act
        root.MapFrom(model);

        // Assert
        Assert.Equal("true", root["Flag"]);
    }

    [Fact]
    public void Find_CreatesNested_WhenCreateOnMiss()
    {
        // Arrange
        var root = NewRoot();

        // Act
        var leaf = root.Find("A:B:C", true);

        // Assert
        Assert.NotNull(leaf);
        Assert.Equal("C", leaf.Key);
        Assert.NotNull(root.Find("A:B:C"));
    }

    private sealed class ListModel
    {
        public List<Int32> Numbers { get; set; }
        public IList<String> Names { get; set; }
    }

    private sealed class BoolModel
    {
        public Boolean Flag { get; set; }
    }
}