File: Utils\AspireAnsiConsoleOutputTests.cs
Web Access
Project: src\tests\Aspire.Cli.Tests\Aspire.Cli.Tests.csproj (Aspire.Cli.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Aspire.Cli.Utils;
using Microsoft.Extensions.Configuration;
 
namespace Aspire.Cli.Tests.Utils;
 
public class AspireAnsiConsoleOutputTests
{
    [Fact]
    public void Width_ReturnsConfiguredValue_WhenASPIRE_CONSOLE_WIDTH_IsSet()
    {
        // Arrange
        var configuration = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?>
            {
                ["ASPIRE_CONSOLE_WIDTH"] = "200"
            })
            .Build();
        
        var output = new AspireAnsiConsoleOutput(Console.Out, configuration);
        
        // Act
        var width = output.Width;
        
        // Assert
        Assert.Equal(200, width);
    }
 
    [Fact]
    public void Width_CapsAt500_WhenASPIRE_CONSOLE_WIDTH_ExceedsMaximum()
    {
        // Arrange
        var configuration = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?>
            {
                ["ASPIRE_CONSOLE_WIDTH"] = "600"
            })
            .Build();
        
        var output = new AspireAnsiConsoleOutput(Console.Out, configuration);
        
        // Act
        var width = output.Width;
        
        // Assert
        Assert.Equal(500, width);
    }
 
    [Fact]
    public void Width_IgnoresInvalidValue_WhenASPIRE_CONSOLE_WIDTH_IsNotNumeric()
    {
        // Arrange
        var configuration = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?>
            {
                ["ASPIRE_CONSOLE_WIDTH"] = "invalid"
            })
            .Build();
        
        var output = new AspireAnsiConsoleOutput(Console.Out, configuration);
        
        // Act
        var width = output.Width;
        
        // Assert
        // Should fall back to default width detection
        Assert.True(width > 0);
    }
 
    [Fact]
    public void Width_IgnoresNegativeValue_WhenASPIRE_CONSOLE_WIDTH_IsNegative()
    {
        // Arrange
        var configuration = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?>
            {
                ["ASPIRE_CONSOLE_WIDTH"] = "-100"
            })
            .Build();
        
        var output = new AspireAnsiConsoleOutput(Console.Out, configuration);
        
        // Act
        var width = output.Width;
        
        // Assert
        // Should fall back to default width detection
        Assert.True(width > 0);
    }
 
    [Fact]
    public void Width_IgnoresZeroValue_WhenASPIRE_CONSOLE_WIDTH_IsZero()
    {
        // Arrange
        var configuration = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?>
            {
                ["ASPIRE_CONSOLE_WIDTH"] = "0"
            })
            .Build();
        
        var output = new AspireAnsiConsoleOutput(Console.Out, configuration);
        
        // Act
        var width = output.Width;
        
        // Assert
        // Should fall back to default width detection
        Assert.True(width > 0);
    }
 
    [Fact]
    public void Width_UsesSafeWidth_WhenNoConfigurationSet()
    {
        // Arrange
        var configuration = new ConfigurationBuilder().Build();
        var output = new AspireAnsiConsoleOutput(Console.Out, configuration);
        
        // Act
        var width = output.Width;
        
        // Assert
        // Should return either console buffer width or default
        Assert.True(width > 0);
    }
 
    [Fact]
    public void Width_CachesValue_AfterFirstAccess()
    {
        // Arrange
        var configuration = new ConfigurationBuilder().Build();
        var output = new AspireAnsiConsoleOutput(Console.Out, configuration);
        
        // Act
        var width1 = output.Width;
        output.Width = 250; // Set explicit value
        var width2 = output.Width;
        
        // Assert
        Assert.Equal(250, width2);
        Assert.NotEqual(width1, width2);
    }
 
    [Fact]
    public void IsTerminal_ReturnsFalse_WhenOutputIsRedirected()
    {
        // Arrange
        var configuration = new ConfigurationBuilder().Build();
        var output = new AspireAnsiConsoleOutput(Console.Out, configuration);
        
        // Act
        var isTerminal = output.IsTerminal;
        
        // Assert
        // When running in tests, output is typically redirected
        // This test verifies the property is accessible and returns a boolean
        Assert.True(isTerminal == true || isTerminal == false);
    }
 
    [Fact]
    public void Height_ReturnsPositiveValue()
    {
        // Arrange
        var configuration = new ConfigurationBuilder().Build();
        var output = new AspireAnsiConsoleOutput(Console.Out, configuration);
        
        // Act
        var height = output.Height;
        
        // Assert
        Assert.True(height > 0);
    }
 
    [Fact]
    public void Writer_ReturnsSameInstance_AsConstructorParameter()
    {
        // Arrange
        var configuration = new ConfigurationBuilder().Build();
        var writer = Console.Out;
        var output = new AspireAnsiConsoleOutput(writer, configuration);
        
        // Act
        var returnedWriter = output.Writer;
        
        // Assert
        Assert.Same(writer, returnedWriter);
    }
 
    [Fact]
    public void Constructor_ThrowsArgumentNullException_WhenWriterIsNull()
    {
        // Arrange
        var configuration = new ConfigurationBuilder().Build();
        
        // Act & Assert
        Assert.Throws<ArgumentNullException>(() => new AspireAnsiConsoleOutput(null!, configuration));
    }
 
    [Fact]
    public void Constructor_ThrowsArgumentNullException_WhenConfigurationIsNull()
    {
        // Act & Assert
        Assert.Throws<ArgumentNullException>(() => new AspireAnsiConsoleOutput(Console.Out, null!));
    }
}