#include #include #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(buf); return; } } delete[] reinterpret_cast(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(buf); \ return;\ }\ }\ delete[] reinterpret_cast(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" } }