Skip to content

Smdn.MSBuild.ProjectAssets.Library version 1.16.0

Latest

Choose a tag to compare

@smdn smdn released this 11 Oct 12:14
· 2 commits to main since this release
Immutable release. Only release title and notes can be modified.
9d59e58

Released package

Release notes

The full release notes are available at gist.

Change log

Change log in this release:

Full changes

Full changes in this release:
diff --git a/src/Smdn.MSBuild.ProjectAssets.Library/Smdn.MSBuild.ProjectAssets.Library.csproj b/src/Smdn.MSBuild.ProjectAssets.Library/Smdn.MSBuild.ProjectAssets.Library.csproj
index a30fbd4..fb6e856 100644
--- a/src/Smdn.MSBuild.ProjectAssets.Library/Smdn.MSBuild.ProjectAssets.Library.csproj
+++ b/src/Smdn.MSBuild.ProjectAssets.Library/Smdn.MSBuild.ProjectAssets.Library.csproj
@@ -6,7 +6,7 @@ SPDX-License-Identifier: MIT
   <Import Project="$(MSBuildThisFileDirectory)..\..\eng\ProjectSettings.NoAssemblies.props" />
 
   <PropertyGroup>
-    <VersionPrefix>1.15.1</VersionPrefix>
+    <VersionPrefix>1.16.0</VersionPrefix>
     <VersionSuffix></VersionSuffix>
     <DevelopmentDependency>true</DevelopmentDependency>
     <PackageType>Dependency;MSBuildSdk</PackageType>
@@ -34,7 +34,6 @@ SPDX-License-Identifier: MIT
     <None Include="project\NUnit.Analyzers.ruleset"       Pack="true" PackagePath="project\" />
     <None Include="project\StyleCop.Analyzers.ruleset"    Pack="true" PackagePath="project\" />
     <None Include="project\stylecop.json"                 Pack="true" PackagePath="project\" />
-    <None Include="project\TestReport.template.liquid.md" Pack="true" PackagePath="project\" />
     <None Include="Sdk\Sdk.props"                         Pack="true" PackagePath="Sdk\" />
     <None Include="Sdk\Sdk.targets"                       Pack="true" PackagePath="Sdk\" />
   </ItemGroup>
