diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 61328cd..6ffea84 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -153,3 +153,58 @@ jobs: string-parameter: 'value' numeric-parameter: 3 boolean-parameter: true + test-with-frosting: + name: Test with Cake Frosting + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-latest, ubuntu-latest] + env: + project-directory: integrationtests/frosting + steps: + - name: Get the sources + uses: actions/checkout@v1 + - name: Install Node 20 + uses: actions/setup-node@v4 + with: + node-version: '20' + - name: Install the .NET 8 SDK + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + - name: Run a specific Cake Frosting project + uses: ./ + with: + project-path: ${{ env.project-directory}}/Build.csproj + - name: Run a specific target + uses: ./ + with: + project-path: ${{ env.project-directory}}/Build.csproj + target: Successful-Task + - name: Run with a specific verbosity level + uses: ./ + env: + EXPECTED_VERBOSITY: Diagnostic + with: + verbosity: Diagnostic + project-path: ${{ env.project-directory}}/Build.csproj + target: Test-Verbosity + - name: Do a dry run + uses: ./ + with: + dry-run: true + project-path: ${{ env.project-directory }}/Build.csproj + target: Test-Dry-Run + - name: Run with custom script parameters + uses: ./ + env: + EXPECTED_STRING_ARGUMENT: '''value''' + EXPECTED_NUMERIC_ARGUMENT: '3' + EXPECTED_BOOLEAN_ARGUMENT: 'true' + with: + project-path: ${{ env.project-directory }}/Build.csproj + target: Test-Script-Parameters + arguments: | + string-parameter: 'value' + numeric-parameter: 3 + boolean-parameter: true diff --git a/integrationtests/frosting/Build.csproj b/integrationtests/frosting/Build.csproj new file mode 100644 index 0000000..8f8fbc7 --- /dev/null +++ b/integrationtests/frosting/Build.csproj @@ -0,0 +1,10 @@ + + + Exe + net8.0 + $(MSBuildProjectDirectory) + + + + + diff --git a/integrationtests/frosting/Program.cs b/integrationtests/frosting/Program.cs new file mode 100644 index 0000000..6438d7c --- /dev/null +++ b/integrationtests/frosting/Program.cs @@ -0,0 +1,139 @@ +using System; +using Cake.Common; +using Cake.Core; +using Cake.Core.Diagnostics; +using Cake.Frosting; + +public static class Program +{ + public static int Main(string[] args) + { + return new CakeHost() + .UseContext() + .Run(args); + } +} + +public class BuildContext : FrostingContext +{ + public BuildContext(ICakeContext context) + : base(context) + { + StringParameter = context.Argument("String-Parameter", null); + NumericParameter = context.Argument("Numeric-Parameter", null); + BooleanParameter = context.Argument("Boolean-Parameter", null); + } + + public string StringParameter { get; } + + public int? NumericParameter { get; } + + public bool? BooleanParameter { get; } + +} + +[TaskName("Successful-Task")] +public sealed class SuccessfulTask : FrostingTask +{ + public override void Run(BuildContext context) + { + context.Log.Information("✓ Passed"); + } +} + +[TaskName("Test-Verbosity")] +public sealed class TestVerbosity : FrostingTask +{ + public override void Run(BuildContext context) + { + var hasExpectedVerbosity = Enum.TryParse( + context.EnvironmentVariable("EXPECTED_VERBOSITY"), + ignoreCase: true, + out Verbosity expectedVerbosity); + + if (!hasExpectedVerbosity) + { + throw new Exception( + "✕ The EXPECTED_VERBOSITY environment variable is not set or it doesn't contain a verbosity level"); + } + + var actualVerbosity = context.Log.Verbosity; + + if (expectedVerbosity != actualVerbosity) + { + throw new Exception($"✕ Expected verbosity {expectedVerbosity} but got {actualVerbosity}"); + } + + context.Log.Information("✓ Passed"); + } +} + +[TaskName("Test-Dry-Run")] +public sealed class TestDryRun : FrostingTask +{ + public override void Run(BuildContext context) + { + if (!context.IsDryRun()) + { + throw new Exception("✕ Expected this to be a dry run, but it isn't"); + } + + context.Log.Information("✓ Passed"); + } +} + +[TaskName("Test-Script-Parameters")] +public sealed class TestScriptParameters : FrostingTask +{ + public override void Run(BuildContext context) + { + var expectedStringArgument = context.EnvironmentVariable("EXPECTED_STRING_ARGUMENT"); + + var hasExpectedNumericArgument = int.TryParse( + context.EnvironmentVariable("EXPECTED_NUMERIC_ARGUMENT"), + out int expectedNumericArgument); + + var hasExpectedBooleanArgument = bool.TryParse( + context.EnvironmentVariable("EXPECTED_BOOLEAN_ARGUMENT"), + out bool expectedBooleanArgument); + + if (string.IsNullOrEmpty(expectedStringArgument)) + { + throw new Exception( + "✕ The EXPECTED_STRING_ARGUMENT environment variable is not set"); + } + + if (!hasExpectedNumericArgument) + { + throw new Exception( + "✕ The EXPECTED_NUMERIC_ARGUMENT environment variable is not set"); + } + + if (!hasExpectedBooleanArgument) + { + throw new Exception( + "✕ The EXPECTED_BOOLEAN_ARGUMENT environment variable is not set"); + } + + if (expectedStringArgument != context.StringParameter) + { + throw new Exception($"✕ Expected string argument {expectedStringArgument} but got {context.StringParameter}"); + } + + if (expectedNumericArgument != context.NumericParameter) + { + throw new Exception($"✕ Expected numeric argument {expectedNumericArgument} but got {context.NumericParameter}"); + } + + if (expectedBooleanArgument != context.BooleanParameter) + { + throw new Exception($"✕ Expected boolean argument {expectedBooleanArgument} but got {context.BooleanParameter}"); + } + + context.Log.Information("✓ Passed"); + } +} + +[TaskName("Default")] +[IsDependentOn(typeof(SuccessfulTask))] +public class DefaultTask : FrostingTask;