v9.10.2019.0101  全面巩固批量Insert/Update/Upsert,支持数据备份、恢复和同步,支持实体列表保存到文件以及加载
大石头 authored at 2019-01-01 13:38:33
5.19 KiB
X
using NewLife.Configuration;
using Xunit;

namespace XUnitTest.Configuration;

public class CommandParserTests
{
    [Fact]
    public void Normal()
    {
        var args = new[] { "-appid", "cube", "--secret", "abcd1234", "-allowall" };
        var cmp = new CommandParser { };
        var dic = cmp.Parse(args);

        Assert.NotNull(dic);
        Assert.Equal(3, dic.Count);
        Assert.True(dic.ContainsKey("appid"));
        Assert.True(dic.ContainsKey("secret"));
        Assert.True(dic.ContainsKey("allowall"));

        Assert.Equal("cube", dic["appid"]);
        Assert.Equal("abcd1234", dic["secret"]);
        Assert.Null(dic["allowall"]);
    }

    [Fact]
    public void IgnoreCase()
    {
        var args = new[] { "-appid", "cube", "--secret", "abcd1234", "-allowall" };
        var cmp = new CommandParser { IgnoreCase = true };
        var dic = cmp.Parse(args);

        Assert.NotNull(dic);
        Assert.Equal(3, dic.Count);
        Assert.True(dic.ContainsKey("appid"));
        Assert.True(dic.ContainsKey("secret"));
        Assert.True(dic.ContainsKey("AllowAll"));

        Assert.Equal("cube", dic["AppId"]);
        Assert.Equal("abcd1234", dic["Secret"]);
        Assert.Null(dic["allowall"]);
    }

    [Fact]
    public void TrimStart()
    {
        var args = new[] { "-appid", "cube", "--secret", "abcd1234", "-allowall" };
        var cmp = new CommandParser { IgnoreCase = true, TrimStart = false };
        var dic = cmp.Parse(args);

        Assert.NotNull(dic);
        Assert.Equal(3, dic.Count);
        Assert.True(dic.ContainsKey("-appid"));
        Assert.True(dic.ContainsKey("--secret"));
        Assert.True(dic.ContainsKey("-AllowAll"));

        Assert.Equal("cube", dic["-AppId"]);
        Assert.Equal("abcd1234", dic["--Secret"]);
        Assert.Null(dic["-allowall"]);
    }

    [Fact]
    public void TrimQuote()
    {
        var args = new[] { "-appid", "'cube'", "--secret", "\"abcd1234\"", "-allowall" };
        var cmp = new CommandParser { IgnoreCase = true, TrimStart = false };
        var dic = cmp.Parse(args);

        Assert.NotNull(dic);
        Assert.Equal(3, dic.Count);
        Assert.True(dic.ContainsKey("-appid"));
        Assert.True(dic.ContainsKey("--secret"));
        Assert.True(dic.ContainsKey("-AllowAll"));

        Assert.Equal("cube", dic["-AppId"]);
        Assert.Equal("abcd1234", dic["--Secret"]);
        Assert.Null(dic["-allowall"]);
    }

    [Fact(DisplayName = "空参数回退到当前进程命令行")]
    public void DefaultArgs()
    {
        var cmp = new CommandParser { };

        // Parse(null) 回退到 Environment.GetCommandLineArgs()
        var dic = cmp.Parse(null);
        Assert.NotNull(dic);

        // 回退结果必须与显式传入当前进程命令行完全一致。
        // 不能断言参数条数:测试宿主由 VSTest 注入 --port/--endpoint/--role/--parentprocessid/--telemetryoptedin 等选项,
        // 其集合随 VSTest 版本变化,写死数量会让本用例随运行器升级而失败
        var expected = cmp.Parse(Environment.GetCommandLineArgs());
        Assert.Equal(expected.Count, dic.Count);
        foreach (var kv in expected)
        {
            Assert.True(dic.ContainsKey(kv.Key));
            Assert.Equal(kv.Value, dic[kv.Key]);
        }

        // 用宿主必然注入的选项确认确实读到了当前进程命令行,而非空集合
        Assert.True(dic.ContainsKey("port"));
        Assert.True(dic.ContainsKey("endpoint"));
        Assert.True(dic.ContainsKey("role"));
    }

    [Fact]
    public void Split()
    {
        var str = "-appid=cube --secret=abcd1234";
        var args = CommandParser.Split(str);
        Assert.Equal(2, args.Length);
        Assert.Equal("-appid=cube", args[0]);
        Assert.Equal("--secret=abcd1234", args[1]);

        str = " -appid=cube  \"C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe\" ";
        args = CommandParser.Split(str);
        Assert.Equal(2, args.Length);
        Assert.Equal("-appid=cube", args[0]);
        Assert.Equal("C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe", args[1]);

        str = " -appid=cube  \"\" ";
        args = CommandParser.Split(str);
        Assert.Equal(2, args.Length);
        Assert.Equal("-appid=cube", args[0]);
        Assert.Equal("", args[1]);

        //str = " -appid=cube  F\"C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe\"ddd ";
        //args = CommandParser.Split(str);
        //Assert.Equal(2, args.Length);
        //Assert.Equal("-appid=cube", args[0]);
        //Assert.Equal("F\"C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe\"ddd", args[1]);
    }

    [Fact(DisplayName = "空参数不崩溃")]
    public void EmptyArgs()
    {
        var cmp = new CommandParser();
        var dic = cmp.Parse(["", "-appid", "", "-port", "1234"]);

        Assert.NotNull(dic);
        // 空参数被跳过,空值参数正常保留
        Assert.Equal(2, dic.Count);
        Assert.Equal("1234", dic["port"]);
        Assert.Null(dic["appid"]);
    }

    [Fact(DisplayName = "单字符引号不越界")]
    public void TrimQuote_SingleChar()
    {
        Assert.Equal("\"", CommandParser.TrimQuote("\""));
        Assert.Equal("'", CommandParser.TrimQuote("'"));
    }
}