diff --git a/src/Smdn.MSBuild.ProjectAssets.Library/project/LiquidTestReports.MTP.targets b/src/Smdn.MSBuild.ProjectAssets.Library/project/LiquidTestReports.MTP.targets
deleted file mode 100644
index 2ed99f0..0000000
--- a/src/Smdn.MSBuild.ProjectAssets.Library/project/LiquidTestReports.MTP.targets
+++ /dev/null
@@ -1,60 +0,0 @@
-<!--
-SPDX-FileCopyrightText: 2025 smdn <smdn@smdn.jp>
-SPDX-License-Identifier: MIT
--->
-<!-- cspell:ignore liquidtr -->
-<Project>
-  <PropertyGroup>
-    <!-- Smdn.Extensions.Mtp.LiquidTestReports requires >= netstandard2.0 -->
-    <SmdnExtensionsMtpLiquidTestReportsAvailable>true</SmdnExtensionsMtpLiquidTestReportsAvailable>
-    <SmdnExtensionsMtpLiquidTestReportsAvailable
-      Condition="
-        '$(TargetFramework)' == 'net46' or
-        $(TargetFramework.StartsWith('net45')) or
-        $(TargetFramework.StartsWith('netcoreapp1')) or
-        $(TargetFramework.StartsWith('netstandard1'))
-      "
-    >false</SmdnExtensionsMtpLiquidTestReportsAvailable>
-
-    <!-- disable if Smdn.Extensions.Mtp.LiquidTestReports is not available -->
-    <EnableLiquidTestReports
-      Condition=" '$(SmdnExtensionsMtpLiquidTestReportsAvailable)' != 'true' "
-    >false</EnableLiquidTestReports>
-  </PropertyGroup>
-
-  <ItemGroup Condition=" '$(EnableLiquidTestReports)' == 'true' ">
-    <PackageReference
-      Include="Smdn.Extensions.Mtp.LiquidTestReports"
-      Version="$(SmdnExtensionsMtpLiquidTestReportsPackageReferenceVersion)"
-    />
-  </ItemGroup>
-
-  <PropertyGroup Condition=" '$(EnableLiquidTestReports)' == 'true' " Label="Configurations for Smdn.Extensions.Mtp.LiquidTestReports">
-    <TestingPlatformCommandLineArguments
-      Condition="!($(TestingPlatformCommandLineArguments.Contains(' --report-trx')) or $(TestingPlatformCommandLineArguments.Contains('--report-trx ')))"
-    >$(TestingPlatformCommandLineArguments) --report-trx</TestingPlatformCommandLineArguments>
-
-    <TestingPlatformCommandLineArguments
-      Condition="!($(TestingPlatformCommandLineArguments.Contains(' --report-trx-filename')) or $(TestingPlatformCommandLineArguments.Contains('--report-trx-filename ')))"
-    >$(TestingPlatformCommandLineArguments) --report-trx-filename $(AssemblyName)-$(TargetFramework).trx</TestingPlatformCommandLineArguments>
-
-    <TestingPlatformCommandLineArguments
-    >$(TestingPlatformCommandLineArguments) --liquidtr-template $(LiquidTestReportsTemplateFile)</TestingPlatformCommandLineArguments>
-
-    <TestingPlatformCommandLineArguments
-      Condition=" '$(EnableLiquidTestReportsGitHubStepSummary)' == 'true' "
-    >$(TestingPlatformCommandLineArguments) --liquidtr-github-step-summary</TestingPlatformCommandLineArguments>
-
-    <TestingPlatformCommandLineArguments
-      Condition=" '$(LiquidTestReportsOmitPassedTestResults)' != '' "
-    >$(TestingPlatformCommandLineArguments) --liquidtr-parameter OmitPassedTestResults=$(LiquidTestReportsOmitPassedTestResults)</TestingPlatformCommandLineArguments>
-
-    <TestingPlatformCommandLineArguments
-      Condition=" '$(LiquidTestReportsEmitTestMessages)' != '' "
-    >$(TestingPlatformCommandLineArguments) --liquidtr-parameter EmitTestMessages=$(LiquidTestReportsEmitTestMessages)</TestingPlatformCommandLineArguments>
-
-    <TestingPlatformCommandLineArguments
-      Condition=" '$(LiquidTestReportsEmitTestCaseResultMessages)' != '' "
-    >$(TestingPlatformCommandLineArguments) --liquidtr-parameter EmitTestCaseResultMessages=$(LiquidTestReportsEmitTestCaseResultMessages)</TestingPlatformCommandLineArguments>
-  </PropertyGroup>
-</Project>
diff --git a/src/Smdn.MSBuild.ProjectAssets.Library/project/LiquidTestReports.props b/src/Smdn.MSBuild.ProjectAssets.Library/project/LiquidTestReports.props
deleted file mode 100644
index 0f84d88..0000000
--- a/src/Smdn.MSBuild.ProjectAssets.Library/project/LiquidTestReports.props
+++ /dev/null
@@ -1,19 +0,0 @@
-<!--
-SPDX-FileCopyrightText: 2023 smdn <smdn@smdn.jp>
-SPDX-License-Identifier: MIT
--->
-<Project>
-  <PropertyGroup Label="LiquidTestReports">
-    <EnableLiquidTestReports Condition=" '$(EnableLiquidTestReports)' == '' and '$(GITHUB_ACTIONS)' == 'true' ">true</EnableLiquidTestReports><!-- by default, enables LiquidTestReports only on GitHub Actions -->
-    <EnableLiquidTestReportsGitHubStepSummary Condition=" '$(EnableLiquidTestReportsGitHubStepSummary)' == '' ">true</EnableLiquidTestReportsGitHubStepSummary><!-- by default, enables outputting reports to GITHUB_STEP_SUMMARY -->
-    <LiquidTestReportsTemplateFile Condition=" '$(LiquidTestReportsTemplateFile)' == '' ">$(MSBuildThisFileDirectory)TestReport.template.liquid.md</LiquidTestReportsTemplateFile><!-- default test report template file for LiquidTestReports -->
-    <LiquidTestReportsOmitPassedTestResults Condition=" '$(LiquidTestReportsOmitPassedTestResults)' == '' " >true</LiquidTestReportsOmitPassedTestResults> <!-- whether or not to let LiquidTestReports omit output tests that passed -->
-    <LiquidTestReportsEmitTestMessages Condition=" '$(LiquidTestReportsEmitTestMessages)' == '' " >true</LiquidTestReportsEmitTestMessages> <!-- whether to let LiquidTestReports output test messages or not -->
-    <LiquidTestReportsEmitTestCaseResultMessages Condition=" '$(LiquidTestReportsEmitTestCaseResultMessages)' == '' ">true</LiquidTestReportsEmitTestCaseResultMessages> <!-- whether to let LiquidTestReports output test messages or not -->
-
-    <!-- Smdn.Extensions.Mtp.LiquidTestReports for Microsoft.Testing.Platform -->
-    <SmdnExtensionsMtpLiquidTestReportsPackageReferenceVersion
-      Condition=" '$(SmdnExtensionsMtpLiquidTestReportsPackageReferenceVersion)' == '' "
-    >1.1.0</SmdnExtensionsMtpLiquidTestReportsPackageReferenceVersion>
-  </PropertyGroup>
-</Project>
diff --git a/src/Smdn.MSBuild.ProjectAssets.Library/project/MicrosoftTestingExtensionsGitHubActionsReport.props b/src/Smdn.MSBuild.ProjectAssets.Library/project/MicrosoftTestingExtensionsGitHubActionsReport.props
new file mode 100644
index 0000000..56dcc96
--- /dev/null
+++ b/src/Smdn.MSBuild.ProjectAssets.Library/project/MicrosoftTestingExtensionsGitHubActionsReport.props
@@ -0,0 +1,12 @@
+<!--
+SPDX-FileCopyrightText: 2026 smdn <smdn@smdn.jp>
+SPDX-License-Identifier: MIT
+-->
+<Project>
+  <PropertyGroup Label="Microsoft.Testing.Extensions.GitHubActionsReport">
+    <!-- by default, enables Microsoft.Testing.Extensions.GitHubActionsReport only on GitHub Actions -->
+    <EnableGitHubActionsTestReport
+      Condition=" '$(EnableGitHubActionsTestReport)' == '' and '$(GITHUB_ACTIONS)' == 'true' "
+    >true</EnableGitHubActionsTestReport>
+  </PropertyGroup>
+</Project>
diff --git a/src/Smdn.MSBuild.ProjectAssets.Library/project/MicrosoftTestingExtensionsGitHubActionsReport.targets b/src/Smdn.MSBuild.ProjectAssets.Library/project/MicrosoftTestingExtensionsGitHubActionsReport.targets
new file mode 100644
index 0000000..1c4bb7b
--- /dev/null
+++ b/src/Smdn.MSBuild.ProjectAssets.Library/project/MicrosoftTestingExtensionsGitHubActionsReport.targets
@@ -0,0 +1,58 @@
+<!--
+SPDX-FileCopyrightText: 2025 smdn <smdn@smdn.jp>
+SPDX-License-Identifier: MIT
+-->
+<Project>
+  <ItemGroup Condition=" '$(EnableGitHubActionsTestReport)' == 'true' ">
+    <PackageReference
+      Include="Microsoft.Testing.Extensions.GitHubActionsReport"
+      Version="2.5.1"
+    />
+  </ItemGroup>
+
+  <!-- Default configurations for Microsoft.Testing.Extensions.GitHubActionsReport, as of v2.5.1 -->
+  <PropertyGroup
+    Condition=" '$(EnableGitHubActionsTestReport)' == 'true' "
+    Label="Default configurations for Microsoft.Testing.Extensions.GitHubActionsReport"
+  >
+    <!-- Enable generating test report with Microsoft.Testing.Extensions.GitHubActionsReport -->
+    <TestingPlatformCommandLineArguments
+      Condition="!($(TestingPlatformCommandLineArguments.Contains(' --report-gh')) or $(TestingPlatformCommandLineArguments.Contains('--report-gh ')))"
+    >$(TestingPlatformCommandLineArguments) --report-gh</TestingPlatformCommandLineArguments>
+
+    <!-- Enable GitHub Actions annotations for failed and skipped tests. -->
+    <TestingPlatformCommandLineArguments
+      Condition="!($(TestingPlatformCommandLineArguments.Contains(' --report-gh-annotations=')) or $(TestingPlatformCommandLineArguments.Contains('--report-gh-annotations ')))"
+    >$(TestingPlatformCommandLineArguments) --report-gh-annotations=true</TestingPlatformCommandLineArguments>
+
+    <!-- Enable expanding each failed test in the job summary into a collapsible section. -->
+    <TestingPlatformCommandLineArguments
+      Condition="!($(TestingPlatformCommandLineArguments.Contains(' --report-gh-failure-details=')) or $(TestingPlatformCommandLineArguments.Contains('--report-gh-failure-details ')))"
+    >$(TestingPlatformCommandLineArguments) --report-gh-failure-details=true</TestingPlatformCommandLineArguments>
+
+    <!-- Enable per-assembly log groups. -->
+    <TestingPlatformCommandLineArguments
+      Condition="!($(TestingPlatformCommandLineArguments.Contains(' --report-gh-groups=')) or $(TestingPlatformCommandLineArguments.Contains('--report-gh-groups ')))"
+    >$(TestingPlatformCommandLineArguments) --report-gh-groups=true</TestingPlatformCommandLineArguments>
+
+    <!-- Enable writing a markdown job summary to the GITHUB_STEP_SUMMARY file. -->
+    <TestingPlatformCommandLineArguments
+      Condition="!($(TestingPlatformCommandLineArguments.Contains(' --report-gh-step-summary=')) or $(TestingPlatformCommandLineArguments.Contains('--report-gh-step-summary ')))"
+    >$(TestingPlatformCommandLineArguments) --report-gh-step-summary=true</TestingPlatformCommandLineArguments>
+
+    <!-- Include the 'all' content in the GitHub Actions job summary. -->
+    <TestingPlatformCommandLineArguments
+      Condition="!($(TestingPlatformCommandLineArguments.Contains(' --report-gh-step-summary-sections=')) or $(TestingPlatformCommandLineArguments.Contains('--report-gh-step-summary-sections ')))"
+    >$(TestingPlatformCommandLineArguments) --report-gh-step-summary-sections=all</TestingPlatformCommandLineArguments>
+
+    <!-- Enable GitHub Actions slow-test notices. -->
+    <TestingPlatformCommandLineArguments
+      Condition="!($(TestingPlatformCommandLineArguments.Contains(' --report-gh-slow-test-notices=')) or $(TestingPlatformCommandLineArguments.Contains('--report-gh-slow-test-notices ')))"
+    >$(TestingPlatformCommandLineArguments) --report-gh-slow-test-notices=true</TestingPlatformCommandLineArguments>
+
+    <!-- The duration a test may run before a GitHub Actions slow-test notice is emitted. -->
+    <TestingPlatformCommandLineArguments
+      Condition="!($(TestingPlatformCommandLineArguments.Contains(' --report-gh-slow-test-threshold=')) or $(TestingPlatformCommandLineArguments.Contains('--report-gh-slow-test-threshold ')))"
+    >$(TestingPlatformCommandLineArguments) --report-gh-slow-test-threshold=30s</TestingPlatformCommandLineArguments>
+  </PropertyGroup>
+</Project>
diff --git a/src/Smdn.MSBuild.ProjectAssets.Library/project/NUnit.Analyzers.ruleset b/src/Smdn.MSBuild.ProjectAssets.Library/project/NUnit.Analyzers.ruleset
index df56391..c3f2030 100644
--- a/src/Smdn.MSBuild.ProjectAssets.Library/project/NUnit.Analyzers.ruleset
+++ b/src/Smdn.MSBuild.ProjectAssets.Library/project/NUnit.Analyzers.ruleset
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <!--
 SPDX-FileCopyrightText: 2023 smdn <smdn@smdn.jp>
 SPDX-License-Identifier: MIT
 -->
 <!-- ref: https://github.com/nunit/nunit.analyzers/blob/master/documentation/index.md -->
