XPlor/tests/360/autotest_cod6_360.cpp

176 lines
5.8 KiB
C++
Raw Normal View History

2025-04-04 20:40:12 -04:00
#include <QtTest/QtTest>
#include <QDirIterator>
#include <QFileInfo>
#include "autotest_cod.h"
#include "compression.h"
class AutoTest_COD6_360 : public AutoTest_COD {
Q_OBJECT
const QString EXPORT_DIR = "./exports/cod6/360";
private slots:
void initTestCase();
2025-04-04 20:40:12 -04:00
void testDecompression_data();
void testDecompression();
2025-04-04 20:40:12 -04:00
void testCompression_data();
void testCompression();
void testFactory_data();
void testFactory();
2025-04-04 20:40:12 -04:00
void cleanupTestCase();
};
void AutoTest_COD6_360::initTestCase() {
// Ensure the exports directory exists.
createDirectory(EXPORT_DIR);
}
void AutoTest_COD6_360::testDecompression_data() {
AutoTest_COD::testDecompression_data();
2025-04-04 20:40:12 -04:00
}
void AutoTest_COD6_360::testDecompression() {
QFETCH(QString, fastFilePath);
2025-04-04 20:40:12 -04:00
const QString testName = "Decompress: " + fastFilePath;
2025-04-23 00:09:35 -04:00
2025-04-04 20:40:12 -04:00
// Open the original .ff file.
QFile testFastFile(fastFilePath);
2025-04-04 20:40:12 -04:00
QVERIFY2(testFastFile.open(QIODevice::ReadOnly),
qPrintable("Failed to open test fastfile: " + fastFilePath));
2025-04-04 20:40:12 -04:00
const QByteArray testFFData = testFastFile.readAll();
testFastFile.close();
2025-04-23 00:09:35 -04:00
const QString magic = testFFData.mid(0, 12);
QVERIFY2(magic.contains("IWffu100"),
qPrintable("Encountered signed fastfile: " + magic));
QByteArray pattern;
pattern.append(static_cast<unsigned char>(0x78));
pattern.append(static_cast<unsigned char>(0xDA));
pattern.append(static_cast<unsigned char>(0xEC));
int index = testFFData.indexOf(pattern);
2025-06-04 22:33:19 -04:00
qDebug() << "Zlib Index: " << index;
2025-04-23 00:09:35 -04:00
QByteArray compressedData = testFFData.mid(index);
QByteArray testZoneData = Compression::DecompressZLIB(compressedData);
//while (index != -1 && testZoneData.isEmpty()) {
// compressedData = testFFData.mid(index);
// testZoneData = Compression::DecompressZLIB(compressedData);
// index = testFFData.indexOf(pattern, index + 2);
//}
QVERIFY2(!testZoneData.isEmpty(),
qPrintable("Zlib decompression failed!"));
2025-04-04 20:40:12 -04:00
// Verify the decompressed data via its embedded zone size.
QDataStream zoneStream(testZoneData);
2025-04-23 00:09:35 -04:00
zoneStream.setByteOrder(QDataStream::BigEndian);
2025-04-04 20:40:12 -04:00
quint32 zoneSize;
zoneStream >> zoneSize;
2025-04-23 00:09:35 -04:00
if (abs(zoneSize - testZoneData.size()) != 32) {
qDebug() << "Zone Size: " << zoneSize;
qDebug() << "Test zone Size: " << testZoneData.size();
qDebug() << "Difference: " << abs(zoneSize - testZoneData.size());
}
QVERIFY2(zoneSize + 32 == testZoneData.size(),
qPrintable("Decompression validation failed for: " + fastFilePath));
2025-04-04 20:40:12 -04:00
// Write the decompressed zone data to the exports folder with a .zone extension.
QFileInfo fi(fastFilePath);
2025-04-04 20:40:12 -04:00
QString outputFileName = fi.completeBaseName() + ".zone";
QString outputFilePath = QDir(EXPORT_DIR).filePath(outputFileName);
QFile outputFile(outputFilePath);
QVERIFY2(outputFile.open(QIODevice::WriteOnly),
qPrintable("Failed to open output file for writing: " + outputFilePath));
outputFile.write(testZoneData);
outputFile.close();
}
void AutoTest_COD6_360::testCompression_data() {
AutoTest_COD::testCompression_data();
2025-04-04 20:40:12 -04:00
}
void AutoTest_COD6_360::testCompression() {
QFETCH(QString, zoneFilePath);
2025-04-04 20:40:12 -04:00
QFile zoneFile(zoneFilePath);
QVERIFY2(zoneFile.open(QIODevice::ReadOnly), qPrintable("Failed to open zone file: " + zoneFilePath));
2025-04-04 20:40:12 -04:00
QByteArray decompressedData = zoneFile.readAll();
zoneFile.close();
QFileInfo fi(zoneFilePath);
2025-04-04 20:40:12 -04:00
QString originalFFPath = QDir(getFastFileDirectory()).filePath(fi.completeBaseName() + ".ff");
QFile originalFile(originalFFPath);
QVERIFY2(originalFile.open(QIODevice::ReadOnly), qPrintable("Failed to open original .ff file: " + originalFFPath));
QByteArray originalFFData = originalFile.readAll();
originalFile.close();
2025-04-23 00:09:35 -04:00
QByteArray pattern;
pattern.append(static_cast<unsigned char>(0x78));
pattern.append(static_cast<unsigned char>(0xDA));
pattern.append(static_cast<unsigned char>(0xEC));
int zlibOffset = originalFFData.indexOf(pattern);
QByteArray header = originalFFData.mid(0, zlibOffset);
2025-04-04 20:40:12 -04:00
QByteArray newCompressedData;// = Compressor::CompressZLIB(decompressedData, Z_BEST_COMPRESSION);
newCompressedData = Compression::CompressZLIBWithSettings(decompressedData, Z_BEST_COMPRESSION, MAX_WBITS, 8, Z_DEFAULT_STRATEGY, {});
QByteArray recompressedData = header + newCompressedData;
QString recompressedFilePath = QDir(EXPORT_DIR).filePath(fi.completeBaseName() + ".ff");
QFile recompressedFile(recompressedFilePath);
QVERIFY2(recompressedFile.open(QIODevice::WriteOnly), qPrintable("Failed to write recompressed file."));
recompressedFile.write(recompressedData);
recompressedFile.close();
QCOMPARE(recompressedData, originalFFData);
}
void AutoTest_COD6_360::testFactory_data() {
AutoTest_COD::testFactory_data();
}
void AutoTest_COD6_360::testFactory() {
QFETCH(QString, fastFilePath);
const QString testName = "Factory ingest: " + fastFilePath;
2025-09-05 18:35:17 -04:00
FastFile* fastFile = FastFileFactory::Create(fastFilePath);
const QString game = fastFile->GetGame();
bool correctGame = game == "COD6";
if (!correctGame) {
recordResult(testName, false);
}
QVERIFY2(correctGame
, qPrintable("Factory parsed wrong game [" + game + "] for fastfile: " + fastFilePath));
const QString platform = fastFile->GetPlatform();
bool correctPlatform = platform == "360";
if (!correctPlatform) {
recordResult(testName, false);
}
QVERIFY2(correctPlatform
, qPrintable("Factory parsed wrong platform [" + platform + "] for fastfile: " + fastFilePath));
recordResult(testName, true);
}
2025-04-04 20:40:12 -04:00
void AutoTest_COD6_360::cleanupTestCase() {
// Any cleanup if necessary.
}
// Don't generate a main() function
#include "autotest_cod6_360.moc"