File: JavaLanguageSupportTests.cs
Web Access
Project: src\tests\Aspire.Hosting.CodeGeneration.Java.Tests\Aspire.Hosting.CodeGeneration.Java.Tests.csproj (Aspire.Hosting.CodeGeneration.Java.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.RegularExpressions;
 
using Aspire.TypeSystem;
 
namespace Aspire.Hosting.CodeGeneration.Java.Tests;
 
public class JavaLanguageSupportTests
{
    [Fact]
    public void GetRuntimeSpec_SetsCompileUpToDateCheckWhenSupported()
    {
        var runtimeSpec = new JavaLanguageSupport().GetRuntimeSpec();
        var compile = Assert.Single(runtimeSpec.PreExecute!);
 
        AssertCompileUpToDateCheck(compile);
    }
 
    [Fact]
    public void JavaStarter_UsesRuntimeSpecJavaRelease()
    {
        var runtimeSpec = new JavaLanguageSupport().GetRuntimeSpec();
        var compile = Assert.Single(runtimeSpec.PreExecute!);
        var releaseArgumentIndex = Array.IndexOf(compile.Args, "--release");
 
        Assert.InRange(releaseArgumentIndex, 0, compile.Args.Length - 2);
        var runtimeRelease = compile.Args[releaseArgumentIndex + 1];
 
        var buildFilePath = Path.Combine(
            GetRepoRoot(),
            "src",
            "Aspire.Cli",
            "Templating",
            "Templates",
            "java-starter",
            "api",
            "build.gradle");
        var buildFile = File.ReadAllText(buildFilePath);
        var match = Regex.Match(
            buildFile,
            @"languageVersion\s*=\s*JavaLanguageVersion\.of\((?<release>\d+)\)");
 
        Assert.True(match.Success, $"Could not find the Java toolchain language version in '{buildFilePath}'.");
        Assert.Equal(runtimeRelease, match.Groups["release"].Value);
    }
 
    [Fact]
    public void SetCompileUpToDateCheckIfSupported_PopulatesCompileUpToDateCheckOnCommandSpec()
    {
        var compile = new CommandSpec
        {
            Command = "javac",
            Args = ["--release", "25", "-d", ".java-build", "@.aspire/modules/sources.txt", "{appHostFile}"]
        };
 
        JavaLanguageSupport.SetCompileUpToDateCheckIfSupported(compile, ".java-build");
 
        AssertCompileUpToDateCheck(compile);
    }
 
    [Fact]
    public void SetCompileUpToDateCheckIfSupported_IgnoresLegacyCommandSpec()
    {
        var exception = Record.Exception(() =>
            JavaLanguageSupport.SetCompileUpToDateCheckIfSupported(
                new LegacyCommandSpec(),
                ".java-build"));
 
        Assert.Null(exception);
    }
 
    [Fact]
    public void SetCompileUpToDateCheckIfSupported_IgnoresLegacyUpToDateCheckWithoutOutputs()
    {
        var command = new LegacyCommandSpecWithUpToDateCheck();
 
        var exception = Record.Exception(() =>
            JavaLanguageSupport.SetCompileUpToDateCheckIfSupported(
                command,
                ".java-build"));
 
        Assert.Null(exception);
        Assert.Null(command.UpToDateCheck);
    }
 
    private sealed class LegacyCommandSpec
    {
    }
 
    private sealed class LegacyCommandSpecWithUpToDateCheck
    {
        public LegacyCommandUpToDateCheck? UpToDateCheck { get; set; }
    }
 
    private sealed class LegacyCommandUpToDateCheck
    {
        public string[]? Inputs { get; set; }
        public string[]? FileExtensions { get; set; }
        public string? StampFile { get; set; }
    }
 
    private static string GetRepoRoot()
        => Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "..", ".."));
 
    private static void AssertCompileUpToDateCheck(CommandSpec compile)
    {
        var check = Assert.IsType<CommandUpToDateCheck>(compile.UpToDateCheck);
 
        Assert.Equal(["{appHostFile}", "./**", ".aspire/modules/**", "src/main/java/**"], check.Inputs);
        Assert.Equal([Path.Combine(".java-build", "AppHost.class")], check.Outputs!);
        Assert.Equal([".java"], check.FileExtensions!);
        Assert.Equal(Path.Combine(".java-build", ".aspire-compile-stamp"), check.StampFile);
    }
}