-<RuleSet Name="NUnit.Analyzer rules for Smdn.Fundamentals" ToolsVersion="14.0">
+<RuleSet Name="NUnit.Analyzer rules for Smdn.MSBuild.ProjectAssets.Library" ToolsVersion="14.0">
   <Rules AnalyzerId="DiagnosticSuppressors" RuleNamespace="NUnit.NUnitAnalyzers">
     <Rule Id="NUnit2007" Action="Error" /> <!-- The actual value should not be a constant -->
     <Rule Id="NUnit2050" Action="Error" /> <!-- NUnit 4 no longer supports string.Format specification -->
diff --git a/src/Smdn.MSBuild.ProjectAssets.Library/project/Project.props b/src/Smdn.MSBuild.ProjectAssets.Library/project/Project.props
index d92a1c5..ce8c369 100644
--- a/src/Smdn.MSBuild.ProjectAssets.Library/project/Project.props
+++ b/src/Smdn.MSBuild.ProjectAssets.Library/project/Project.props
@@ -58,7 +58,7 @@ SPDX-License-Identifier: MIT
   <ImportGroup Condition=" '$(IsTestProject)' == 'true' ">
     <!-- NUnit Analyzers code analysis -->
     <Import Project="$(MSBuildThisFileDirectory)CodeAnalysis.NUnitAnalyzers.props" />
