ctr_Repair/trunk/ConsoleDataMigration/sources/tests/googletest/RegionIdModifier/testRegionIdModifier.cpp
N2614 487b92c8f2 BOMを付加
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
2012-01-26 05:33:57 +00:00

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"
}
}