Files
wehub-resource-sync db620d33df
CodeQL / Analyze (csharp) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
dotnet-build-and-test / dotnet-test-functions (push) Has been cancelled
dotnet-build-and-test / paths-filter (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Debug, windows-latest, net9.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net8.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-foundry-hosted-it (push) Has been cancelled
dotnet-build-and-test / dotnet-build-and-test-check (push) Has been cancelled
dotnet-build-and-test / Integration Test Report (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:39:25 +08:00

72 lines
2.7 KiB
C#

// Copyright (c) Microsoft. All rights reserved.
using System;
namespace Microsoft.Agents.AI.Tools.Shell.UnitTests;
/// <summary>
/// Branch coverage for <see cref="ShellResult.FormatForModel"/>. The output of
/// this method is what the language model sees, so regressions directly
/// affect agent behavior.
/// </summary>
public sealed class ShellResultTests
{
[Fact]
public void FormatForModel_Success_IncludesStdoutAndExitCode()
{
var r = new ShellResult("hello\n", string.Empty, 0, TimeSpan.FromMilliseconds(5));
var s = r.FormatForModel();
Assert.Contains("hello", s, StringComparison.Ordinal);
Assert.Contains("exit_code: 0", s, StringComparison.Ordinal);
Assert.DoesNotContain("stderr:", s, StringComparison.Ordinal);
Assert.DoesNotContain("[stdout truncated]", s, StringComparison.Ordinal);
Assert.DoesNotContain("[command timed out]", s, StringComparison.Ordinal);
}
[Fact]
public void FormatForModel_EmptyStdout_OmitsStdoutBlock()
{
var r = new ShellResult(string.Empty, string.Empty, 0, TimeSpan.Zero);
var s = r.FormatForModel();
// No stdout block, no stderr block — just the exit code line.
Assert.Equal("exit_code: 0", s);
}
[Fact]
public void FormatForModel_NonEmptyStderr_IncludesStderrLabel()
{
var r = new ShellResult(string.Empty, "boom\n", 1, TimeSpan.Zero);
var s = r.FormatForModel();
Assert.Contains("stderr: boom", s, StringComparison.Ordinal);
Assert.Contains("exit_code: 1", s, StringComparison.Ordinal);
}
[Fact]
public void FormatForModel_Truncated_AppendsTruncatedMarker()
{
var r = new ShellResult("partial-output", string.Empty, 0, TimeSpan.Zero, Truncated: true);
var s = r.FormatForModel();
Assert.Contains("[stdout truncated]", s, StringComparison.Ordinal);
}
[Fact]
public void FormatForModel_TimedOut_AppendsTimedOutMarker()
{
var r = new ShellResult(string.Empty, string.Empty, 124, TimeSpan.FromSeconds(30), TimedOut: true);
var s = r.FormatForModel();
Assert.Contains("[command timed out]", s, StringComparison.Ordinal);
Assert.Contains("exit_code: 124", s, StringComparison.Ordinal);
}
[Fact]
public void FormatForModel_TruncatedButEmptyStdout_DoesNotEmitMarker()
{
// Marker is only emitted inside the stdout block; with empty stdout
// there's no block to attach it to.
var r = new ShellResult(string.Empty, "err\n", 1, TimeSpan.Zero, Truncated: true);
var s = r.FormatForModel();
Assert.DoesNotContain("[stdout truncated]", s, StringComparison.Ordinal);
Assert.Contains("stderr: err", s, StringComparison.Ordinal);
}
}