-    <!-- LiquidTestReports -->
-    <Import Project="$(MSBuildThisFileDirectory)LiquidTestReports.props" />
+    <!-- Microsoft.Testing.Extensions.GitHubActionsReport -->
+    <Import Project="$(MSBuildThisFileDirectory)MicrosoftTestingExtensionsGitHubActionsReport.props" />
   </ImportGroup>
 </Project>
diff --git a/src/Smdn.MSBuild.ProjectAssets.Library/project/Project.targets b/src/Smdn.MSBuild.ProjectAssets.Library/project/Project.targets
index b4d73b5..cc26b53 100644
--- a/src/Smdn.MSBuild.ProjectAssets.Library/project/Project.targets
+++ b/src/Smdn.MSBuild.ProjectAssets.Library/project/Project.targets
@@ -25,12 +25,10 @@ SPDX-License-Identifier: MIT
   <ImportGroup Condition=" '$(IsTestProject)' == 'true' ">
     <!-- NUnit Analyzers code analysis -->
     <Import Project="$(MSBuildThisFileDirectory)CodeAnalysis.NUnitAnalyzers.targets" />
-    <!-- LiquidTestReports (Microsoft.Testing.Platform) -->
+    <!-- Microsoft.Testing.Extensions.GitHubActionsReport (Microsoft.Testing.Platform) -->
     <Import
       Condition=" '$(EnableNUnitRunner)' == 'true' "
-      Project="$(MSBuildThisFileDirectory)LiquidTestReports.MTP.targets"
+      Project="$(MSBuildThisFileDirectory)MicrosoftTestingExtensionsGitHubActionsReport.targets"
     />
