diff --git a/global.json b/global.json index 863d5e3..9710807 100644 --- a/global.json +++ b/global.json @@ -5,7 +5,7 @@ "allowPrerelease": true }, "msbuild-sdks": { - "ANcpLua.NET.Sdk.Test": "3.4.44" + "ANcpLua.NET.Sdk.Test": "3.4.46" }, "test": { "runner": "Microsoft.Testing.Platform" diff --git a/src/Build/Common/Version.props b/src/Build/Common/Version.props index b61746b..ee732c6 100644 --- a/src/Build/Common/Version.props +++ b/src/Build/Common/Version.props @@ -9,7 +9,7 @@ - 10.0.301 + 10.0.400 latestMinor @@ -19,54 +19,55 @@ - 1.8.9 + 1.8.11 - 6.0.1 - 3.0.1 - 2.0.1 - 3.0.1 + 6.0.4 + 3.0.4 + 2.0.4 + 3.0.4 - 3.2.2 - 9.4.0 + 4.0.0 + 9.6.0 9.0.8 - 2.3.2 - 18.9.0 - 3.0.4 + 2.4.0 + 18.11.0 + 3.0.5 - - 2.1.1 + 2.1.2 $(DotNetSdkVersion) 4.1.5 5.6.0 - 10.8.0 - 10.0.10 - 10.0.10 + 10.9.0 + 10.0.11 + 10.0.11 - 7.6.0 - 2.3.213 + 7.9.0 + 2.3.246 - 1.13.0 - 1.13.0 - 1.13.0 - 1.13.0 - 1.13.0-preview.260703.1 - 1.13.0-preview.260703.1 - 1.13.0-preview.260703.1 - 1.13.0-preview.260703.1 - 1.13.0 + 1.20.0 + 1.20.0 + 1.20.0 + 1.20.0 + 1.20.0-preview.260831.1 + 1.20.0-preview.260831.1 + 1.20.0-preview.260831.1 + 1.20.0-preview.260831.1 + 1.20.0 diff --git a/src/Config/Analyzer.xunit.analyzers.editorconfig b/src/Config/Analyzer.xunit.analyzers.editorconfig index 75f0241..53579f4 100644 --- a/src/Config/Analyzer.xunit.analyzers.editorconfig +++ b/src/Config/Analyzer.xunit.analyzers.editorconfig @@ -273,6 +273,86 @@ dotnet_diagnostic.xUnit1052.severity = warning # Enabled: True, Severity: warning dotnet_diagnostic.xUnit1053.severity = warning +# xUnit1054: Properties used for conditional skipping must be public, static, and return bool +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1054 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1054.severity = error + +# xUnit1055: Conditional skipping cannot set both SkipUnless and SkipWhen +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1055 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1055.severity = error + +# xUnit1056: Type must have a single public non-static constructor +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1056 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1056.severity = error + +# xUnit1057: Type must be public or internal +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1057 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1057.severity = error + +# xUnit1058: Generic collection definitions are not supported in Native AOT +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1058 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1058.severity = error + +# xUnit1059: Test classes may not be decorated with ICollectionFixture<> +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1059 +# Enabled: True, Severity: warning +dotnet_diagnostic.xUnit1059.severity = warning + +# xUnit1060: Cultured test methods must have at least one culture +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1060 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1060.severity = error + +# xUnit1061: Fact methods cannot be generic +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1061 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1061.severity = error + +# xUnit1062: Theory methods cannot be generic in Native AOT +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1062 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1062.severity = error + +# xUnit1063: Test classes cannot be an open generic type +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1063 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1063.severity = error + +# xUnit1064: Theory parameter cannot use params modifier in Native AOT +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1064 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1064.severity = error + +# xUnit1065: MemberData method is ambiguous +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1065 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1065.severity = error + +# xUnit1066: MemberData parameter cannot use params modifier in Native AOT +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1066 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1066.severity = error + +# xUnit1067: There is no matching MemberData method argument +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1067 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1067.severity = error + +# xUnit1068: MemberData cannot point to an open generic type +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1068 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit1068.severity = error + +# xUnit1069: Test methods with a Timeout should reference TestContext.Current.CancellationToken +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit1069 +# Enabled: True, Severity: warning +dotnet_diagnostic.xUnit1069.severity = warning + # xUnit2000: Constants and literals should be the expected argument # Help link: https://xunit.net/xunit.analyzers/rules/xUnit2000 # Enabled: True, Severity: warning @@ -433,6 +513,11 @@ dotnet_diagnostic.xUnit2031.severity = warning # Enabled: True, Severity: suggestion dotnet_diagnostic.xUnit2032.severity = suggestion +# xUnit2033: Use the assertion return value instead of re-deriving it +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit2033 +# Enabled: True, Severity: suggestion +dotnet_diagnostic.xUnit2033.severity = suggestion + # xUnit3000: Classes which cross AppDomain boundaries must derive directly or indirectly from LongLivedMarshalByRefObject # Help link: https://xunit.net/xunit.analyzers/rules/xUnit3000 # Enabled: True, Severity: error @@ -452,3 +537,23 @@ dotnet_diagnostic.xUnit3002.severity = warning # Help link: https://xunit.net/xunit.analyzers/rules/xUnit3003 # Enabled: True, Severity: warning dotnet_diagnostic.xUnit3003.severity = warning + +# xUnit3004: The given type is missing a required interface implementation +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit3004 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit3004.severity = error + +# xUnit3005: Type must have an appropriate non-obsolete public constructor +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit3005 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit3005.severity = error + +# xUnit3006: Test case implementation must be serializable +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit3006 +# Enabled: True, Severity: error +dotnet_diagnostic.xUnit3006.severity = error + +# xUnit3007: Test case implementation might not be serializable +# Help link: https://xunit.net/xunit.analyzers/rules/xUnit3007 +# Enabled: True, Severity: warning +dotnet_diagnostic.xUnit3007.severity = warning diff --git a/tests/ANcpLua.Sdk.Tests/SdkTests.cs b/tests/ANcpLua.Sdk.Tests/SdkTests.cs index 80f9ba1..55ed734 100644 --- a/tests/ANcpLua.Sdk.Tests/SdkTests.cs +++ b/tests/ANcpLua.Sdk.Tests/SdkTests.cs @@ -258,7 +258,14 @@ public async Task Build_WhenEditorConfigFileExists_IncludedInBinlog() var files = result.GetBinLogFiles(); Assert.Contains(files, static f => f.EndsWith(".editorconfig", StringComparison.Ordinal)); - Assert.Contains(files, f => f == localFile || f == "/private" + localFile); + + // macOS resolves the /var symlink behind the temp folder, so the binlog records the + // /private-prefixed realpath. Compare as FullPath so the platform's path comparer + // decides, not an ordinal string compare (MFFP0015). + FullPath[] expected = OperatingSystem.IsMacOS() + ? [localFile, FullPath.FromPath("/private" + localFile)] + : [localFile]; + Assert.Contains(files, f => expected.Contains(FullPath.FromPath(f))); } [Fact] diff --git a/tools/ConfigFilesGenerator/Program.cs b/tools/ConfigFilesGenerator/Program.cs index 5d70948..d78eef5 100644 --- a/tools/ConfigFilesGenerator/Program.cs +++ b/tools/ConfigFilesGenerator/Program.cs @@ -458,7 +458,9 @@ async Task GenerateBanSymbolsForNewtonsoftJson() var package = await DownloadNuGetPackage("Newtonsoft.Json", null, NullLogger.Instance, CancellationToken.None) .ConfigureAwait(false); - var libItems = await package.PackageReader.GetLibItemsAsync(CancellationToken.None).ConfigureAwait(false); + var packageReader = package.PackageReader + ?? throw new InvalidOperationException("Downloaded package 'Newtonsoft.Json' has no reader."); + var libItems = await packageReader.GetLibItemsAsync(CancellationToken.None).ConfigureAwait(false); var compatibleFrameworks = libItems.Where(item => DefaultCompatibilityProvider.Instance.IsCompatible(NuGetFramework.Parse("net10.0"), item.TargetFramework)); @@ -468,7 +470,7 @@ async Task GenerateBanSymbolsForNewtonsoftJson() if (!string.Equals(Path.GetExtension(item), ".dll", StringComparison.OrdinalIgnoreCase)) continue; - await using var stream = package.PackageReader.GetStream(item); + await using var stream = packageReader.GetStream(item); var metadataRef = MetadataReference.CreateFromStream(stream); var allRefs = Net100.References.All.Add(metadataRef); @@ -657,7 +659,8 @@ static string NormalizeCondition(string condition) => using var cache = new SourceCacheContext(); var repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json"); - var resource = await repository.GetResourceAsync().ConfigureAwait(false); + var resource = await repository.GetResourceAsync().ConfigureAwait(false) + ?? throw new InvalidOperationException("nuget.org does not expose a PackageMetadataResource."); foreach (var package in GetReferencedNuGetPackages()) { @@ -735,7 +738,9 @@ static async Task ListAllPackageDependencies( foreach (var repository in sourceRepositories) { var dependencyInfoResource = - await repository.GetResourceAsync().ConfigureAwait(false); + await repository.GetResourceAsync().ConfigureAwait(false) + ?? throw new InvalidOperationException( + $"Source '{repository.PackageSource.Source}' does not expose a DependencyInfoResource."); var dependencyInfo = await dependencyInfoResource.ResolvePackage(package, framework, cache, logger, cancellationToken) .ConfigureAwait(false); @@ -862,8 +867,10 @@ static async Task GetAnalyzerReferences(string packageId, NuGetVersi var cancellationToken = CancellationToken.None; var package = await DownloadNuGetPackage(packageId, version, logger, cancellationToken).ConfigureAwait(false); + var packageReader = package.PackageReader + ?? throw new InvalidOperationException($"Downloaded package '{packageId}' has no reader."); var result = new List(); - var files = package.PackageReader.GetFiles("analyzers"); + var files = packageReader.GetFiles("analyzers"); var filesGroupedByFolder = files.GroupBy(Path.GetDirectoryName).ToArray(); foreach (var group in filesGroupedByFolder) { @@ -884,7 +891,7 @@ static async Task GetAnalyzerReferences(string packageId, NuGetVersi string.Equals(Path.GetFileName(f), assemblyFileName, StringComparison.OrdinalIgnoreCase)); if (assemblyPath != null) { - using var stream = package.PackageReader.GetStream(assemblyPath); + using var stream = packageReader.GetStream(assemblyPath); return context.LoadFromStream(stream); } } @@ -910,7 +917,7 @@ IEnumerable GetProbeFolders() try { - await using var stream = package.PackageReader.GetStream(file); + await using var stream = packageReader.GetStream(file); result.Add(context.LoadFromStream(stream)); } catch (Exception ex) @@ -1007,11 +1014,14 @@ static async Task DownloadNuGetPackage(string packageId, using var cache = new SourceCacheContext(); var repository = Repository.Factory.GetCoreV3(Source); - var resource = await repository.GetResourceAsync().ConfigureAwait(false); + var resource = await repository.GetResourceAsync().ConfigureAwait(false) + ?? throw new InvalidOperationException($"Source '{Source}' does not expose a FindPackageByIdResource."); if (version is null) { - var metadataResource = await repository.GetResourceAsync().ConfigureAwait(false); + var metadataResource = await repository.GetResourceAsync().ConfigureAwait(false) + ?? throw new InvalidOperationException( + $"Source '{Source}' does not expose a PackageMetadataResource."); var metadata = await metadataResource.GetMetadataAsync(packageId, true, false, cache, NullLogger.Instance, CancellationToken.None).ConfigureAwait(false); var latestPackage = metadata.MaxBy(static m => m.Identity.Version)