diff --git a/.github/workflows/cli-native.yml b/.github/workflows/cli-native.yml index 9809413e..50d06955 100644 --- a/.github/workflows/cli-native.yml +++ b/.github/workflows/cli-native.yml @@ -9,8 +9,7 @@ on: - "src/SharpCompress.Cli/**" - "src/SharpCompress/**" - "build/**" - - "tests/SharpCompress.Test/Cli/**" - - "tests/SharpCompress.Test/SharpCompress.Test.csproj" + - "tests/SharpCompress.Cli.Test/**" - "Directory.Build.props" - "Directory.Packages.props" - "global.json" @@ -23,8 +22,7 @@ on: - "src/SharpCompress.Cli/**" - "src/SharpCompress/**" - "build/**" - - "tests/SharpCompress.Test/Cli/**" - - "tests/SharpCompress.Test/SharpCompress.Test.csproj" + - "tests/SharpCompress.Cli.Test/**" - "Directory.Build.props" - "Directory.Packages.props" - "global.json" diff --git a/SharpCompress.sln b/SharpCompress.sln index 11688216..f7b14801 100644 --- a/SharpCompress.sln +++ b/SharpCompress.sln @@ -13,6 +13,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpCompress.Cli", "src\Sh EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpCompress.Test", "tests\SharpCompress.Test\SharpCompress.Test.csproj", "{F2B1A1EB-0FA6-40D0-8908-E13247C7226F}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpCompress.Cli.Test", "tests\SharpCompress.Cli.Test\SharpCompress.Cli.Test.csproj", "{6C8B1A17-36E1-4EF5-AB52-7D067736DC92}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "build", "build\build.csproj", "{D4D613CB-5E94-47FB-85BE-B8423D20C545}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Config", "Config", "{CDB42573-7D22-4490-BA12-1B7FB99CE7FB}" @@ -48,6 +50,10 @@ Global {F2B1A1EB-0FA6-40D0-8908-E13247C7226F}.Debug|Any CPU.Build.0 = Debug|Any CPU {F2B1A1EB-0FA6-40D0-8908-E13247C7226F}.Release|Any CPU.ActiveCfg = Release|Any CPU {F2B1A1EB-0FA6-40D0-8908-E13247C7226F}.Release|Any CPU.Build.0 = Release|Any CPU + {6C8B1A17-36E1-4EF5-AB52-7D067736DC92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C8B1A17-36E1-4EF5-AB52-7D067736DC92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C8B1A17-36E1-4EF5-AB52-7D067736DC92}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C8B1A17-36E1-4EF5-AB52-7D067736DC92}.Release|Any CPU.Build.0 = Release|Any CPU {D4D613CB-5E94-47FB-85BE-B8423D20C545}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D4D613CB-5E94-47FB-85BE-B8423D20C545}.Debug|Any CPU.Build.0 = Debug|Any CPU {D4D613CB-5E94-47FB-85BE-B8423D20C545}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -64,6 +70,7 @@ Global {FD19DDD8-72B2-4024-8665-0D1F7A2AA998} = {3C5BE746-03E5-4895-9988-0B57F162F86C} {C6A0DE31-32FB-4B65-AFE5-6FEA0C610B4F} = {3C5BE746-03E5-4895-9988-0B57F162F86C} {F2B1A1EB-0FA6-40D0-8908-E13247C7226F} = {0F0901FF-E8D9-426A-B5A2-17C7F47C1529} + {6C8B1A17-36E1-4EF5-AB52-7D067736DC92} = {0F0901FF-E8D9-426A-B5A2-17C7F47C1529} {5BDE6DBC-9E5F-4E21-AB71-F138A3E72B17} = {0F0901FF-E8D9-426A-B5A2-17C7F47C1529} EndGlobalSection EndGlobal diff --git a/build/Program.cs b/build/Program.cs index 1cf2dd2e..77f31c38 100644 --- a/build/Program.cs +++ b/build/Program.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Threading.Tasks; +using System.Xml.Linq; using GlobExpressions; using static Bullseye.Targets; using static SimpleExec.Command; @@ -96,6 +97,11 @@ Target( foreach (var file in GetFiles("**/*.Test.csproj")) { + if (!ProjectSupportsFramework(file, framework)) + { + continue; + } + Run("dotnet", $"test {file} -c Release -f {framework} --no-restore --verbosity=normal"); } } @@ -750,6 +756,33 @@ static string GetRequiredEnvironmentVariable(string variableName) return value; } +static bool ProjectSupportsFramework(string projectFile, string framework) +{ + var project = XDocument.Load(projectFile); + + var frameworkValues = project + .Descendants() + .Where(element => + element.Name.LocalName.Equals("TargetFramework", StringComparison.Ordinal) + || element.Name.LocalName.Equals("TargetFrameworks", StringComparison.Ordinal) + ) + .SelectMany(element => + (element.Value ?? string.Empty).Split( + ';', + StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries + ) + ) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToList(); + + if (frameworkValues.Count == 0) + { + return true; + } + + return frameworkValues.Contains(framework, StringComparer.OrdinalIgnoreCase); +} + record BenchmarkMetric { public string Method { get; init; } = ""; diff --git a/src/SharpCompress.Cli/SharpCompress.Cli.csproj b/src/SharpCompress.Cli/SharpCompress.Cli.csproj index 91ad6956..4935d9b3 100644 --- a/src/SharpCompress.Cli/SharpCompress.Cli.csproj +++ b/src/SharpCompress.Cli/SharpCompress.Cli.csproj @@ -3,8 +3,6 @@ net10.0 Exe enable - ../../SharpCompress.snk - true true true true @@ -14,10 +12,6 @@ - - - TargetFramework=net10.0;PublishAot=false;PublishTrimmed=false - - + diff --git a/tests/SharpCompress.Test/Cli/ArchiveInspectorTests.cs b/tests/SharpCompress.Cli.Test/ArchiveInspectorTests.cs similarity index 71% rename from tests/SharpCompress.Test/Cli/ArchiveInspectorTests.cs rename to tests/SharpCompress.Cli.Test/ArchiveInspectorTests.cs index b1856fc3..3da9c996 100644 --- a/tests/SharpCompress.Test/Cli/ArchiveInspectorTests.cs +++ b/tests/SharpCompress.Cli.Test/ArchiveInspectorTests.cs @@ -1,18 +1,20 @@ -#if NET10_0_OR_GREATER +using System; using System.IO; using SharpCompress.Cli; using SharpCompress.Cli.Inspection; using Xunit; -namespace SharpCompress.Test.Cli; +namespace SharpCompress.Cli.Test; -public class ArchiveInspectorTests : TestBase +public class ArchiveInspectorTests { + private static readonly string TestArchivesPath = FindTestArchivesPath(); + [Fact] public void Forward_Default_UsesForward_ForSimpleZipArchive() { var inspector = new ArchiveInspector(); - var archivePath = Path.Combine(TEST_ARCHIVES_PATH, "Zip.deflate.zip"); + var archivePath = Path.Combine(TestArchivesPath, "Zip.deflate.zip"); var result = inspector.InspectArchives([archivePath], new InspectionRequest()); @@ -30,7 +32,7 @@ public class ArchiveInspectorTests : TestBase public void Seekable_Mode_ForcesSeekable_ForSimpleZipArchive() { var inspector = new ArchiveInspector(); - var archivePath = Path.Combine(TEST_ARCHIVES_PATH, "Zip.deflate.zip"); + var archivePath = Path.Combine(TestArchivesPath, "Zip.deflate.zip"); var result = inspector.InspectArchives( [archivePath], @@ -49,7 +51,7 @@ public class ArchiveInspectorTests : TestBase public void Forward_Default_FallsBackToSeekable_ForSplitZipArchive() { var inspector = new ArchiveInspector(); - var archivePath = Path.Combine(TEST_ARCHIVES_PATH, "Zip.deflate.split.001"); + var archivePath = Path.Combine(TestArchivesPath, "Zip.deflate.split.001"); var result = inspector.InspectArchives([archivePath], new InspectionRequest()); @@ -66,7 +68,7 @@ public class ArchiveInspectorTests : TestBase public void Seekable_Mode_ShowsActionableError_ForForwardOnlyArchive() { var inspector = new ArchiveInspector(); - var archivePath = Path.Combine(TEST_ARCHIVES_PATH, "Ace.method1.ace"); + var archivePath = Path.Combine(TestArchivesPath, "Ace.method1.ace"); var result = inspector.InspectArchives( [archivePath], @@ -78,5 +80,21 @@ public class ArchiveInspectorTests : TestBase Assert.Equal(archivePath, error.ArchivePath); Assert.Contains("--access forward", error.Message); } + + private static string FindTestArchivesPath() + { + var directory = new DirectoryInfo(AppContext.BaseDirectory); + while (directory is not null) + { + var candidate = Path.Combine(directory.FullName, "tests", "TestArchives", "Archives"); + if (Directory.Exists(candidate)) + { + return candidate; + } + + directory = directory.Parent; + } + + throw new InvalidOperationException("Unable to locate tests/TestArchives/Archives."); + } } -#endif diff --git a/tests/SharpCompress.Cli.Test/SharpCompress.Cli.Test.csproj b/tests/SharpCompress.Cli.Test/SharpCompress.Cli.Test.csproj new file mode 100644 index 00000000..c6208d63 --- /dev/null +++ b/tests/SharpCompress.Cli.Test/SharpCompress.Cli.Test.csproj @@ -0,0 +1,17 @@ + + + net10.0 + Exe + SharpCompress.Cli.Test + SharpCompress.Cli.Test + + + + + + + + + + + diff --git a/tests/SharpCompress.Cli.Test/packages.lock.json b/tests/SharpCompress.Cli.Test/packages.lock.json new file mode 100644 index 00000000..6dcbf815 --- /dev/null +++ b/tests/SharpCompress.Cli.Test/packages.lock.json @@ -0,0 +1,238 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "AwesomeAssertions": { + "type": "Direct", + "requested": "[9.3.0, )", + "resolved": "9.3.0", + "contentHash": "8lGLYap2ec2gNLgjf2xKZaKLpQ7j36oJvrYzBVVpNAumqnxRdevqqhEF66qxE92f8y2+zsbQ061DeHG61ZhzaQ==" + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[18.0.1, )", + "resolved": "18.0.1", + "contentHash": "WNpu6vI2rA0pXY4r7NKxCN16XRWl5uHu6qjuyVLoDo6oYEggIQefrMjkRuibQHm/NslIUNCcKftvoWAN80MSAg==", + "dependencies": { + "Microsoft.CodeCoverage": "18.0.1", + "Microsoft.TestPlatform.TestHost": "18.0.1" + } + }, + "Microsoft.NETFramework.ReferenceAssemblies": { + "type": "Direct", + "requested": "[1.0.3, )", + "resolved": "1.0.3", + "contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==", + "dependencies": { + "Microsoft.NETFramework.ReferenceAssemblies.net461": "1.0.3" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[10.0.102, )", + "resolved": "10.0.102", + "contentHash": "Oxq3RCIJSdtpIU4hLqO7XaDe/Ra3HS9Wi8rJl838SAg6Zu1iQjerA0+xXWBgUFYbgknUGCLOU0T+lzMLkvY9Qg==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "10.0.102", + "Microsoft.SourceLink.Common": "10.0.102" + } + }, + "Microsoft.VisualStudio.Threading.Analyzers": { + "type": "Direct", + "requested": "[17.14.15, )", + "resolved": "17.14.15", + "contentHash": "mXQPJsbuUD2ydq4/ffd8h8tSOFCXec+2xJOVNCvXjuMOq/+5EKHq3D2m2MC2+nUaXeFMSt66VS/J4HdKBixgcw==" + }, + "xunit.runner.visualstudio": { + "type": "Direct", + "requested": "[3.1.5, )", + "resolved": "3.1.5", + "contentHash": "tKi7dSTwP4m5m9eXPM2Ime4Kn7xNf4x4zT9sdLO/G4hZVnQCRiMTWoSZqI/pYTVeI27oPPqHBKYI/DjJ9GsYgA==" + }, + "xunit.v3": { + "type": "Direct", + "requested": "[3.2.2, )", + "resolved": "3.2.2", + "contentHash": "L+4/4y0Uqcg8/d6hfnxhnwh4j9FaeULvefTwrk30rr1o4n/vdPfyUQ8k0yzH8VJx7bmFEkDdcRfbtbjEHlaYcA==", + "dependencies": { + "xunit.v3.mtp-v1": "[3.2.2]" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "10.0.102", + "contentHash": "0i81LYX31U6UiXz4NOLbvc++u+/mVDmOt+PskrM/MygpDxkv9THKQyRUmavBpLK6iBV0abNWnn+CQgSRz//Pwg==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "18.0.1", + "contentHash": "O+utSr97NAJowIQT/OVp3Lh9QgW/wALVTP4RG1m2AfFP4IyJmJz0ZBmFJUsRQiAPgq6IRC0t8AAzsiPIsaUDEA==" + }, + "Microsoft.NETFramework.ReferenceAssemblies.net461": { + "type": "Transitive", + "resolved": "1.0.3", + "contentHash": "AmOJZwCqnOCNp6PPcf9joyogScWLtwy0M1WkqfEQ0M9nYwyDD7EX9ZjscKS5iYnyvteX7kzSKFCKt9I9dXA6mA==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "10.0.102", + "contentHash": "Mk1IMb9q5tahC2NltxYXFkLBtuBvfBoCQ3pIxYQWfzbCE9o1OB9SsHe0hnNGo7lWgTA/ePbFAJLWu6nLL9K17A==" + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "1.9.1", + "contentHash": "No5AudZMmSb+uNXjlgL2y3/stHD2IT4uxqc5yHwkE+/nNux9jbKcaJMvcp9SwgP4DVD8L9/P3OUz8mmmcvEIdQ==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "1.9.1" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "1.9.1", + "contentHash": "AL46Xe1WBi85Ntd4mNPvat5ZSsZ2uejiVqoKCypr8J3wK0elA5xJ3AN4G/Q4GIwzUFnggZoH/DBjnr9J18IO/g==", + "dependencies": { + "Microsoft.Testing.Platform": "1.9.1" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "1.9.1", + "contentHash": "QafNtNSmEI0zazdebnsIkDKmFtTSpmx/5PLOjURWwozcPb3tvRxzosQSL8xwYNM1iPhhKiBksXZyRSE2COisrA==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "1.9.1", + "contentHash": "oTUtyR4X/s9ytuiNA29FGsNCCH0rNmY5Wdm14NCKLjTM1cT9edVSlA+rGS/mVmusPqcP0l/x9qOnMXg16v87RQ==", + "dependencies": { + "Microsoft.Testing.Platform": "1.9.1" + } + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "18.0.1", + "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==" + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "18.0.1", + "contentHash": "uDJKAEjFTaa2wHdWlfo6ektyoh+WD4/Eesrwb4FpBFKsLGehhACVnwwTI4qD3FrIlIEPlxdXg3SyrYRIcO+RRQ==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "18.0.1", + "Newtonsoft.Json": "13.0.3" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.27.0", + "contentHash": "y/pxIQaLvk/kxAoDkZW9GnHLCEqzwl5TW0vtX3pweyQpjizB9y3DXhb9pkw2dGeUqhLjsxvvJM1k89JowU6z3g==" + }, + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "BPciBghgEEaJN/JG00QfCYDfEfnLgQhfnYEy+j1izoeHVNYd5+3Wm8GJ6JgYysOhpBPYGE+sbf75JtrRc7jrdA==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "Hj775PEH6GTbbg0wfKRvG2hNspDCvTH9irXhH4qIWgdrOSV1sQlqPie+DOvFeigsFg2fxSM3ZAaaCDQs+KreFA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core.mtp-v1": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "Ga5aA2Ca9ktz+5k3g5ukzwfexwoqwDUpV6z7atSEUvqtd6JuybU1XopHqg1oFd78QdTfZgZE9h5sHpO4qYIi5w==", + "dependencies": { + "Microsoft.Testing.Extensions.Telemetry": "1.9.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.9.1", + "Microsoft.Testing.Platform": "1.9.1", + "Microsoft.Testing.Platform.MSBuild": "1.9.1", + "xunit.v3.extensibility.core": "[3.2.2]", + "xunit.v3.runner.inproc.console": "[3.2.2]" + } + }, + "xunit.v3.extensibility.core": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "srY8z/oMPvh/t8axtO2DwrHajhFMH7tnqKildvYrVQIfICi8fOn3yIBWkVPAcrKmHMwvXRJ/XsQM3VMR6DOYfQ==", + "dependencies": { + "xunit.v3.common": "[3.2.2]" + } + }, + "xunit.v3.mtp-v1": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "O41aAzYKBT5PWqATa1oEWVNCyEUypFQ4va6K0kz37dduV3EKzXNMaV2UnEhufzU4Cce1I33gg0oldS8tGL5I0A==", + "dependencies": { + "xunit.analyzers": "1.27.0", + "xunit.v3.assert": "[3.2.2]", + "xunit.v3.core.mtp-v1": "[3.2.2]" + } + }, + "xunit.v3.runner.common": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "/hkHkQCzGrugelOAehprm7RIWdsUFVmIVaD6jDH/8DNGCymTlKKPTbGokD5czbAfqfex47mBP0sb0zbHYwrO/g==", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0]", + "xunit.v3.common": "[3.2.2]" + } + }, + "xunit.v3.runner.inproc.console": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "ulWOdSvCk+bPXijJZ73bth9NyoOHsAs1ZOvamYbCkD4DNLX/Bd29Ve2ZNUwBbK0MqfIYWXHZViy/HKrdEC/izw==", + "dependencies": { + "xunit.v3.extensibility.core": "[3.2.2]", + "xunit.v3.runner.common": "[3.2.2]" + } + }, + "sharpcompress": { + "type": "Project" + }, + "sharpcompress.cli": { + "type": "Project", + "dependencies": { + "SharpCompress": "[0.0.0, )", + "Spectre.Console": "[0.54.0, )", + "System.CommandLine": "[2.0.3, )" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "CentralTransitive", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "vFuwSLj9QJBbNR0NeNO4YVASUbokxs+i/xbuu8B+Fs4FAZg5QaFa6eGrMaRqTzzNI5tAb97T7BhSxtLckFyiRA==" + }, + "Spectre.Console": { + "type": "CentralTransitive", + "requested": "[0.54.0, )", + "resolved": "0.54.0", + "contentHash": "StDXCFayfy0yB1xzUHT2tgEpV1/HFTiS4JgsAQS49EYTfMixSwwucaQs/bIOCwXjWwIQTMuxjUIxcB5XsJkFJA==" + }, + "System.CommandLine": { + "type": "CentralTransitive", + "requested": "[2.0.3, )", + "resolved": "2.0.3", + "contentHash": "5nY9hlrGGFEmyecNUux58sohD2Q16U6jlFBYwH57b2IVUs+u7LfMFaHwOtw2tuIi8CUl6jKXw5s4FuIt9aLtug==" + } + } + } +} \ No newline at end of file diff --git a/tests/SharpCompress.Test/SharpCompress.Test.csproj b/tests/SharpCompress.Test/SharpCompress.Test.csproj index 46f468ed..9d56d13f 100644 --- a/tests/SharpCompress.Test/SharpCompress.Test.csproj +++ b/tests/SharpCompress.Test/SharpCompress.Test.csproj @@ -19,9 +19,6 @@ - - -