-    <!-- extension points for VSTest target -->
-    <Import Project="$(MSBuildThisFileDirectory)VSTestExtensionPoints.targets" Condition=" '$(IsVSTestTargetOverridden)' == '' " />
   </ImportGroup>
 </Project>
diff --git a/src/Smdn.MSBuild.ProjectAssets.Library/project/StyleCop.Analyzers.ruleset b/src/Smdn.MSBuild.ProjectAssets.Library/project/StyleCop.Analyzers.ruleset
index 95951b1..76021a6 100644
--- a/src/Smdn.MSBuild.ProjectAssets.Library/project/StyleCop.Analyzers.ruleset
+++ b/src/Smdn.MSBuild.ProjectAssets.Library/project/StyleCop.Analyzers.ruleset
@@ -1,11 +1,11 @@
-<?xml version="1.0"?>
+<?xml version="1.0"?>
 <!--
 SPDX-FileCopyrightText: 2022 smdn <smdn@smdn.jp>
 SPDX-License-Identifier: MIT
 -->
 <!-- ref: https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/DOCUMENTATION.md -->
 <!-- based on: https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/rulesets/StyleCopAnalyzersDefault.ruleset -->
-<RuleSet Name="StyleCop.Analyzers rules for Smdn.Fundamentals" ToolsVersion="14.0">
+<RuleSet Name="StyleCop.Analyzers rules for Smdn.MSBuild.ProjectAssets.Library" ToolsVersion="14.0">
   <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.SpecialRules">
     <Rule Id="SA0001"  Action="None" />             <!-- XML comment analysis disabled -->
     <Rule Id="SA0002"  Action="Warning" />          <!-- Invalid settings file -->
