aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/huffman/huff.cpp59
-rw-r--r--src/huffman/huff.h2
-rwxr-xr-xtest/StormTest.cpp171
-rw-r--r--test/stormlib-test-001-linux.txt256
-rw-r--r--test/stormlib-test-001.txt8
5 files changed, 284 insertions, 212 deletions
diff --git a/src/huffman/huff.cpp b/src/huffman/huff.cpp
index 6930354..1b81017 100644
--- a/src/huffman/huff.cpp
+++ b/src/huffman/huff.cpp
@@ -269,24 +269,6 @@ TInputStream::TInputStream(void * pvInBuffer, size_t cbInBuffer)
BitCount = 0;
}
-// Gets 7 bits from the stream. DOES NOT remove the bits from input stream
-unsigned int TInputStream::Peek7Bits()
-{
- unsigned int dwReloadByte = 0;
-
- // If there is not enough bits to get the value,
- // we have to add 8 more bits from the input buffer
- if(BitCount < 7)
- {
- dwReloadByte = *pbInBuffer++;
- BitBuffer |= dwReloadByte << BitCount;
- BitCount += 8;
- }
-
- // Return the first available 7 bits. DO NOT remove them from the input stream
- return (BitBuffer & 0x7F);
-}
-
// Gets one bit from input stream
unsigned int TInputStream::Get1Bit()
{
@@ -330,6 +312,30 @@ unsigned int TInputStream::Get8Bits()
return dwOneByte;
}
+// Gets 7 bits from the stream. DOES NOT remove the bits from input stream
+bool TInputStream::Peek7Bits(unsigned int & Value)
+{
+ unsigned int Value8Bits = 0;
+
+ // If there is not enough bits to get the value,
+ // we have to add 8 more bits from the input buffer
+ if(BitCount < 7)
+ {
+ // Load additional 8 bits. Be careful if we have no more data
+ if(pbInBuffer >= pbInBufferEnd)
+ return false;
+ Value8Bits = *pbInBuffer++;
+
+ // Add these 8 bits to the bit buffer
+ BitBuffer |= Value8Bits << BitCount;
+ BitCount += 8;
+ }
+
+ // Return 7 bits of data. DO NOT remove them from the input stream
+ Value = (BitBuffer & 0x7F);
+ return true;
+}
+
void TInputStream::SkipBits(unsigned int dwBitsToSkip)
{
unsigned int dwReloadByte = 0;
@@ -696,16 +702,13 @@ unsigned int THuffmannTree::DecodeOneByte(TInputStream * is)
THTreeItem * pItem;
unsigned int ItemLinkIndex;
unsigned int BitCount = 0;
+ bool bHasItemLinkIndex;
- // Check for the end of the input stream
- if(is->pbInBuffer >= is->pbInBufferEnd && is->BitCount < 7)
- return 0x1FF;
-
- // Get the eventual quick-link index
- ItemLinkIndex = is->Peek7Bits();
+ // Try to retrieve quick link index
+ bHasItemLinkIndex = is->Peek7Bits(ItemLinkIndex);
// Is the quick-link item valid?
- if(QuickLinks[ItemLinkIndex].ValidValue > MinValidValue)
+ if(bHasItemLinkIndex && QuickLinks[ItemLinkIndex].ValidValue > MinValidValue)
{
// If that item needs less than 7 bits, we can get decompressed value directly
if(QuickLinks[ItemLinkIndex].ValidBits <= 7)
@@ -745,7 +748,7 @@ unsigned int THuffmannTree::DecodeOneByte(TInputStream * is)
// If we didn't get the item from the quick-link array,
// set the entry in it
- if(QuickLinks[ItemLinkIndex].ValidValue < MinValidValue)
+ if(bHasItemLinkIndex && QuickLinks[ItemLinkIndex].ValidValue < MinValidValue)
{
// If the current compressed byte was more than 7 bits,
// set a quick-link item with pointer to tree item
@@ -876,10 +879,10 @@ unsigned int THuffmannTree::Decompress(void * pvOutBuffer, unsigned int cbOutLen
IncWeightsAndRebalance(ItemsByByte[DecompressedValue]);
}
- // A byte successfully decoded - store it in the output stream
- *pbOutBuffer++ = (unsigned char)DecompressedValue;
+ // Store the byte to the output stream
if(pbOutBuffer >= pbOutBufferEnd)
break;
+ *pbOutBuffer++ = (unsigned char)DecompressedValue;
if(bIsCmp0)
{
diff --git a/src/huffman/huff.h b/src/huffman/huff.h
index b75acbb..cf1ca4c 100644
--- a/src/huffman/huff.h
+++ b/src/huffman/huff.h
@@ -29,8 +29,8 @@ class TInputStream
TInputStream(void * pvInBuffer, size_t cbInBuffer);
unsigned int Get1Bit();
- unsigned int Peek7Bits();
unsigned int Get8Bits();
+ bool Peek7Bits(unsigned int & Value);
void SkipBits(unsigned int BitCount);
unsigned char * pbInBufferEnd; // End position in the the input buffer
diff --git a/test/StormTest.cpp b/test/StormTest.cpp
index a65430d..76c4bfd 100755
--- a/test/StormTest.cpp
+++ b/test/StormTest.cpp
@@ -126,6 +126,7 @@ static const TCHAR PATH_SEPARATOR = '/'; // Path separator for Non-Wi
// Global for the work MPQ
static LPCTSTR szMpqSubDir = _T("1995 - Test MPQs");
+static TCHAR szDataFileDir[MAX_PATH] = {0};
static TCHAR szListFileDir[MAX_PATH] = {0};
static TCHAR szMpqPatchDir[MAX_PATH] = {0};
@@ -851,6 +852,16 @@ static DWORD FindListFileFolder(LPCTSTR szFullPath, void * /* lpContext */)
{
LPCTSTR szPlainName = GetPlainFileName(szFullPath);
+ // Check data file dir
+ if(szDataFileDir[0] == 0)
+ {
+ if(!_tcsnicmp(szPlainName, _T("addfiles-"), 9))
+ {
+ StringCopy(szDataFileDir, _countof(szDataFileDir), GetRelativePath(szFullPath));
+ return ERROR_SUCCESS;
+ }
+ }
+
// Check listfile directory
if(szListFileDir[0] == 0)
{
@@ -913,13 +924,15 @@ static DWORD InitializeMpqDirectory(TCHAR * argv[], int argc)
// Find the listfile directory within the MPQ directory
CreateFullPathName(szFullPath, _countof(szFullPath), NULL, szMpqSubDir);
FindFilesInternal(FindListFileFolder, NULL, szFullPath, NULL);
+ if(szDataFileDir[0] == 0)
+ return Logger.PrintError(_T("Data files folder was not found in the MPQ directory"));
if(szListFileDir[0] == 0)
return Logger.PrintError(_T("Listfile folder was not found in the MPQ directory"));
if(szMpqPatchDir[0] == 0)
return Logger.PrintError(_T("Patches folder was not found in the MPQ directory"));
// Verify if the work MPQ directory is writable
- CreateFullPathName(szFullPath, _countof(szFullPath), NULL, _T("TestFile.bin"));
+ CreateFullPathName(szFullPath, _countof(szFullPath), szMpqSubDir, _T("new-file.bin"));
pStream = FileStream_CreateFile(szFullPath, 0);
if(pStream == NULL)
return Logger.PrintError(_T("MPQ subdirectory doesn't exist or is not writable"));
@@ -3392,8 +3405,8 @@ static DWORD TestCreateArchive_FileFlagTest(LPCTSTR szPlainName)
DWORD dwErrCode;
// Create paths for local file to be added
- CreateFullPathName(szFileName1, _countof(szFileName1), szMpqSubDir, _T("AddFile.exe"));
- CreateFullPathName(szFileName2, _countof(szFileName2), szMpqSubDir, _T("AddFile.bin"));
+ CreateFullPathName(szFileName1, _countof(szFileName1), szDataFileDir, _T("new-file.exe"));
+ CreateFullPathName(szFileName2, _countof(szFileName2), szDataFileDir, _T("new-file.bin"));
// Create an empty file that will serve as holder for the MPQ
dwErrCode = CreateEmptyFile(&Logger, szPlainName, 0x100000, szFullPath);
@@ -3546,7 +3559,7 @@ static DWORD TestCreateArchive_WaveCompressionsTest(LPCTSTR szPlainName, LPCTSTR
DWORD dwErrCode;
// Create paths for local file to be added
- CreateFullPathName(szFileName, _countof(szFileName), szMpqSubDir, szWaveFile);
+ CreateFullPathName(szFileName, _countof(szFileName), szDataFileDir, szWaveFile);
// Create new archive
dwErrCode = CreateNewArchive(&Logger, szPlainName, MPQ_CREATE_ARCHIVE_V1 | MPQ_CREATE_LISTFILE | MPQ_CREATE_ATTRIBUTES, 0x40, &hMpq);
@@ -3737,29 +3750,31 @@ static DWORD TestCreateArchive_BigArchive(LPCTSTR szPlainName)
return dwErrCode;
}
-// "MPQ_2014_v4_Heroes_Replay.MPQ", "AddFile-replay.message.events"
-static DWORD TestModifyArchive_ReplaceFile(LPCTSTR szMpqPlainName, LPCTSTR szFilePlainName)
+// Test replacing a file in an archive
+static DWORD TestReplaceFile(LPCTSTR szMpqPlainName, LPCTSTR szFilePlainName, LPCSTR szFileFlags, DWORD dwCompression)
{
TLogHelper Logger("TestModifyMpq", szMpqPlainName);
HANDLE hMpq = NULL;
TCHAR szFileFullName[MAX_PATH];
TCHAR szMpqFullName[MAX_PATH];
char szArchivedName[MAX_PATH];
- size_t nOffset = 0;
DWORD dwErrCode;
+ DWORD dwFileFlags = (DWORD)(DWORD_PTR)(szFileFlags); // szFileFlags is a file flags cast to LPCSTR
BYTE md5_file_in_mpq1[MD5_DIGEST_SIZE];
BYTE md5_file_in_mpq2[MD5_DIGEST_SIZE];
BYTE md5_file_in_mpq3[MD5_DIGEST_SIZE];
BYTE md5_file_local[MD5_DIGEST_SIZE];
- // Get the name of archived file as plain text
- if(!_tcsnicmp(szFilePlainName, _T("AddFile-"), 8))
- nOffset = 8;
- StringCopy(szArchivedName, _countof(szArchivedName), szFilePlainName + nOffset);
+ // Get the name of archived file as plain text. If the file shall be in a subfolder,
+ // its name must contain a hashtag, e.g. "staredit#scenario.chk"
+ StringCopy(szArchivedName, _countof(szArchivedName), szFilePlainName);
+ for(size_t i = 0; szArchivedName[i] != 0; i++)
+ szArchivedName[i] = (szArchivedName[i] == '#') ? '\\' : szArchivedName[i];
// Get the full path of the archive and local file
- CreateFullPathName(szFileFullName, _countof(szFileFullName), szMpqSubDir, szFilePlainName);
+ CreateFullPathName(szFileFullName, _countof(szFileFullName), szDataFileDir, szFilePlainName);
CreateFullPathName(szMpqFullName, _countof(szMpqFullName), NULL, szMpqPlainName);
+ dwFileFlags |= MPQ_FILE_REPLACEEXISTING | MPQ_FILE_COMPRESS;
// Open an existing archive
dwErrCode = OpenExistingArchiveWithCopy(&Logger, szMpqPlainName, szMpqPlainName, &hMpq);
@@ -3783,8 +3798,8 @@ static DWORD TestModifyArchive_ReplaceFile(LPCTSTR szMpqPlainName, LPCTSTR szFil
dwErrCode = AddLocalFileToMpq(&Logger, hMpq,
szArchivedName,
szFileFullName,
- MPQ_FILE_REPLACEEXISTING | MPQ_FILE_COMPRESS | MPQ_FILE_SINGLE_UNIT,
- MPQ_COMPRESSION_ZLIB,
+ dwFileFlags,
+ dwCompression,
true);
}
@@ -3823,6 +3838,7 @@ static DWORD TestModifyArchive_ReplaceFile(LPCTSTR szMpqPlainName, LPCTSTR szFil
// For that reason, we ignore the result of SFileCompactArchive().
SFileCompactArchive(hMpq, NULL, 0);
SFileCloseArchive(hMpq);
+ hMpq = NULL;
}
// Try to open the archive again. Ignore the previous errors
@@ -3844,12 +3860,67 @@ static DWORD TestModifyArchive_ReplaceFile(LPCTSTR szMpqPlainName, LPCTSTR szFil
}
SFileCloseArchive(hMpq);
+ hMpq = NULL;
}
}
+ // Finally, close the archive
+ if(hMpq != NULL)
+ SFileCloseArchive(hMpq);
return dwErrCode;
}
+static DWORD Test_PlayingSpace()
+{
+ BYTE PlainText1[0x1000];
+ BYTE Compressed[0x1000];
+ BYTE PlainText2[0x1000];
+ int cbCompressed;
+ int cbOutBuffer;
+
+ // Prepare buffer that is hard to compress
+ memset(PlainText1, 0x01, sizeof(PlainText1));
+
+ // Compress the data
+ cbOutBuffer = sizeof(Compressed);
+ SCompCompress(Compressed, &cbOutBuffer, PlainText1, sizeof(PlainText1), MPQ_COMPRESSION_HUFFMANN | MPQ_COMPRESSION_ZLIB, 0, 0);
+ cbCompressed = cbOutBuffer;
+
+ // Decompress the data
+ cbOutBuffer = sizeof(PlainText2);
+ SCompDecompress(PlainText2, &cbOutBuffer, Compressed, cbCompressed);
+ return ERROR_SUCCESS;
+
+/*
+ // Check opening of a MPQ
+ LPCTSTR szArchiveName = _T("e:\\Volcanis.scm");
+ LPBYTE pbBuffer = NULL;
+ HANDLE hFile = NULL;
+ HANDLE hMpq = NULL;
+ DWORD dwFileSize;
+
+ if(SFileOpenArchive(szArchiveName, 0, 0, &hMpq))
+ {
+ if(SFileOpenFileEx(hMpq, "staredit\\scenario.chk", 0, &hFile))
+ {
+ if((dwFileSize = SFileGetFileSize(hFile, NULL)) != NULL)
+ {
+ if((pbBuffer = STORM_ALLOC(BYTE, dwFileSize)) != NULL)
+ {
+ DWORD dwBytesRead = 0;
+
+ SFileReadFile(hFile, pbBuffer, dwFileSize, &dwBytesRead, NULL);
+ assert(dwBytesRead == dwFileSize);
+ STORM_FREE(pbBuffer);
+ }
+ }
+ SFileCloseFile(hFile);
+ }
+ SFileCloseArchive(hMpq);
+ }
+*/
+}
+
//-----------------------------------------------------------------------------
// Tables
@@ -4062,6 +4133,7 @@ static const TEST_INFO Test_OpenMpqs[] =
{_T("MPQ_2023_v2_MemoryCorruption.SC2Replay"), NULL, "4cf5021aa272298e64712a378a50df44", 10}, // MPQ archive v 2.0, archive size is wrong
{_T("MPQ_2023_v1_StarcraftMap.scm"), NULL, "7830c51700697dd3c175f086a3157b29", 4}, // StarCraft map from StarCraft: Brood War 1.16
{_T("MPQ_2023_v1_BroodWarMap.scx"), NULL, "dd3afa3c2f5e562ce3ca91c0c605a71f", 3}, // Brood War map from StarCraft: Brood War 1.16
+ {_T("MPQ_2023_v1_Volcanis.scm"), NULL, "522c89ca96d6736427b01f7c80dd626f", 3}, // Map modified with unusual file compression: ZLIB+Huffman
// Protected archives
{_T("MPQ_2002_v1_ProtectedMap_InvalidUserData.w3x"), NULL, "b900364cc134a51ddeca21a13697c3ca", 79},
@@ -4161,11 +4233,18 @@ static const TEST_INFO Test_ReopenMpqs[] =
};
-// TODO: Include this in the CreateArchive tests
+// Tests for signature file
static const TEST_INFO Test_Signature[] =
{
- {_T("MPQ_1999_v1_WeakSigned1.mpq"), NULL, NULL, SFLAG_CREATE_ARCHIVE | SFLAG_SIGN_AT_CREATE | SFLAG_MODIFY_ARCHIVE | SFLAG_SIGN_ARCHIVE | SFLAG_VERIFY_AFTER},
- {_T("MPQ_1999_v1_WeakSigned1.mpq"), NULL, NULL, SFLAG_CREATE_ARCHIVE | SFLAG_MODIFY_ARCHIVE | SFLAG_SIGN_ARCHIVE | SFLAG_VERIFY_AFTER},
+ {_T("MPQ_1999_v1_WeakSigned1.mpq"), NULL, NULL, SFLAG_CREATE_ARCHIVE | SFLAG_SIGN_AT_CREATE | SFLAG_MODIFY_ARCHIVE | SFLAG_SIGN_ARCHIVE | SFLAG_VERIFY_AFTER},
+ {_T("MPQ_1999_v1_WeakSigned1.mpq"), NULL, NULL, SFLAG_CREATE_ARCHIVE | SFLAG_MODIFY_ARCHIVE | SFLAG_SIGN_ARCHIVE | SFLAG_VERIFY_AFTER},
+};
+
+static const TEST_INFO Test_ReplaceFile[] =
+{
+ {_T("MPQ_2014_v4_Base.StormReplay"), _T("replay.message.events"), (LPCSTR)(MPQ_FILE_SINGLE_UNIT), MPQ_COMPRESSION_ZLIB},
+ {_T("MPQ_2022_v1_v4.329.w3x"), _T("war3map.j"), (LPCSTR)(MPQ_FILE_SINGLE_UNIT), MPQ_COMPRESSION_ZLIB},
+ {_T("MPQ_2023_v1_StarcraftMap.scm"), _T("staredit#scenario.chk"), NULL, MPQ_COMPRESSION_ZLIB | MPQ_COMPRESSION_HUFFMANN},
};
//-----------------------------------------------------------------------------
@@ -4178,6 +4257,7 @@ static const TEST_INFO Test_Signature[] =
#define TEST_OPEN_MPQ
#define TEST_REOPEN_MPQ
#define TEST_VERIFY_SIGNATURE
+#define TEST_REPLACE_FILE
int _tmain(int argc, TCHAR * argv[])
{
@@ -4190,34 +4270,10 @@ int _tmain(int argc, TCHAR * argv[])
// Initialize storage and mix the random number generator
printf("==== Test Suite for StormLib version %s ====\n", STORMLIB_VERSION_STRING);
dwErrCode = InitializeMpqDirectory(argv, argc);
-/*
- // Check opening of a MPQ
- LPCTSTR szArchiveName = _T("e:\\Volcanis.scm");
- LPBYTE pbBuffer = NULL;
- HANDLE hFile = NULL;
- HANDLE hMpq = NULL;
- DWORD dwFileSize;
- if(SFileOpenArchive(szArchiveName, 0, 0, &hMpq))
- {
- if(SFileOpenFileEx(hMpq, "staredit\\scenario.chk", 0, &hFile))
- {
- if((dwFileSize = SFileGetFileSize(hFile, NULL)) != NULL)
- {
- if((pbBuffer = STORM_ALLOC(BYTE, dwFileSize)) != NULL)
- {
- DWORD dwBytesRead = 0;
+ // Placeholder function for various testing purposes
+ Test_PlayingSpace();
- SFileReadFile(hFile, pbBuffer, dwFileSize, &dwBytesRead, NULL);
- assert(dwBytesRead == dwFileSize);
- STORM_FREE(pbBuffer);
- }
- }
- SFileCloseFile(hFile);
- }
- SFileCloseArchive(hMpq);
- }
-*/
#ifdef TEST_COMMAND_LINE
// Test-open MPQs from the command line. They must be plain name
// and must be placed in the Test-MPQs folder
@@ -4301,6 +4357,22 @@ int _tmain(int argc, TCHAR * argv[])
}
#endif
+#ifdef TEST_REPLACE_FILE // Replace a file in archives
+ if(dwErrCode == ERROR_SUCCESS)
+ {
+ for(size_t i = 0; i < _countof(Test_ReplaceFile); i++)
+ {
+ // Ignore the error code here; we want to see results of all opens
+ dwErrCode = TestReplaceFile(Test_ReplaceFile[i].szName1,
+ Test_ReplaceFile[i].szName2,
+ Test_ReplaceFile[i].szDataHash,
+ Test_ReplaceFile[i].dwFlags);
+ if(dwErrCode != ERROR_SUCCESS)
+ break;
+ }
+ }
+#endif
+
// Verify SHA1 of each MPQ that we have in the list
if(dwErrCode == ERROR_SUCCESS)
dwErrCode = VerifyFileHashes(szMpqSubDir);
@@ -4355,15 +4427,15 @@ int _tmain(int argc, TCHAR * argv[])
// Create a MPQ file, add a mono-WAVE file with various compressions
if(dwErrCode == ERROR_SUCCESS)
- dwErrCode = TestCreateArchive_WaveCompressionsTest(_T("StormLibTest_AddWaveMonoTest.mpq"), _T("AddFile-Mono.wav"));
+ dwErrCode = TestCreateArchive_WaveCompressionsTest(_T("StormLibTest_AddWaveMonoTest.mpq"), _T("wave-mono.wav"));
// Create a MPQ file, add a mono-WAVE with 8 bits per sample file with various compressions
if(dwErrCode == ERROR_SUCCESS)
- dwErrCode = TestCreateArchive_WaveCompressionsTest(_T("StormLibTest_AddWaveMonoBadTest.mpq"), _T("AddFile-MonoBad.wav"));
+ dwErrCode = TestCreateArchive_WaveCompressionsTest(_T("StormLibTest_AddWaveMonoBadTest.mpq"), _T("wave-mono-bad.wav"));
// Create a MPQ file, add a stereo-WAVE file with various compressions
if(dwErrCode == ERROR_SUCCESS)
- dwErrCode = TestCreateArchive_WaveCompressionsTest(_T("StormLibTest_AddWaveStereoTest.mpq"), _T("AddFile-Stereo.wav"));
+ dwErrCode = TestCreateArchive_WaveCompressionsTest(_T("StormLibTest_AddWaveStereoTest.mpq"), _T("wave-stereo.wav"));
// Check if the listfile is always created at the end of the file table in the archive
if(dwErrCode == ERROR_SUCCESS)
@@ -4373,13 +4445,6 @@ int _tmain(int argc, TCHAR * argv[])
if(dwErrCode == ERROR_SUCCESS)
dwErrCode = TestCreateArchive_BigArchive(_T("StormLibTest_BigArchive_v4.mpq"));
- // Test replacing a file with zero size file
- if(dwErrCode == ERROR_SUCCESS)
- dwErrCode = TestModifyArchive_ReplaceFile(_T("MPQ_2014_v4_Base.StormReplay"), _T("AddFile-replay.message.events"));
-
- if(dwErrCode == ERROR_SUCCESS)
- dwErrCode = TestModifyArchive_ReplaceFile(_T("MPQ_2022_v1_v4.329.w3x"), _T("AddFile-war3map.j"));
-
#ifdef _MSC_VER
_CrtDumpMemoryLeaks();
#endif // _MSC_VER
diff --git a/test/stormlib-test-001-linux.txt b/test/stormlib-test-001-linux.txt
index 3c193ca..97ffef9 100644
--- a/test/stormlib-test-001-linux.txt
+++ b/test/stormlib-test-001-linux.txt
@@ -1,136 +1,138 @@
-==== Test Suite for StormLib version 9.24 ====
+==== Test Suite for StormLib version 9.25 ====
InitWorkFolder: Work directory /media/ladik/MPQs (default)
-TestLiFiSearch (FLAT-MAP:ListFile_Blizzard.txt) succeeded.
-TestLiFiSearch (ListFile_Blizzard.txt) succeeded.
-TestFileStream (MPQ_2013_v4_alternate-original.MPQ) succeeded.
-TestFileStream (MPQ_2013_v4_alternate-original.MPQ) succeeded.
-TestFileStream (MPQ_2013_v4_alternate-complete.MPQ) succeeded.
-TestFileStream (part-file://MPQ_2009_v2_WoW_patch.MPQ.part) succeeded.
-TestFileStream (blk4-file://streaming/model.MPQ.0) succeeded.
-TestFileStream (mpqe-file://MPQ_2011_v2_EncryptedMpq.MPQE) succeeded.
-TestFileMirror (part-file://MPQ_2009_v1_patch-created.MPQ.part) succeeded.
-TestFileMirror (part-file://MPQ_2009_v1_patch-partial.MPQ.part) succeeded.
-TestFileMirror (part-file://MPQ_2009_v1_patch-complete.MPQ.part) succeeded.
-TestFileMirror (MPQ_2013_v4_alternate-created.MPQ) succeeded.
-TestFileMirror (MPQ_2013_v4_alternate-incomplete.MPQ) succeeded.
-TestFileMirror (MPQ_2013_v4_alternate-complete.MPQ) succeeded.
-TestReadingMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
-TestReadingMpq (MPQ_1997_v1_patch_rt_SC1B.mpq) succeeded.
-TestReadingMpq (MPQ_1997_v1_StarDat_SC1B.mpq) succeeded.
-TestReadingMpq (MPQ_1997_v1_INSTALL_SC1B.EXE_) succeeded.
-TestReadingMpq: Warning: CRC32 error on (signature)
+TestLiFiSearch (FLAT-MAP:ListFile_Blizzard.txt) succeeded.
+TestLiFiSearch (ListFile_Blizzard.txt) succeeded.
+TestFileStream (MPQ_2013_v4_alternate-original.MPQ) succeeded.
+TestFileStream (MPQ_2013_v4_alternate-original.MPQ) succeeded.
+TestFileStream (MPQ_2013_v4_alternate-complete.MPQ) succeeded.
+TestFileStream (part-file://MPQ_2009_v2_WoW_patch.MPQ.part) succeeded.
+TestFileStream (blk4-file://streaming/model.MPQ.0) succeeded.
+TestFileStream (mpqe-file://MPQ_2011_v2_EncryptedMpq.MPQE) succeeded.
+TestFileMirror (part-file://MPQ_2009_v1_patch-created.MPQ.part) succeeded.
+TestFileMirror (part-file://MPQ_2009_v1_patch-partial.MPQ.part) succeeded.
+TestFileMirror (part-file://MPQ_2009_v1_patch-complete.MPQ.part) succeeded.
+TestFileMirror (MPQ_2013_v4_alternate-created.MPQ) succeeded.
+TestFileMirror (MPQ_2013_v4_alternate-incomplete.MPQ) succeeded.
+TestFileMirror (MPQ_2013_v4_alternate-complete.MPQ) succeeded.
+TestReadingMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
+TestReadingMpq (MPQ_1997_v1_patch_rt_SC1B.mpq) succeeded.
+TestReadingMpq (MPQ_1997_v1_StarDat_SC1B.mpq) succeeded.
+TestReadingMpq (MPQ_1997_v1_INSTALL_SC1B.EXE_) succeeded.
+TestReadingMpq: Warning: CRC32 error on (signature)
TestReadingMpq: Warning: CRC32 error on (signature)
TestReadingMpq (MPQ_2016_v1_D2XP_IX86_1xx_114a.mpq) succeeded.
-TestReadingMpq (MPQ_2018_v1_icon_error.w3m) succeeded.
-TestReadingMpq (MPQ_1997_v1_Diablo1_STANDARD.SNP) succeeded.
-TestReadingMpq (MPQ_2012_v2_EmptyMpq.MPQ) succeeded.
-TestReadingMpq (MPQ_2013_v4_EmptyMpq.MPQ) succeeded.
-TestReadingMpq (MPQ_2013_v4_patch-base-16357.MPQ) succeeded.
-TestReadingMpq (MPQ_2011_v4_InvalidHetEntryCount.MPQ) succeeded.
-TestReadingMpq (MPQ_2002_v1_BlockTableCut.MPQ) succeeded.
-TestReadingMpq (MPQ_2010_v2_HasUserData.s2ma) succeeded.
-TestReadingMpq: Warning: CRC32 error on (listfile)
+TestReadingMpq (MPQ_2018_v1_icon_error.w3m) succeeded.
+TestReadingMpq (MPQ_1997_v1_Diablo1_STANDARD.SNP) succeeded.
+TestReadingMpq (MPQ_2012_v2_EmptyMpq.MPQ) succeeded.
+TestReadingMpq (MPQ_2013_v4_EmptyMpq.MPQ) succeeded.
+TestReadingMpq (MPQ_2013_v4_patch-base-16357.MPQ) succeeded.
+TestReadingMpq (MPQ_2011_v4_InvalidHetEntryCount.MPQ) succeeded.
+TestReadingMpq (MPQ_2002_v1_BlockTableCut.MPQ) succeeded.
+TestReadingMpq (MPQ_2010_v2_HasUserData.s2ma) succeeded.
+TestReadingMpq: Warning: CRC32 error on (listfile)
TestReadingMpq: Warning: CRC32 error on (listfile)
TestReadingMpq: Warning: CRC32 error on File00000003.xxx
TestReadingMpq (MPQ_2014_v1_AttributesOneEntryLess.w3x) succeeded.
-TestReadingMpq (MPQ_2020_v1_AHF04patch.mix) succeeded.
-TestReadingMpq (MPQ_2010_v3_expansion-locale-frFR.MPQ) succeeded.
-TestReadingMpq (mpqe-file://MPQ_2011_v2_EncryptedMpq.MPQE) succeeded.
-TestReadingMpq (part-file://MPQ_2010_v2_HashTableCompressed.MPQ.part) succeeded.
-TestReadingMpq (blk4-file://streaming/model.MPQ.0) succeeded.
-TestReadingMpq: Warning: CRC32 error on replay.message.events
+TestReadingMpq (MPQ_2020_v1_AHF04patch.mix) succeeded.
+TestReadingMpq (MPQ_2010_v3_expansion-locale-frFR.MPQ) succeeded.
+TestReadingMpq (mpqe-file://MPQ_2011_v2_EncryptedMpq.MPQE) succeeded.
+TestReadingMpq (part-file://MPQ_2010_v2_HashTableCompressed.MPQ.part) succeeded.
+TestReadingMpq (blk4-file://streaming/model.MPQ.0) succeeded.
+TestReadingMpq: Warning: CRC32 error on replay.message.events
TestReadingMpq (MPQ_2023_v2_MemoryCorruption.SC2Replay) succeeded.
-TestReadingMpq (MPQ_2023_v1_StarcraftMap.scm) succeeded.
-TestReadingMpq (MPQ_2023_v1_BroodWarMap.scx) succeeded.
-TestReadingMpq (MPQ_2002_v1_ProtectedMap_InvalidUserData.w3x) succeeded.
-TestReadingMpq (MPQ_2002_v1_ProtectedMap_InvalidMpqFormat.w3x) succeeded.
-TestReadingMpq (MPQ_2002_v1_ProtectedMap_Spazzler.w3x) succeeded.
-TestReadingMpq (MPQ_2014_v1_ProtectedMap_Spazzler2.w3x) succeeded.
-TestReadingMpq (MPQ_2014_v1_ProtectedMap_Spazzler3.w3x) succeeded.
-TestReadingMpq (MPQ_2002_v1_ProtectedMap_BOBA.w3m) succeeded.
-TestReadingMpq (MPQ_2015_v1_ProtectedMap_KangTooJee.w3x) succeeded.
-TestReadingMpq (MPQ_2015_v1_ProtectedMap_Somj2hM16.w3x) succeeded.
-TestReadingMpq (MPQ_2015_v1_ProtectedMap_Spazy.w3x) succeeded.
-TestReadingMpq (MPQ_2015_v1_MessListFile.mpq) succeeded.
-TestReadingMpq (MPQ_2016_v1_ProtectedMap_TableSizeOverflow.w3x) succeeded.
-TestReadingMpq (MPQ_2016_v1_ProtectedMap_HashOffsIsZero.w3x) succeeded.
-TestReadingMpq (MPQ_2016_v1_ProtectedMap_Somj2.w3x) succeeded.
-TestReadingMpq (MPQ_2016_v1_WME4_4.w3x) succeeded.
-TestReadingMpq (MPQ_2016_v1_SP_(4)Adrenaline.w3x) succeeded.
-TestReadingMpq (MPQ_2016_v1_ProtectedMap_1.4.w3x) succeeded.
-TestReadingMpq (MPQ_2016_v1_KoreanFile.w3m) succeeded.
-TestReadingMpq (MPQ_2017_v1_Eden_RPG_S2_2.5J.w3x) succeeded.
-TestReadingMpq (MPQ_2017_v1_BigDummyFiles.w3x) succeeded.
-TestReadingMpq (MPQ_2017_v1_TildeInFileName.mpq) succeeded.
-TestReadingMpq (MPQ_2018_v1_EWIX_v8_7.w3x) succeeded.
-TestReadingMpq (MPQ_2020_v4_FakeMpqHeaders.SC2Mod) succeeded.
-TestReadingMpq (MPQ_2020_v4_NP_Protect_1.s2ma) succeeded.
-TestReadingMpq (MPQ_2020_v4_NP_Protect_2.s2ma) succeeded.
-TestReadingMpq (MPQ_2015_v1_flem1.w3x) succeeded.
-TestReadingMpq (MPQ_2002_v1_ProtectedMap_HashTable_FakeValid.w3x) succeeded.
-TestReadingMpq (MPQ_2021_v1_CantExtractCHK.scx) succeeded.
-TestReadingMpq (MPQ_2022_v1_Sniper.scx) succeeded.
-TestReadingMpq (MPQ_2022_v1_OcOc_Bound_2.scx) succeeded.
-TestReadingMpq (MPQ_2020_v1_HS0.1.asi) succeeded.
-TestReadingMpq (MPQ_2022_v1_hs0.8.asi) succeeded.
-TestReadingMpq (MPQ_2022_v1_MoeMoeMod.asi) succeeded.
-TestReadingMpq (MPx_2013_v1_LongwuOnline.mpk) succeeded.
-TestReadingMpq (MPx_2013_v1_WarOfTheImmortals.sqp) succeeded.
-TestReadingMpq (MPx_2022_v1_Music.mpk) succeeded.
-TestReadingMpq (MPx_2022_v1_Scp.mpk) succeeded.
-TestReadingMpq (MPx_2022_v1_UI.mpk) succeeded.
-TestReadingMpq (MPQ_1998_v1_StarCraft.mpq) succeeded.
-TestReadingMpq (MPQ_2012_v4_OldWorld.MPQ) succeeded.
-TestReadingMpq (MPQ_2013_v4_world.MPQ) succeeded.
-TestReadingMpq (MPQ_2013_v4_locale-enGB.MPQ) succeeded.
-TestReadingMpq (MPQ_2013_v4_Base1.SC2Data) succeeded.
-TestReadingMpq (MPQ_2013_v4_Mods#Core.SC2Mod#enGB.SC2Assets) succeeded.
-TestReadingMpq (MPQ_2013_v4_Base1.SC2Data) succeeded.
-TestReadingMpq (MPQ_2013_v4_Base3.SC2Maps) succeeded.
-TestReadingMpq (MPQ_2013_v4_Mods#Liberty.SC2Mod#enGB.SC2Data) succeeded.
-TestReadingMpq (MPQ_2014_v4_base-Win.MPQ) succeeded.
-TestReadingMpq (MPQ_2014_v4_base-Win.MPQ) succeeded.
-TestReadingMpq (MPQ_1997_v1_Diablo1_STANDARD.SNP) succeeded.
-TestReadingMpq (MPQ_1999_v1_WeakSignature.exe) succeeded.
-TestReadingMpq (MPQ_2003_v1_WeakSignatureEmpty.exe) succeeded.
-TestReadingMpq (MPQ_2002_v1_StrongSignature.w3m) succeeded.
-TestReadingMpq (MPQ_1998_v1_StarDat.mpq) succeeded.
-TestReadingMpq (MPQ_1999_v1_WeakSignature.exe) succeeded.
-TestReadingMpq (flat-file://streaming/model.MPQ.0) succeeded.
-TestReadingMpq (MPQ_2013_vX_Battle.net.MPQ) succeeded.
-TestReadingMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
-TestReadingMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
-TestReadingMpq (MPQ_2002_v1_StrongSignature.w3m) succeeded.
-TestReadingMpq (MPQ_2013_v4_SC2_EmptyMap.SC2Map) succeeded.
-Test_ReopenMpq (MPQ_2010_v3_expansion-locale-frFR.MPQ) succeeded.
-Test_ReopenMpq (MPQ_2016_v1_00000.pak) succeeded.
-Test_ReopenMpq (MPQ_2013_v4_SC2_EmptyMap.SC2Map) succeeded.
-Test_ReopenMpq (MPQ_2013_v4_expansion1.MPQ) succeeded.
-Test_ReopenMpq (MPQ_2014_v1_out1.w3x) succeeded.
-Test_ReopenMpq (MPQ_2014_v1_out2.w3x) succeeded.
-Test_ReopenMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
-Test_ReopenMpq (MPQ_2013_v4_SC2_EmptyMap.SC2Map) succeeded.
-Test_Signature (MPQ_1999_v1_WeakSigned1.mpq) succeeded.
-Test_Signature (MPQ_1999_v1_WeakSigned1.mpq) succeeded.
-TestVerifyHash succeeded.
-CreateEmptyMpq (StormLibTest_EmptyMpq_v2.mpq) succeeded.
-CreateEmptyMpq (StormLibTest_EmptyMpq_v4.mpq) succeeded.
-TestCreateGaps (StormLibTest_GapsTest.mpq) succeeded.
-TestNonStdNames (StormLibTest_NonStdNames.mpq) succeeded.
-CreateMpqEditor (StormLibTest_MpqEditorTest.mpq) succeeded.
-TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
-TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
-TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
-TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
-IncMaxFileCount (StormLibTest_IncMaxFileCount.mpq) succeeded.
-MpqUnicodeName succeeded.
-TestFileFlag (StormLibTest_FileFlagTest.mpq) succeeded.
-TestCompressions: Warning: CRC32 error on WaveFile_01.wav
+TestReadingMpq (MPQ_2023_v1_StarcraftMap.scm) succeeded.
+TestReadingMpq (MPQ_2023_v1_BroodWarMap.scx) succeeded.
+TestReadingMpq (MPQ_2023_v1_Volcanis.scm) succeeded.
+TestReadingMpq (MPQ_2002_v1_ProtectedMap_InvalidUserData.w3x) succeeded.
+TestReadingMpq (MPQ_2002_v1_ProtectedMap_InvalidMpqFormat.w3x) succeeded.
+TestReadingMpq (MPQ_2002_v1_ProtectedMap_Spazzler.w3x) succeeded.
+TestReadingMpq (MPQ_2014_v1_ProtectedMap_Spazzler2.w3x) succeeded.
+TestReadingMpq (MPQ_2014_v1_ProtectedMap_Spazzler3.w3x) succeeded.
+TestReadingMpq (MPQ_2002_v1_ProtectedMap_BOBA.w3m) succeeded.
+TestReadingMpq (MPQ_2015_v1_ProtectedMap_KangTooJee.w3x) succeeded.
+TestReadingMpq (MPQ_2015_v1_ProtectedMap_Somj2hM16.w3x) succeeded.
+TestReadingMpq (MPQ_2015_v1_ProtectedMap_Spazy.w3x) succeeded.
+TestReadingMpq (MPQ_2015_v1_MessListFile.mpq) succeeded.
+TestReadingMpq (MPQ_2016_v1_ProtectedMap_TableSizeOverflow.w3x) succeeded.
+TestReadingMpq (MPQ_2016_v1_ProtectedMap_HashOffsIsZero.w3x) succeeded.
+TestReadingMpq (MPQ_2016_v1_ProtectedMap_Somj2.w3x) succeeded.
+TestReadingMpq (MPQ_2016_v1_WME4_4.w3x) succeeded.
+TestReadingMpq (MPQ_2016_v1_SP_(4)Adrenaline.w3x) succeeded.
+TestReadingMpq (MPQ_2016_v1_ProtectedMap_1.4.w3x) succeeded.
+TestReadingMpq (MPQ_2016_v1_KoreanFile.w3m) succeeded.
+TestReadingMpq (MPQ_2017_v1_Eden_RPG_S2_2.5J.w3x) succeeded.
+TestReadingMpq (MPQ_2017_v1_BigDummyFiles.w3x) succeeded.
+TestReadingMpq (MPQ_2017_v1_TildeInFileName.mpq) succeeded.
+TestReadingMpq (MPQ_2018_v1_EWIX_v8_7.w3x) succeeded.
+TestReadingMpq (MPQ_2020_v4_FakeMpqHeaders.SC2Mod) succeeded.
+TestReadingMpq (MPQ_2020_v4_NP_Protect_1.s2ma) succeeded.
+TestReadingMpq (MPQ_2020_v4_NP_Protect_2.s2ma) succeeded.
+TestReadingMpq (MPQ_2015_v1_flem1.w3x) succeeded.
+TestReadingMpq (MPQ_2002_v1_ProtectedMap_HashTable_FakeValid.w3x) succeeded.
+TestReadingMpq (MPQ_2021_v1_CantExtractCHK.scx) succeeded.
+TestReadingMpq (MPQ_2022_v1_Sniper.scx) succeeded.
+TestReadingMpq (MPQ_2022_v1_OcOc_Bound_2.scx) succeeded.
+TestReadingMpq (MPQ_2020_v1_HS0.1.asi) succeeded.
+TestReadingMpq (MPQ_2022_v1_hs0.8.asi) succeeded.
+TestReadingMpq (MPQ_2022_v1_MoeMoeMod.asi) succeeded.
+TestReadingMpq (MPx_2013_v1_LongwuOnline.mpk) succeeded.
+TestReadingMpq (MPx_2013_v1_WarOfTheImmortals.sqp) succeeded.
+TestReadingMpq (MPx_2022_v1_Music.mpk) succeeded.
+TestReadingMpq (MPx_2022_v1_Scp.mpk) succeeded.
+TestReadingMpq (MPx_2022_v1_UI.mpk) succeeded.
+TestReadingMpq (MPQ_1998_v1_StarCraft.mpq) succeeded.
+TestReadingMpq (MPQ_2012_v4_OldWorld.MPQ) succeeded.
+TestReadingMpq (MPQ_2013_v4_world.MPQ) succeeded.
+TestReadingMpq (MPQ_2013_v4_locale-enGB.MPQ) succeeded.
+TestReadingMpq (MPQ_2013_v4_Base1.SC2Data) succeeded.
+TestReadingMpq (MPQ_2013_v4_Mods#Core.SC2Mod#enGB.SC2Assets) succeeded.
+TestReadingMpq (MPQ_2013_v4_Base1.SC2Data) succeeded.
+TestReadingMpq (MPQ_2013_v4_Base3.SC2Maps) succeeded.
+TestReadingMpq (MPQ_2013_v4_Mods#Liberty.SC2Mod#enGB.SC2Data) succeeded.
+TestReadingMpq (MPQ_2014_v4_base-Win.MPQ) succeeded.
+TestReadingMpq (MPQ_2014_v4_base-Win.MPQ) succeeded.
+TestReadingMpq (MPQ_1997_v1_Diablo1_STANDARD.SNP) succeeded.
+TestReadingMpq (MPQ_1999_v1_WeakSignature.exe) succeeded.
+TestReadingMpq (MPQ_2003_v1_WeakSignatureEmpty.exe) succeeded.
+TestReadingMpq (MPQ_2002_v1_StrongSignature.w3m) succeeded.
+TestReadingMpq (MPQ_1998_v1_StarDat.mpq) succeeded.
+TestReadingMpq (MPQ_1999_v1_WeakSignature.exe) succeeded.
+TestReadingMpq (flat-file://streaming/model.MPQ.0) succeeded.
+TestReadingMpq (MPQ_2013_vX_Battle.net.MPQ) succeeded.
+TestReadingMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
+TestReadingMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
+TestReadingMpq (MPQ_2002_v1_StrongSignature.w3m) succeeded.
+TestReadingMpq (MPQ_2013_v4_SC2_EmptyMap.SC2Map) succeeded.
+Test_ReopenMpq (MPQ_2010_v3_expansion-locale-frFR.MPQ) succeeded.
+Test_ReopenMpq (MPQ_2016_v1_00000.pak) succeeded.
+Test_ReopenMpq (MPQ_2013_v4_SC2_EmptyMap.SC2Map) succeeded.
+Test_ReopenMpq (MPQ_2013_v4_expansion1.MPQ) succeeded.
+Test_ReopenMpq (MPQ_2014_v1_out1.w3x) succeeded.
+Test_ReopenMpq (MPQ_2014_v1_out2.w3x) succeeded.
+Test_ReopenMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
+Test_ReopenMpq (MPQ_2013_v4_SC2_EmptyMap.SC2Map) succeeded.
+Test_Signature (MPQ_1999_v1_WeakSigned1.mpq) succeeded.
+Test_Signature (MPQ_1999_v1_WeakSigned1.mpq) succeeded.
+TestModifyMpq (MPQ_2014_v4_Base.StormReplay) succeeded.
+TestModifyMpq (MPQ_2022_v1_v4.329.w3x) succeeded.
+TestModifyMpq (MPQ_2023_v1_StarcraftMap.scm) succeeded.
+TestVerifyHash succeeded.
+CreateEmptyMpq (StormLibTest_EmptyMpq_v2.mpq) succeeded.
+CreateEmptyMpq (StormLibTest_EmptyMpq_v4.mpq) succeeded.
+TestCreateGaps (StormLibTest_GapsTest.mpq) succeeded.
+TestNonStdNames (StormLibTest_NonStdNames.mpq) succeeded.
+CreateMpqEditor (StormLibTest_MpqEditorTest.mpq) succeeded.
+TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
+TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
+TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
+TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
+IncMaxFileCount (StormLibTest_IncMaxFileCount.mpq) succeeded.
+MpqUnicodeName succeeded.
+TestFileFlag (StormLibTest_FileFlagTest.mpq) succeeded.
+TestCompressions: Warning: CRC32 error on WaveFile_01.wav
TestCompressions: Warning: CRC32 error on WaveFile_02.wav
-TestCompressions (StormLibTest_AddWaveMonoBadTest.mpq) succeeded.
-TestCompressions: Warning: CRC32 error on WaveFile_01.wav
+TestCompressions (StormLibTest_AddWaveMonoBadTest.mpq) succeeded.
+TestCompressions: Warning: CRC32 error on WaveFile_01.wav
TestCompressions: Warning: CRC32 error on WaveFile_02.wav
-ListFilePos (StormLibTest_ListFilePos.mpq) succeeded.
-TestBigArchive (StormLibTest_BigArchive_v4.mpq) succeeded.
-TestModifyMpq (MPQ_2014_v4_Base.StormReplay) succeeded.
-TestModifyMpq (MPQ_2022_v1_v4.329.w3x) succeeded. \ No newline at end of file
+ListFilePos (StormLibTest_ListFilePos.mpq) succeeded.
+TestBigArchive (StormLibTest_BigArchive_v4.mpq) succeeded. \ No newline at end of file
diff --git a/test/stormlib-test-001.txt b/test/stormlib-test-001.txt
index b8ceeac..06c218d 100644
--- a/test/stormlib-test-001.txt
+++ b/test/stormlib-test-001.txt
@@ -1,4 +1,4 @@
-==== Test Suite for StormLib version 9.24 ====
+==== Test Suite for StormLib version 9.25 ====
InitWorkFolder: Work directory \Multimedia\MPQs (default)
TestLiFiSearch (FLAT-MAP:ListFile_Blizzard.txt) succeeded.
TestLiFiSearch (ListFile_Blizzard.txt) succeeded.
@@ -42,6 +42,7 @@ TestReadingMpq: Warning: CRC32 error on replay.message.events
TestReadingMpq (MPQ_2023_v2_MemoryCorruption.SC2Replay) succeeded.
TestReadingMpq (MPQ_2023_v1_StarcraftMap.scm) succeeded.
TestReadingMpq (MPQ_2023_v1_BroodWarMap.scx) succeeded.
+TestReadingMpq (MPQ_2023_v1_Volcanis.scm) succeeded.
TestReadingMpq (MPQ_2002_v1_ProtectedMap_InvalidUserData.w3x) succeeded.
TestReadingMpq (MPQ_2002_v1_ProtectedMap_InvalidMpqFormat.w3x) succeeded.
TestReadingMpq (MPQ_2002_v1_ProtectedMap_Spazzler.w3x) succeeded.
@@ -112,6 +113,9 @@ Test_ReopenMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
Test_ReopenMpq (MPQ_2013_v4_SC2_EmptyMap.SC2Map) succeeded.
Test_Signature (MPQ_1999_v1_WeakSigned1.mpq) succeeded.
Test_Signature (MPQ_1999_v1_WeakSigned1.mpq) succeeded.
+TestModifyMpq (MPQ_2014_v4_Base.StormReplay) succeeded.
+TestModifyMpq (MPQ_2022_v1_v4.329.w3x) succeeded.
+TestModifyMpq (MPQ_2023_v1_StarcraftMap.scm) succeeded.
TestVerifyHash succeeded.
CreateEmptyMpq (StormLibTest_EmptyMpq_v2.mpq) succeeded.
CreateEmptyMpq (StormLibTest_EmptyMpq_v4.mpq) succeeded.
@@ -132,5 +136,3 @@ TestCompressions: Warning: CRC32 error on WaveFile_01.wav
TestCompressions: Warning: CRC32 error on WaveFile_02.wav
ListFilePos (StormLibTest_ListFilePos.mpq) succeeded.
TestBigArchive (StormLibTest_BigArchive_v4.mpq) succeeded.
-TestModifyMpq (MPQ_2014_v4_Base.StormReplay) succeeded.
-TestModifyMpq (MPQ_2022_v1_v4.329.w3x) succeeded.