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

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
UTF-8
using XFESystem.Console;
using XFESystem.ConsoleDemo;
using XFEExtension.NetCore.XFEConsole.Terminal;
using XFEConsoleApi = XFEExtension.NetCore.XFEConsole.XFEConsole;

namespace XFESystem.Console.Tests;

public sealed class ConsoleDemoTests
{
    [Fact]
    public void RealXfePackageProducesSequencesConsumedByTheSystemTerminal()
    {
        var terminal = new TerminalBuffer(80, 20);
        using var writer = new TerminalTextWriter(terminal);
        ConsoleDemoScenario.Run(writer);
        Assert.Equal("XFESystem C# Console Demo", terminal.GetLine(0));
        Assert.Equal("RGB: #75C9F5", terminal.GetLine(1));
        Assert.Equal(new TerminalColor(117, 201, 245), terminal.GetCell(0, 1).Style.Foreground);
        Assert.Equal(new TerminalColor(255, 95, 0), terminal.GetCell(0, 2).Style.Foreground);
        Assert.Equal(new TerminalColor(48, 48, 48), terminal.GetCell(0, 2).Style.Background);
        Assert.Equal(TerminalColor.FromConsoleColor(ConsoleColor.Blue), terminal.GetCell(0, 3).Style.Foreground);
        Assert.True(terminal.GetCell(0, 4).Style.Bold && terminal.GetCell(0, 4).Style.Underline);
        Assert.Equal(TerminalStyle.Default, terminal.GetCell(0, 5).Style);
        Assert.Equal("Edit: OK", terminal.GetLine(6));
        Assert.Equal("Cursor: x!", terminal.GetLine(7));
        Assert.Equal("Unicode: 中文 g y", terminal.GetLine(8));
        Assert.Equal(ConsoleDemoScenario.SuccessMarker, terminal.GetLine(9));
        Assert.DoesNotContain('\u001b', terminal.GetText());
    }

    [Fact]
    public void PackageTerminalStyleUsesAnActualPackageAssembly()
    {
        var assembly = typeof(XFETerminalStyle).Assembly;
        Assert.Equal("XFEExtension.NetCore.XFEConsole", assembly.GetName().Name);
        var sequence = new XFETerminalStyle { Foreground = XFETerminalColor.FromRgb(1, 2, 3) }.Apply("A");
        Assert.Equal("\u001b[38;2;1;2;3mA\u001b[0m", sequence);
    }

    [Fact]
    public void DirectXfeConsoleApiWritesToProvidedOutputAndRestoresItsGlobalWriter()
    {
        var oldWriter = XFEExtension.NetCore.XFEConsole.XFEConsole.CurrentConsoleTextWriter;
        using var captured = new StringWriter();
        ConsoleDemoScenario.RunXfeConsoleApi(captured);
        Assert.Contains("XFEConsole API: Real NuGet 2.6.0", captured.ToString(), StringComparison.Ordinal);
        Assert.Same(oldWriter, XFEExtension.NetCore.XFEConsole.XFEConsole.CurrentConsoleTextWriter);
    }

    [Fact]
    public void FailedRealXfeConsoleOutputPropagatesAndRestoresEveryGlobalSetting()
    {
        var originalWriter = XFEConsoleApi.CurrentConsoleTextWriter;
        var originalDebug = XFEConsoleApi.ShowInDebug;
        var originalLocal = XFEConsoleApi.ShowInLocalConsole;
        var originalLog = XFEConsoleApi.EnableLog;
        using var previousOutput = new StringWriter();
        var expectedWriter = new XFEExtension.NetCore.XFEConsole.XFEConsoleTextWriter(previousOutput);
        try
        {
            XFEConsoleApi.CurrentConsoleTextWriter = expectedWriter;
            XFEConsoleApi.ShowInDebug = true;
            XFEConsoleApi.ShowInLocalConsole = false;
            XFEConsoleApi.EnableLog = true;

            var error = Assert.Throws<IOException>(() => ConsoleDemoScenario.RunXfeConsoleApi(new FailingTextWriter()));
            Assert.Equal("Controlled XFE output failure", error.Message);
            Assert.Same(expectedWriter, XFEConsoleApi.CurrentConsoleTextWriter);
            Assert.True(XFEConsoleApi.ShowInDebug);
            Assert.False(XFEConsoleApi.ShowInLocalConsole);
            Assert.True(XFEConsoleApi.EnableLog);
            Assert.Equal(string.Empty, previousOutput.ToString());
        }
        finally
        {
            XFEConsoleApi.CurrentConsoleTextWriter = originalWriter;
            XFEConsoleApi.ShowInDebug = originalDebug;
            XFEConsoleApi.ShowInLocalConsole = originalLocal;
            XFEConsoleApi.EnableLog = originalLog;
        }
    }

    [Fact]
    public void TextWriterMakesEachLineAtomicForConcurrentWriters()
    {
        var terminal = new TerminalBuffer(32, 101, scrollbackLimit: 0);
        using var writer = new TerminalTextWriter(terminal);
        Parallel.For(0, 100, index => writer.WriteLine($"Line {index:D3}"));
        var lines = Enumerable.Range(0, 100).Select(row => terminal.GetLine(row)).ToArray();
        Assert.Equal(100, lines.Distinct(StringComparer.Ordinal).Count());
        Assert.All(lines, line => Assert.Matches("^Line [0-9]{3}$", line));
        Assert.Equal(100, writer.Snapshot().CursorRow);
    }

    private sealed class FailingTextWriter : TextWriter
    {
        public override System.Text.Encoding Encoding => System.Text.Encoding.UTF8;
        public override void WriteLine(string? value) => throw new IOException("Controlled XFE output failure");
    }
}