diff --git a/src/Smdn.MSBuild.ProjectAssets.Library/project/TestReport.template.liquid.md b/src/Smdn.MSBuild.ProjectAssets.Library/project/TestReport.template.liquid.md
deleted file mode 100644
index 9d6fcac..0000000
--- a/src/Smdn.MSBuild.ProjectAssets.Library/project/TestReport.template.liquid.md
+++ /dev/null
@@ -1,288 +0,0 @@
-{%- comment -%}
-SPDX-FileCopyrightText: 2023 smdn <smdn@smdn.jp>
-SPDX-License-Identifier: MIT
-{%- endcomment -%}
-{%- comment -%}
-  ref: https://github.com/kurtmkurtm/LiquidTestReports/blob/master/docs/Properties.md
-  ref: https://shopify.github.io/liquid/basics/introduction/
-{%- endcomment -%}
-{%- assign symbol_passed = "🟢" -%}
-{%- assign symbol_indeterminate = "🟡" -%}
-{%- assign symbol_failed = "🔴" -%}
-{%- assign symbol_inconclusive = "💭" -%}
-{%- assign symbol_not_found = "❔" -%}
-{%- assign test_count_passed   = run.test_run_statistics.passed_count -%}
-{%- assign test_count_failed   = run.test_run_statistics.failed_count -%}
-{%- assign test_count_skipped  = run.test_run_statistics.skipped_count -%}
-{%- assign test_count_other    = run.test_run_statistics.none_count | plus: run.test_run_statistics.not_found_count -%}
-{%- assign test_count_total    = run.test_run_statistics.executed_tests_count -%}
-{%- if test_count_passed == test_count_total -%}
-{%-   assign overall = symbol_passed | append: " Pass" *-%}
-{%- elsif test_count_failed == 0 -%}
-{%-   assign overall = symbol_indeterminate | append: " Indeterminate" *-%}
-{%- else -%}
-{%-   assign overall = symbol_failed | append: " Fail" *-%}
-{%- endif -%}
-{%- case parameters.OmitPassedTestResults | downcase -%}
-{%-   when 'true' -%}{%- assign parameter_emit_passed_test_results = false -%}
-{%-   else -%}{%- assign parameter_emit_passed_test_results = true -%}
-{%- endcase -%}
-{%- case parameters.EmitTestMessages | downcase -%}
-{%-   when 'true' -%}{%- assign parameter_emit_test_messages = true -%}
-{%-   else -%}{%- assign parameter_emit_test_messages = false -%}
-{%- endcase -%}
-{%- case parameters.EmitTestCaseResultMessages | downcase -%}
-{%-   when 'true' -%}{%- assign parameter_emit_result_messages = true -%}
-{%-   else -%}{%- assign parameter_emit_result_messages = false -%}
-{%- endcase -%}
-## {{overall}}: {{ parameters.TestTargetName }} ({{ parameters.TargetFramework }} on {{ parameters.RuntimeIdentifier }})
-{%- assign percentage_passed  = test_count_passed  | divided_by: test_count_total | times: 100.0 | round: 2 *-%}
-{%- assign percentage_failed  = test_count_failed  | divided_by: test_count_total | times: 100.0 | round: 2 *-%}
-{%- assign percentage_skipped = test_count_skipped | divided_by: test_count_total | times: 100.0 | round: 2 *-%}
-{%- assign percentage_other   = test_count_other   | divided_by: test_count_total | times: 100.0 | round: 2 *-%}
-{%- if test_count_passed != test_count_total -%}
-{%-   assign emit_overall_table = true -%}
-{%- else -%}
-{%-   assign emit_overall_table = parameter_emit_passed_test_results -%}
-{%- endif -%}
-{%- if emit_overall_table -%}
-{%-   if 0 < test_count_failed -%}
-{%-     assign emit_column_failed = true -%}
-{%-   else -%}
-{%-     assign emit_column_failed = false -%}
-{%-   endif -%}
-{%-   if 0 < test_count_skipped -%}
-{%-     assign emit_column_skipped = true -%}
-{%-   else -%}
-{%-     assign emit_column_skipped = false -%}
-{%-   endif -%}
-{%-   if 0 < test_count_other -%}
-{%-     assign emit_column_other = true -%}
-{%-   else -%}
-{%-     assign emit_column_other = false -%}
-{%-   endif -%}
-<table>
-  <thead>
-    <tr>
-      <th></th>
-      <th scope="col">{{symbol_passed}} Passed</th>
-{%- if emit_column_failed -%}
-      <th scope="col">{{symbol_failed}} Failed</th>
-{%- endif -%}
-{%- if emit_column_skipped -%}
-      <th scope="col">{{symbol_indeterminate}} Skipped</th>
-{%- endif -%}
-{%- if emit_column_other -%}
-      <th scope="col">{{symbol_inconclusive}} Inconclusive<br/>{{symbol_not_found}} Not found</th>
-{%- endif -%}
-      <th scope="col">Total</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th scope="row">#</th>
-      <td>{{ test_count_passed }}</td>
-{%- if emit_column_failed -%}
-      <td>{{ test_count_failed }}</td>
-{%- endif -%}
-{%- if emit_column_skipped -%}
-      <td>{{ test_count_skipped }}</td>
-{%- endif -%}
-{%- if emit_column_other -%}
-      <td>{{ test_count_other }}</td>
-{%- endif -%}
-      <td>{{ test_count_total }}</td>
-    </tr>
-    <tr>
-      <th scope="row">%</th>
-      <td>{{ percentage_passed }}</td>
-{%- if emit_column_failed -%}
-      <td>{{ percentage_failed }}</td>
-{%- endif -%}
-{%- if emit_column_skipped -%}
-      <td>{{ percentage_skipped }}</td>
-{%- endif -%}
-{%- if emit_column_other-%}
-      <td>{{ percentage_other }}</td>
-{%- endif -%}
-      <td>100</td>
-    </tr>
-  </tbody>
-</table>
-{%- endif -%}
-
-{%- if percentage_failed == 0 -%}
-{%-   assign test_details_open_attr = '' -%}
-{%- else -%}
-{%-   assign test_details_open_attr = ' open' -%}
-{%- endif -%}
-<details{{ test_details_open_attr }}>
-  <summary>Test details</summary>
-  <dl>
-    <dt>Duration</dt>
-    <dd>{{ run.elapsed_time_in_running_tests | format_rfc3339 }}</dd>
-    <dt>Started at</dt>
-    <dd><time>{{ run.started | date: '%Y-%m-%dT%H:%M:%S%Z' }}</time></dd>
-    <dt>Finished at</dt>
-    <dd><time>{{ run.finished | | date: '%Y-%m-%dT%H:%M:%S%Z' }}</time></dd>
-  </dl>
-{%- if parameter_emit_test_messages | -%}
-{%-   assign messages_error         = run.messages | where: "level", "Error" -%}
-{%-   assign messages_warning       = run.messages | where: "level", "Warning" -%}
-{%-   assign messages_informational = run.messages | where: "level", "Informational" -%}
-{%-   assign messages_error_size         = messages_error | size -%}
-{%-   assign messages_warning_size       = messages_warning | size -%}
-{%-   assign messages_informational_size = messages_informational | size -%}
-  <dl>
-{%-   if 0 < messages_error_size -%}
-    <dt>❌ Errors</dt>
-    <dd><pre><code>{%- for msg in messages_error -%}[{{ msg.level }}]{{ msg.message | escape }}
-{%-     endfor -%}</code></pre></dd>
-{%-   endif -%}
-{%-   if 0 < messages_warning_size -%}
-    <dt>⚠️ Warnings</dt>
-    <dd><pre><code>{%- for msg in messages_warning -%}[{{ msg.level }}]{{ msg.message | escape }}
-{%-     endfor -%}</code></pre></dd>
-{%-   endif -%}
-{%-   if 0 < messages_informational_size -%}
-    <dt>❕ Informational messages</dt>
-    <dd><pre><code>{%- for msg in messages_informational -%}[{{ msg.level }}]{{ msg.message | escape }}
-{%-     endfor -%}</code></pre></dd>
-{%-   endif -%}
-  </dl>
-{%- endif -%}
-</details>
-
-{%- for set in run.result_sets -%}
-{%-   if set.passed_count == set.executed_tests_count -%}
-{%-     capture set_result_summary -%} ✔All {{ set.passed_count}} tests passed {%- endcapture -%}
-{%-   elsif set.failed_count == 0 -%}
-{%-     capture set_result_summary -%} ✔{{ set.passed_count}} of {{ set.executed_tests_count}} tests passed {%- endcapture -%}
-{%-   else -%}
-{%-     capture set_result_summary -%} ✖{{ set.failed_count}} tests failed ✔{{ set.passed_count}} of {{ set.executed_tests_count}} tests passed{%- endcapture -%}
-{%-   endif -%}
-### {{ set.source | path_split | last }} - {{ set_result_summary }}
-{%-   comment -%}
-        convert the test results into a list of indices, categorized by their outcomes.
-        and then convert list into a joined string in the following format:
-          "Passed=0,1,3,6..."
-          "Indeterminate=2,5..."
-          "Failed=4"
-{%-   endcomment -%}
-{%-   assign result_index_list_of_passed = '' -%}
-{%-   assign result_index_list_of_indeterminate = '' -%}
-{%-   assign result_index_list_of_failed = '' -%}
-{%-   for result in set.results -%}
-{%-     if result.outcome == 'Passed' -%}
-{%-       if parameter_emit_passed_test_results -%}
-{%-         capture result_index_list_of_passed -%}{{ result_index_list_of_passed }},{{ forloop.index0 }}{%- endcapture -%}
-{%-       endif -%}
-{%-     elsif result.outcome == "Failed" -%}
-{%-       capture result_index_list_of_failed -%}{{ result_index_list_of_failed }},{{ forloop.index0 }}{%- endcapture -%}
-{%-     else -%}
-{%-       capture result_index_list_of_indeterminate -%}{{ result_index_list_of_indeterminate }},{{ forloop.index0 }}{%- endcapture -%}
-{%-     endif -%}
-{%-   endfor -%}
-{%-   capture result_index_list_of_passed -%}Passed={{ result_index_list_of_passed | remove_first: ',' }}{%- endcapture -%}
-{%-   capture result_index_list_of_indeterminate -%}Indeterminate={{ result_index_list_of_indeterminate | remove_first: ',' }}{%- endcapture -%}
-{%-   capture result_index_list_of_failed -%}Failed={{ result_index_list_of_failed | remove_first: ',' }}{%- endcapture -%}
-{%-   comment -%}
-        construct array of result_index_list_of_*
-{%-   endcomment -%}
-{%-   capture result_index_lists_in_string -%}{{ result_index_list_of_failed }};{{ result_index_list_of_indeterminate }};{{result_index_list_of_passed}}{%- endcapture -%}
-{%-   assign result_index_lists = result_index_lists_in_string | split: ';' -%}
-{%-   for result_index_list in result_index_lists -%}
-{%-     comment -%}
-          split result_index_list into outcome and array of indices
-{%-     endcomment -%}
-{%-     assign result_outcome_and_index_list = result_index_list | split: '=' -%}
-{%-     if result_outcome_and_index_list.size == 1 -%}
-{%-       continue -%}
-{%-     endif -%}
-{%-     assign result_outcome = result_outcome_and_index_list[0] -%}
-{%-     assign result_indices = result_outcome_and_index_list[1] | split: ',' -%}
-{%-     case result_outcome -%}
-{%-       when 'Passed' -%}
-{%-         assign result_symbol = symbol_passed -%}
-{%-         assign result_details_open_attr = '' -%}
-{%-       when 'Failed' -%}
-{%-         assign result_symbol = symbol_failed -%}
-{%-         assign result_details_open_attr = ' open' -%}
-{%-       else -%}
-{%-         assign result_symbol = symbol_indeterminate -%}
-{%-         assign result_details_open_attr = ' open' -%}
-{%-     endcase -%}
-<details{{ result_details_open_attr }}>
-  <summary>{{ result_symbol }} {{result_outcome}} test details</summary>
-  <table>
-    <thead>
-      <tr>
-        <th>Test</th>
-        <th>Duration</th>
-      </tr>
-    </thead>
-    <tbody>
-{%-     comment -%}
-          find and enumerate corresponding test results from their index
-{%-     endcomment -%}
-{%-     for result_index_string in result_indices -%}
-{%-       assign result_index = result_index_string | floor -%}{%- comment -%} use `floor` to convert index from string to number {%- endcomment -%}
-{%-       assign result = set.results[result_index] -%}
-      <tr>
-        <td>
-          <span>{{ result_symbol }} <code>{{- result.test_case.display_name | escape -}}</code></span>
-          {%- if parameter_emit_result_messages -%}
-          {%-   if result.error_message != null and result.error_message != "" -%}
-          {%-     assign result_has_error_message = true -%}
-          {%-   else -%}
-          {%-     assign result_has_error_message = false -%}
-          {%-   endif -%}
-          {%-   if result.error_stack_trace != null and result.error_stack_trace != "" -%}
-          {%-     assign result_has_error_stack_trace = true -%}
-          {%-   else -%}
-          {%-     assign result_has_error_stack_trace = false -%}
-          {%-   endif -%}
-          {%-   if result.messages.size == 0 -%}
-          {%-     assign result_has_messages = false -%}
-          {%-   else -%}
-          {%-     assign result_has_messages = true -%}
-          {%-   endif -%}
-          {%-   if result_has_error_message or result_has_error_stack_trace or result_has_messages -%}
-          <dl>
-          {%-     if result_has_error_message -%}
-            <dt>Error message:</dt>
-            <dd><pre><code>{{ result.error_message | escape }}</code></pre></dd>
-          {%-     endif -%}
-          {%-     if result_has_error_stack_trace -%}
-            <dt>Stack trace:</dt>
-            <dd><pre><code>{{ result.error_stack_trace | escape }}</code></pre></dd>
-          {%-     endif -%}
-          {%-     if result_has_messages -%}
-          {%-       for message in result.messages -%}
-          {%-         if message.text != result.error_message -%}
-            <dt>Message <code>{{ message.category | escape }}</code>:</dt>
-            <dd>
-              <details{{ result_details_open_attr }}>
-                <summary>{{ message.category | escape }}</summary>
-                <pre><code>{{ message.text | escape }}</code></pre>
-              </details>
-            </dd>
-          {%-         endif -%}
-          {%-       endfor -%}
-          {%-     endif -%}
-          {%-   endif -%}
-          </dl>
-          {%- endif -%}
-        </td>
-        <td>{{ result.duration | format_duration | escape }}</td>
-      </tr>
-{%-     endfor -%}
-    </tbody>
-  </table>
-</details>
-{%-   endfor -%}
-{%- endfor -%}
-
-----
-
-[{{ library.text }}]({{ library.link }})
diff --git a/src/Smdn.MSBuild.ProjectAssets.Library/project/VSTestExtensionPoints.targets b/src/Smdn.MSBuild.ProjectAssets.Library/project/VSTestExtensionPoints.targets
deleted file mode 100644
index 79c319d..0000000
--- a/src/Smdn.MSBuild.ProjectAssets.Library/project/VSTestExtensionPoints.targets
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
-SPDX-FileCopyrightText: 2023 smdn <smdn@smdn.jp>
-SPDX-License-Identifier: MIT
--->
-<!--
-  This file defines extension points for the 'VSTest' target.
-
-  # Background
-
-  With the original 'VSTest' target, any failed test terminates the MSBuild process with error.
-  Therefore, even if 'VSTest' is specified in any 'AfterTargets', that will not be invoked.
-
-    <Target Name="TargetToBeInvokedAfterVSTest" AfterTargets="VSTest">
-      <Error Text="If there is a failed test, this target will not be invoked." />
-    </Target>
-
-  # Summary
-
-  This file overrides 'VSTest' target. The overridden 'VSTest' target invokes MSBuild for
-  current project's 'VSTest' target, with property IsVSTestTargetOverridden=false appended.
-
-  By importing this file only when IsVSTestTargetOverridden is not defined, original
-  'VSTest' target can be invoked.
-
-  In addition, this file also invokes the targets specified in properties 'VSTestBeforeTargets' and
-  'VSTestAfterTargets', before and after the 'VSTest' target.
--->
-<Project>
-  <Target Name="VSTest" Condition=" '$(IsVSTestTargetOverridden)' == '' ">
-    <CallTarget Targets="$(VSTestBeforeTargets)" />
-
-    <MSBuild
-      Projects="$(MSBuildProjectFullPath)"
-      Targets="VSTest"
-      Properties="IsVSTestTargetOverridden=false"
-      ContinueOnError="ErrorAndContinue"
-    />
-
-    <CallTarget Targets="$(VSTestAfterTargets)" />
-  </Target>
-</Project>

Notes

What's Changed

Notable changes (may include changes not directly related)

  • Extract repository to smdn/Smdn.Fundamentals.BuildAssets by @smdn in #1
  • Replace Smdn.Extensions.Mtp.LiquidTestReports with Microsoft.Testing.Extensions.GitHubActionsReport by @smdn in #2

New Contributors

  • @smdn made their first contribution in #1

Full Changelog: releases/Smdn.MSBuild.ProjectAssets.Library-1.15.1...releases/Smdn.MSBuild.ProjectAssets.Library-1.16.0