mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@607 385bec56-5757-e545-9c3a-d8741f4650f1
437 lines
12 KiB
C++
437 lines
12 KiB
C++
#include <gtest/gtest.h>
|
|
#include <cstring>
|
|
|
|
#include "RegionIdModifier.h"
|
|
#include "testUtil.h"
|
|
|
|
namespace
|
|
{
|
|
const wchar_t dash[] =
|
|
{ 0x2014, 0x0000 };
|
|
}
|
|
|
|
class RegionIdModifierId: public RegionIdModifier
|
|
{
|
|
public:
|
|
RegionIdModifierId(u16 id);
|
|
};
|
|
|
|
RegionIdModifierId::RegionIdModifierId(u16 id) :
|
|
RegionIdModifier(id, 0, 0, NULL)
|
|
{
|
|
}
|
|
|
|
TEST(testRegionIdModifier, IsValid)
|
|
{
|
|
{
|
|
RegionIdModifierId rim(0x0000);
|
|
ASSERT_TRUE(rim.IsValid());
|
|
}
|
|
{
|
|
RegionIdModifierId rim(0xffff);
|
|
ASSERT_TRUE(rim.IsValid());
|
|
}
|
|
{
|
|
RegionIdModifierId rim(0x0102);
|
|
ASSERT_TRUE(rim.IsValid());
|
|
}
|
|
{
|
|
RegionIdModifierId rim(0x0111);
|
|
ASSERT_TRUE(rim.IsValid());
|
|
}
|
|
{
|
|
RegionIdModifierId rim(0x0201);
|
|
ASSERT_FALSE(rim.IsValid());
|
|
}
|
|
}
|
|
|
|
class RegionIdModifierDirPath: public RegionIdModifier
|
|
{
|
|
public:
|
|
RegionIdModifierDirPath(u8 nupVersion, u8 regionCode);
|
|
const wchar_t* GetPath(u8 index);
|
|
|
|
private:
|
|
PathList m_DirPath[nn::cfg::CTR::CFG_REGION_EUROPE + 1];
|
|
};
|
|
|
|
RegionIdModifierDirPath::RegionIdModifierDirPath(u8 nupVersion, u8 regionCode) :
|
|
RegionIdModifier(0, nupVersion, regionCode, NULL)
|
|
{
|
|
}
|
|
|
|
const wchar_t* RegionIdModifierDirPath::GetPath(u8 index)
|
|
{
|
|
std::memset(m_DirPath, 0, sizeof(m_DirPath));
|
|
size_t dirNum = GetDirectoryPathNum();
|
|
std::memcpy(m_DirPath, GetDirectoryPath(), sizeof(PathList) * dirNum);
|
|
return m_DirPath[index].path;
|
|
}
|
|
|
|
TEST(testRegionIdModifier, GetDirectoryPath)
|
|
{
|
|
{
|
|
RegionIdModifierDirPath rim(0, 0);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/JP/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(0, 1);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/US/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(0, 2);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/EU/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(1, 0);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/JP/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(1, 1);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/US/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(1, 2);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/EU/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(2, 0);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/JP/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/JP/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(2, 1);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/US/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/US/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(2, 2);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/EU/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/EU/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(3, 0);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/JP/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/JP/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(3, 1);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/US/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/US/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(3, 2);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/EU/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/EU/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(4, 0);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/JP/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/JP/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(4, 1);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/US/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/US/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(4, 2);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/EU/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/EU/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(5, 0);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/JP/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/JP/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(5, 1);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/US/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/US/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(5, 2);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/EU/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/EU/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(6, 0);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/JP/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/JP/");
|
|
ASSERT_STREQ(rim.GetPath(2), L"5/JP/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(6, 1);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/US/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/US/");
|
|
ASSERT_STREQ(rim.GetPath(2), L"5/US/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(6, 2);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/EU/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/EU/");
|
|
ASSERT_STREQ(rim.GetPath(2), L"5/EU/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(7, 0);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/JP/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/JP/");
|
|
ASSERT_STREQ(rim.GetPath(2), L"5/JP/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(7, 1);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/US/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/US/");
|
|
ASSERT_STREQ(rim.GetPath(2), L"5/US/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(7, 2);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/EU/");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/EU/");
|
|
ASSERT_STREQ(rim.GetPath(2), L"5/EU/");
|
|
}
|
|
{
|
|
RegionIdModifierDirPath rim(0, 3);
|
|
ASSERT_STREQ(rim.GetPath(0), L"");
|
|
}
|
|
|
|
}
|
|
|
|
class RegionIdModifierPathNum: public RegionIdModifier
|
|
{
|
|
public:
|
|
RegionIdModifierPathNum(u8 nupVersion);
|
|
};
|
|
|
|
RegionIdModifierPathNum::RegionIdModifierPathNum(u8 nupVersion) :
|
|
RegionIdModifier(0, nupVersion, 0, NULL)
|
|
{
|
|
|
|
}
|
|
|
|
TEST(testRegionIdModifier, GetDirectoryAndFilePathNum)
|
|
{
|
|
{
|
|
RegionIdModifierPathNum rim(0);
|
|
ASSERT_EQ(rim.GetFilePathNum(), 1);
|
|
ASSERT_EQ(rim.GetDirectoryPathNum(), 1);
|
|
}
|
|
{
|
|
RegionIdModifierPathNum rim(1);
|
|
ASSERT_EQ(rim.GetFilePathNum(), 1);
|
|
ASSERT_EQ(rim.GetDirectoryPathNum(), 1);
|
|
}
|
|
{
|
|
RegionIdModifierPathNum rim(2);
|
|
ASSERT_EQ(rim.GetFilePathNum(), 2);
|
|
ASSERT_EQ(rim.GetDirectoryPathNum(), 2);
|
|
}
|
|
{
|
|
RegionIdModifierPathNum rim(3);
|
|
ASSERT_EQ(rim.GetFilePathNum(), 2);
|
|
ASSERT_EQ(rim.GetDirectoryPathNum(), 2);
|
|
}
|
|
{
|
|
RegionIdModifierPathNum rim(4);
|
|
ASSERT_EQ(rim.GetFilePathNum(), 2);
|
|
ASSERT_EQ(rim.GetDirectoryPathNum(), 2);
|
|
}
|
|
{
|
|
RegionIdModifierPathNum rim(5);
|
|
ASSERT_EQ(rim.GetFilePathNum(), 3);
|
|
ASSERT_EQ(rim.GetDirectoryPathNum(), 3);
|
|
}
|
|
{
|
|
RegionIdModifierPathNum rim(6);
|
|
ASSERT_EQ(rim.GetFilePathNum(), 3);
|
|
ASSERT_EQ(rim.GetDirectoryPathNum(), 3);
|
|
}
|
|
{
|
|
RegionIdModifierPathNum rim(7);
|
|
ASSERT_EQ(rim.GetFilePathNum(), 3);
|
|
ASSERT_EQ(rim.GetDirectoryPathNum(), 3);
|
|
}
|
|
}
|
|
|
|
TEST(testRegionIdModifier, GetFileName)
|
|
{
|
|
{
|
|
RegionIdModifierId rim(0x0100);
|
|
ASSERT_STREQ(rim.GetFileName(), L"1_LZ.bin");
|
|
}
|
|
{
|
|
RegionIdModifierId rim(0x0f00);
|
|
ASSERT_STREQ(rim.GetFileName(), L"15_LZ.bin");
|
|
}
|
|
{
|
|
RegionIdModifierId rim(0xff00);
|
|
ASSERT_STREQ(rim.GetFileName(), L"255_LZ.bin");
|
|
}
|
|
{
|
|
RegionIdModifierId rim(0x6b0a);
|
|
ASSERT_STREQ(rim.GetFileName(), L"107_LZ.bin");
|
|
}
|
|
}
|
|
|
|
class RegionIdModifierFilePath: public RegionIdModifier
|
|
{
|
|
public:
|
|
RegionIdModifierFilePath(u16 id, u8 nupVersion, u8 regionCode);
|
|
const wchar_t* GetPath(u8 index);
|
|
|
|
private:
|
|
PathList m_FilePath[nn::cfg::CTR::CFG_REGION_EUROPE + 1];
|
|
};
|
|
|
|
RegionIdModifierFilePath::RegionIdModifierFilePath(u16 id, u8 nupVersion, u8 regionCode) :
|
|
RegionIdModifier(id, nupVersion, regionCode, NULL)
|
|
{
|
|
|
|
}
|
|
|
|
const wchar_t* RegionIdModifierFilePath::GetPath(u8 index)
|
|
{
|
|
std::memset(m_FilePath, 0, sizeof(m_FilePath));
|
|
size_t pathNum = GetFilePathNum();
|
|
std::memcpy(m_FilePath, GetFilePath(), sizeof(PathList) * pathNum);
|
|
return m_FilePath[index].path;
|
|
}
|
|
|
|
TEST(testRegionIdModifier, GetFilePath)
|
|
{
|
|
{
|
|
RegionIdModifierFilePath rim(0x0100, 0, 0);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/JP/1_LZ.bin");
|
|
}
|
|
{
|
|
RegionIdModifierFilePath rim(185 << 8, 5, 2);
|
|
ASSERT_STREQ(rim.GetPath(0), L"0/EU/185_LZ.bin");
|
|
ASSERT_STREQ(rim.GetPath(1), L"2/EU/185_LZ.bin");
|
|
ASSERT_STREQ(rim.GetPath(2), L"5/EU/185_LZ.bin");
|
|
}
|
|
// 範囲外
|
|
{
|
|
RegionIdModifierFilePath rim(0xff00, 6, 3);
|
|
ASSERT_STREQ(rim.GetPath(0), L"");
|
|
}
|
|
}
|
|
|
|
class RegionIdModifierGetValidRegionId: public RegionIdModifier
|
|
{
|
|
public:
|
|
RegionIdModifierGetValidRegionId(u16 id, u8 nupVersion, u8 regionCode, const wchar_t* regionName);
|
|
const wchar_t* GetPath(u8 index);
|
|
|
|
private:
|
|
PathList m_FilePath[nn::cfg::CTR::CFG_REGION_EUROPE + 1];
|
|
};
|
|
|
|
RegionIdModifierGetValidRegionId::RegionIdModifierGetValidRegionId(u16 id, u8 nupVersion, u8 regionCode,
|
|
const wchar_t* regionName) :
|
|
RegionIdModifier(id, nupVersion, regionCode, regionName)
|
|
{
|
|
}
|
|
|
|
const wchar_t* RegionIdModifierGetValidRegionId::GetPath(u8 index)
|
|
{
|
|
std::memset(m_FilePath, 0, sizeof(m_FilePath));
|
|
size_t pathNum = GetFilePathNum();
|
|
std::memcpy(m_FilePath, GetFilePath(), sizeof(PathList) * pathNum);
|
|
return m_FilePath[index].path;
|
|
}
|
|
|
|
//#define USE_HELPER_MACRO
|
|
#ifndef USE_HELPER_MACRO
|
|
void GetValidRegionIdHelper(u16 id, u8 nupVersion, u8 regionCode, const wchar_t* regionName, u8 expectedId)
|
|
{
|
|
void* buf;
|
|
size_t size;
|
|
u8 modifiedId;
|
|
size_t fileNum;
|
|
|
|
RegionIdModifierGetValidRegionId rim(id, nupVersion, regionCode, regionName);
|
|
fileNum = rim.GetFilePathNum();
|
|
for (u8 i = 0; i < fileNum; i++)
|
|
{
|
|
ReadFile(rim.GetPath(fileNum - i - 1), &buf, &size);
|
|
if (rim.GetValidRegionId(buf, size, &modifiedId))
|
|
{
|
|
if (modifiedId == expectedId)
|
|
{
|
|
ASSERT_TRUE(rim.GetValidRegionId(buf, size, &modifiedId));
|
|
ASSERT_EQ(modifiedId, expectedId);
|
|
delete[] reinterpret_cast<u8*>(buf);
|
|
return;
|
|
}
|
|
}
|
|
delete[] reinterpret_cast<u8*>(buf);
|
|
}
|
|
// ここには来ないはず
|
|
ASSERT_TRUE(false);
|
|
}
|
|
#else
|
|
#define GetValidRegionIdHelper(id, nupVersion, regionCode, regionName, expectedId) \
|
|
{\
|
|
void* buf;\
|
|
size_t size;\
|
|
u8 modifiedId;\
|
|
size_t fileNum;\
|
|
\
|
|
RegionIdModifierGetValidRegionId rim(id, nupVersion, regionCode, regionName);\
|
|
fileNum = rim.GetFilePathNum();\
|
|
for(u8 i = 0 ; i < fileNum; i++)\
|
|
{\
|
|
ReadFile(rim.GetPath(fileNum - i - 1), &buf, &size);\
|
|
if(rim.GetValidRegionId(buf, size, &modifiedId))\
|
|
{\
|
|
if(modifiedId == expectedId)\
|
|
{\
|
|
ASSERT_TRUE(rim.GetValidRegionId(buf, size, &modifiedId)); \
|
|
ASSERT_EQ(modifiedId, expectedId); \
|
|
delete[] reinterpret_cast<u8*>(buf); \
|
|
return;\
|
|
}\
|
|
}\
|
|
delete[] reinterpret_cast<u8*>(buf);\
|
|
}\
|
|
ASSERT_TRUE(false);\
|
|
\
|
|
}\
|
|
|
|
#endif
|
|
|
|
TEST(testRegionIdModifier, GetValidRegionIdLaunch)
|
|
{
|
|
u8 nupVersion;
|
|
|
|
for (u8 i = 0; i < 6; i++)
|
|
{
|
|
nupVersion = i;
|
|
#include "testdata_Launch_all_valid.txt"
|
|
#include "testdata_Launch_all_invalid.txt"
|
|
}
|
|
}
|
|
|
|
TEST(testRegionIdModifier, GetValidRegionId1stNUP)
|
|
{
|
|
u8 nupVersion;
|
|
|
|
for (u8 i = 2; i < 6; i++)
|
|
{
|
|
nupVersion = i;
|
|
#include "testdata_1stNUP_all_valid.txt"
|
|
#include "testdata_1stNUP_all_invalid.txt"
|
|
}
|
|
}
|
|
|
|
TEST(testRegionIdModifier, GetValidRegionId2ndNUP)
|
|
{
|
|
u8 nupVersion;
|
|
for (u8 i = 5; i < 6; i++)
|
|
{
|
|
nupVersion = i;
|
|
#include "testdata_2ndNUP_all_valid.txt"
|
|
#include "testdata_2ndNUP_all_invalid.txt"
|
|
}
|
|
}
|