Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions src/Cake.Cli.Tests/Cake.Cli.Tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AssemblyName>Cake.Cli.Tests</AssemblyName>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<IsCakeTestProject>true</IsCakeTestProject>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<!-- Import shared functionality -->
<Import Project="..\Shared.msbuild" />
<!-- Project references -->
<ItemGroup>
<ProjectReference Include="..\Cake.Cli\Cake.Cli.csproj" />
<ProjectReference Include="..\Cake.Core\Cake.Core.csproj" />
<ProjectReference Include="..\Cake.Testing\Cake.Testing.csproj" />
<ProjectReference Include="..\Cake.Testing.Xunit.v3\Cake.Testing.Xunit.v3.csproj" />
</ItemGroup>
<!-- Global packages -->
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="Spectre.Verify.Extensions" />
<PackageReference Include="Spectre.Console.Testing" />
<PackageReference Include="Verify.DiffPlex" />
<PackageReference Include="Verify.XunitV3" />
<PackageReference Include="xunit.v3" />
<PackageReference Include="xunit.runner.visualstudio">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="NSubstitute" />
<PackageReference Include="Castle.Core" />
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" />
</ItemGroup>
<ItemGroup>
<Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" />
</ItemGroup>
<ItemGroup>
<Folder Include="Expectations\" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

────────────────────────────────────────────────────────────────────────────────
Setup
────────────────────────────────────────────────────────────────────────────────
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
emptyString
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

────────────────────────────────────────────────────────────────────────────────
Setup
────────────────────────────────────────────────────────────────────────────────
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
emptyString
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

────────────────────────────────────────────────────────────────────────────────
Setup
────────────────────────────────────────────────────────────────────────────────
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

════════════════════════════════════════════════════════════════════════════════
Skipped Step
════════════════════════════════════════════════════════════════════════════════
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
emptyString
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
emptyString
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
emptyString
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

════════════════════════════════════════════════════════════════════════════════
Skipped Step
════════════════════════════════════════════════════════════════════════════════
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

════════════════════════════════════════════════════════════════════════════════
Test Step
════════════════════════════════════════════════════════════════════════════════
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
emptyString
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

════════════════════════════════════════════════════════════════════════════════
Test Step
════════════════════════════════════════════════════════════════════════════════
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
emptyString
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

════════════════════════════════════════════════════════════════════════════════
Test Step
════════════════════════════════════════════════════════════════════════════════
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@

Task Duration Status
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SetupExecuted 00:00:00.2220000 Succeeded
SetupSkipped - Skipped
SetupFailed 00:00:00.8880000 Failed
SetupDelegated 00:00:00.4440000 Succeeded
TaskExecuted 00:00:00.1110000 Succeeded
TaskSkipped - Skipped
TaskFailed 00:00:00.4440000 Failed
TaskDelegated 00:00:00.2220000 Succeeded
TeardownExecuted 00:00:00.3330000 Succeeded
TeardownSkipped - Skipped
TeardownFailed 00:00:01.3320000 Failed
TeardownDelegated 00:00:00.6660000 Succeeded
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total: 00:00:06.6600000

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@

Task Duration Status
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SetupExecuted 00:00:00.2220000 Succeeded
SetupSkipped - Skipped
SetupFailed 00:00:00.8880000 Failed
SetupDelegated 00:00:00.4440000 Succeeded
TaskExecuted 00:00:00.1110000 Succeeded
TaskSkipped - Skipped
TaskFailed 00:00:00.4440000 Failed
TaskDelegated 00:00:00.2220000 Succeeded
TeardownExecuted 00:00:00.3330000 Succeeded
TeardownSkipped - Skipped
TeardownFailed 00:00:01.3320000 Failed
TeardownDelegated 00:00:00.6660000 Succeeded
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total: 00:00:06.6600000

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@

Task Duration Status
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SetupExecuted 00:00:00.2220000 Succeeded
SetupSkipped - Skipped
SetupFailed 00:00:00.8880000 Failed
SetupDelegated 00:00:00.4440000 Succeeded
TaskExecuted 00:00:00.1110000 Succeeded
TaskSkipped - Skipped
TaskFailed 00:00:00.4440000 Failed
TaskDelegated 00:00:00.2220000 Succeeded
TeardownExecuted 00:00:00.3330000 Succeeded
TeardownSkipped - Skipped
TeardownFailed 00:00:01.3320000 Failed
TeardownDelegated 00:00:00.6660000 Succeeded
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total: 00:00:06.6600000

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@

