From cf7daff040e71b37fe5fb19479ecaea88ef5fcc3 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 23 Jul 2025 15:08:49 -0400 Subject: [PATCH] Add disabled Quantum test --- README.MD | 2 +- SabreTools.IO.Test/Compression/MSZIPTests.cs | 1 - .../Compression/QuantumTests.cs | 29 ++++++++++++++++++ SabreTools.IO.Test/TestData/test-archive.qtm | Bin 0 -> 20350 bytes 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 SabreTools.IO.Test/Compression/QuantumTests.cs create mode 100644 SabreTools.IO.Test/TestData/test-archive.qtm diff --git a/README.MD b/README.MD index ff5d068..c2662b7 100644 --- a/README.MD +++ b/README.MD @@ -28,7 +28,7 @@ Various compression implementations that are used across multiple projects. Most | LZ | Yes | No | KWAJ, QBasic 4.5, and SZDD variants; KWAJ incomplete | | LZX | No | No | | | MSZIP | Yes | No | | -| Quantum | Yes* | No | Partial implementation based on standalone archives | +| Quantum | Yes* | No | Partial implementation based on standalone archives; not working | **Note:** If something is marked with a `*` it means that it need testing. diff --git a/SabreTools.IO.Test/Compression/MSZIPTests.cs b/SabreTools.IO.Test/Compression/MSZIPTests.cs index 9357744..064e4d0 100644 --- a/SabreTools.IO.Test/Compression/MSZIPTests.cs +++ b/SabreTools.IO.Test/Compression/MSZIPTests.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using System.Text; using SabreTools.IO.Compression.MSZIP; using SabreTools.IO.Extensions; using Xunit; diff --git a/SabreTools.IO.Test/Compression/QuantumTests.cs b/SabreTools.IO.Test/Compression/QuantumTests.cs new file mode 100644 index 0000000..33afc00 --- /dev/null +++ b/SabreTools.IO.Test/Compression/QuantumTests.cs @@ -0,0 +1,29 @@ +using System; +using System.IO; +using SabreTools.IO.Compression.Quantum; +using Xunit; + +namespace SabreTools.IO.Test.Compression +{ + public class QuantumTests + { + // This test is disabled for the forseeable future. The current Quantum + // processing code only handles standalone Quantum archives in theory. + // There is additional work that needs to be done to support MS-CAB padding + // before this test will pass properly. + + //[Fact] + public void DecompressorTest() + { + // Testing Note: This is a fake file that has been taken + // from the CFDATA block of a cabinet file. + string path = Path.Combine(Environment.CurrentDirectory, "TestData", "test-archive.qtm"); + byte[] inputBytes = File.ReadAllBytes(path); + + var decompressor = Decompressor.Create(inputBytes, 19); + byte[] output = decompressor.Process(); + + Assert.Equal(38470, output.Length); + } + } +} \ No newline at end of file diff --git a/SabreTools.IO.Test/TestData/test-archive.qtm b/SabreTools.IO.Test/TestData/test-archive.qtm new file mode 100644 index 0000000000000000000000000000000000000000..474d2116ae59291903b54af53edf59834d67d2a7 GIT binary patch literal 20350 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