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;