Extract a standalone JIT regression test case from a given GitHub issue and save it under the JitBlue folder. USE FOR: creating JIT regression tests, extracting repro code from dotnet/runtime issues, "write a test for this JIT bug", "create a regression test for issue #NNNNN", converting issue repro to xunit test. DO NOT USE FOR: non-JIT tests (use standard test patterns), debugging JIT issues without a known repro, performance benchmarks (use performance-benchmark skill).
๐จ Do NOT create a test when: the issue has no reproducible code and you cannot compose a minimal repro, the issue is a duplicate of an existing test under
JitBlue/, or the bug is in libraries/runtime rather than the JIT compiler itself.
Extract a JIT regression test case from a GitHub issue into a properly structured test under src/tests/JIT/Regression/JitBlue/.
From the GitHub issue, extract:
Runtime_99391)DOTNET_* vars needed to reproduceCreate a new folder under src/tests/JIT/Regression/JitBlue/:
src/tests/JIT/Regression/JitBlue/Runtime_<issue_number>/
Create a Runtime_<issue_number>.cs file following these conventions:
Example:
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.Runtime.CompilerServices;
using Xunit;
public class Runtime_<issue_number>
{
[Fact]
public static void TestEntryPoint()
{
// Test code that exercises the bug
// Use Assert.Equal, Assert.True, etc. for validation
}
}
Runtime_<issue_number>)[Fact] attribute, named TestEntryPoint()[MethodImpl(MethodImplOptions.NoInlining)] when preventing inlining is needed to reproduce// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Runtime_99391;
using System;
using System.Runtime.CompilerServices;
using System.Numerics;
using Xunit;
public class Runtime_99391
{
[Fact]
public static void TestEntryPoint()
{
Vector2 result2a = Vector2.Normalize(Value2);
Assert.Equal(new Vector2(0, 1), result2a);
}
private static Vector2 Value2
{
[MethodImpl(MethodImplOptions.NoInlining)]
get => new Vector2(0, 2);
}
}
A custom .csproj file is only required when:
DOTNET_JitStressModeNames)Otherwise, register the test file in the existing src/tests/JIT/Regression/Regression_*.csproj (Regression_ro_2.csproj is a good default) file and skip creating a new .csproj.
If a custom .csproj file is needed, it should be located next to the test source file with the following name: Runtime_<issue_number>.csproj. Example:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Optimize>True</Optimize>
<DebugType>None</DebugType>
<!-- Needed for CLRTestEnvironmentVariable -->
<RequiresProcessIsolation>true</RequiresProcessIsolation>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildProjectName).cs" />
<CLRTestEnvironmentVariable Include="DOTNET_TieredCompilation" Value="0" />
</ItemGroup>
</Project>
.cs file in Regression_ro_2.csproj instead.src/tests/JIT/Regression/JitBlue/Runtime_* when in doubt about current conventions.