Task Duration Status Skip Reason
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SetupExecuted 00:00:00.2220000 Succeeded
SetupSkipped - Skipped Skipped reason
SetupFailed 00:00:00.8880000 Failed
SetupDelegated 00:00:00.4440000 Succeeded
TaskExecuted 00:00:00.1110000 Succeeded
TaskSkipped - Skipped Skipped reason
TaskFailed 00:00:00.4440000 Failed
TaskDelegated 00:00:00.2220000 Succeeded
TeardownExecuted 00:00:00.3330000 Succeeded
TeardownSkipped - Skipped Skipped reason
TeardownFailed 00:00:01.3320000 Failed
TeardownDelegated 00:00:00.6660000 Succeeded
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total: 00:00:06.6600000

139 changes: 139 additions & 0 deletions src/Cake.Cli.Tests/Unit/CakeSpectreReportPrinterTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using Cake.Core;
using Cake.Core.Diagnostics;
using Spectre.Console.Testing;

namespace Cake.Cli.Tests.Unit;

public class CakeSpectreReportPrinterTests
{
public sealed class TheConstructor
{
[Fact]
public void Should_Throw_If_Console_Is_Null()
{
// Given
// When
var result = Record.Exception(() => new CakeSpectreReportPrinter(null));
// Then
AssertEx.IsArgumentNullException(result, "console");
}
}

[Theory]
[InlineData(true)]
[InlineData(false)]
public async Task Write(bool includeReason)
{
// Given
var console = new TestConsole();
var reportPrinter = new CakeSpectreReportPrinter(console);

var executionCategories = Enum
.GetValues<CakeReportEntryCategory>()
.OrderBy(
category => category switch {
CakeReportEntryCategory.Setup => 0,
CakeReportEntryCategory.Task => 1,
CakeReportEntryCategory.Teardown => 9,
_ => 5
})
.ToArray();

var executionStatuses = Enum
.GetValues<CakeTaskExecutionStatus>()
.OrderBy(
status => status switch {
CakeTaskExecutionStatus.Executed => 0,
CakeTaskExecutionStatus.Skipped => 1,
CakeTaskExecutionStatus.Failed => 2,
CakeTaskExecutionStatus.Delegated => 9,
_ => 5
})
.ToArray();

var report = executionCategories
.Aggregate(
new CakeReport(),
(report, category) => executionStatuses.Aggregate(
report,
(report, status) =>
{
report.Add(
$"{category:F}{status:F}",
includeReason && status == CakeTaskExecutionStatus.Skipped ? $"{status:F} reason" : null,
category,
TimeSpan.FromMilliseconds(((int)category + 1) * ((int)status + 1) * 111),
status);
return report;
},
report => report),
report => report);

// When
reportPrinter.Write(report);

// Then
await Verify(console.Output);
}

[Theory]
[InlineData(Verbosity.Quiet)]
[InlineData(Verbosity.Minimal)]
[InlineData(Verbosity.Normal)]
[InlineData(Verbosity.Verbose)]
[InlineData(Verbosity.Diagnostic)]
public async Task WriteStep(Verbosity verbosity)
{
// Given
var console = new TestConsole();
var reportPrinter = new CakeSpectreReportPrinter(console);

// When
reportPrinter.WriteStep("Test Step", verbosity);

// Then
await Verify(console.Output);
}

[Theory]
[InlineData(Verbosity.Quiet)]
[InlineData(Verbosity.Minimal)]
[InlineData(Verbosity.Normal)]
[InlineData(Verbosity.Verbose)]
[InlineData(Verbosity.Diagnostic)]
public async Task WriteLifeCycleStep(Verbosity verbosity)
{
// Given
var console = new TestConsole();
var reportPrinter = new CakeSpectreReportPrinter(console);

// When
reportPrinter.WriteLifeCycleStep("Setup", verbosity);

// Then
await Verify(console.Output);
}

[Theory]
[InlineData(Verbosity.Quiet)]
[InlineData(Verbosity.Minimal)]
[InlineData(Verbosity.Normal)]
[InlineData(Verbosity.Verbose)]
[InlineData(Verbosity.Diagnostic)]
public async Task WriteSkippedStep(Verbosity verbosity)
{
// Given
var console = new TestConsole();
var reportPrinter = new CakeSpectreReportPrinter(console);

// When
reportPrinter.WriteSkippedStep("Skipped Step", verbosity);

// Then
await Verify(console.Output);
}
}
20 changes: 20 additions & 0 deletions src/Cake.Cli.Tests/VerifyConfig.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System.Runtime.CompilerServices;
using VerifyTests.DiffPlex;

namespace Cake.Cli.Tests;

/// <summary>
/// Configuration for Verify tests.
/// </summary>
public static class VerifyConfig
{
/// <summary>
/// Initializes the Verify configuration.
/// </summary>
[ModuleInitializer]
public static void Init()
{
DerivePathInfo(Expectations.Initialize);
VerifyDiffPlex.Initialize(OutputType.Compact);
}
}
Loading
Loading