Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
215 changes: 215 additions & 0 deletions src/test/cpp/tests1/test-csharedata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,13 @@
#include "env/DLLSHAREDATA.h"
#include "uiparts/CMenuDrawer.h"
#include "util/window.h"
#include "util/file.h"
#include "version.h"
#include "sakura_rc.h"

using namespace std::string_literals;
using namespace std::string_view_literals;

using SFuncCodeArray = std::array<EFunctionCode, 8>;

struct KEYDATAINIT {
Expand Down Expand Up @@ -1787,4 +1791,215 @@ TEST_F(CShareDataTest, ChangeLang001)
CSelectLang::ChangeLang(L"");
}

/*!
* @brief マクロファイル名取得のテスト
*
* インデックス-1はキーマクロのファイル名を返す。
*/
TEST_F(CShareDataTest, GetMacroFilename001)
{
const auto keyMacoroPath = GetExeFileName().replace_filename(L"RecKey.mac"s);
std::wstring buffer(_MAX_PATH, L'\0');

// バッファにnullを指定した場合、格納すべき文字数を符号反転して返す
EXPECT_THAT(pcShareData->GetMacroFilename(-1, nullptr, 0), Eq(-std::ssize(keyMacoroPath.native())));

// 適切なバッファを指定した場合、キーマクロの文字数を返す
EXPECT_THAT(pcShareData->GetMacroFilename(-1, std::data(buffer), int(std::size(buffer))), Eq(std::ssize(keyMacoroPath.native())));
EXPECT_THAT(buffer, StartsWith(keyMacoroPath.native()));

// バッファサイズが足りない場合、格納すべき文字数を符号反転して返す
EXPECT_THAT(pcShareData->GetMacroFilename(-1, std::data(buffer), int(std::size(keyMacoroPath.native()))), Eq(-std::ssize(keyMacoroPath.native())));
}

/*!
* @brief マクロファイル名取得のテスト
*
* 指定されたインデックスのファイル名が未設定だった場合、0を返す
*/
TEST_F(CShareDataTest, GetMacroFilename002)
{
auto& shareData = ::GetDllShareData();
auto& sMacro = shareData.m_Common.m_sMacro;

sMacro.m_MacroTable[2].m_szFile[0] = L'\0';
EXPECT_THAT(pcShareData->GetMacroFilename(2, nullptr, 0), Eq(0));
}

/*!
* @brief マクロファイル名取得のテスト
*
* 指定されたインデックスのファイル名がフルパスだった場合のテスト
*/
TEST_F(CShareDataTest, GetMacroFilename003)
{
auto& shareData = GetDllShareData();
std::wstring buffer(_MAX_PATH, L'\0');

// テストのために共有データを弄る
auto& sMacro = shareData.m_Common.m_sMacro;
const auto testFilePath = GetIniFileName().replace_filename(L"test.mac"s);
::wcscpy_s(sMacro.m_MacroTable[3].m_szFile, testFilePath.c_str());

EXPECT_THAT(pcShareData->GetMacroFilename(3, nullptr, 0), Eq(-std::ssize(testFilePath.native())));

EXPECT_THAT(pcShareData->GetMacroFilename(3, std::data(buffer), int(std::size(buffer))), Eq(std::ssize(testFilePath.native())));
EXPECT_THAT(buffer, StartsWith(testFilePath.native()));

EXPECT_THAT(pcShareData->GetMacroFilename(3, std::data(buffer), int(std::size(testFilePath.native()))), Eq(-std::ssize(testFilePath.native())));

// 共有データを元に戻す
::wcscpy_s(sMacro.m_MacroTable[1].m_szFile, L"");
}

/*!
* @brief マクロファイル名取得のテスト
*
* 指定されたインデックスのファイル名が相対パスだった場合のテスト
*/
TEST_F(CShareDataTest, GetMacroFilename004)
{
auto& shareData = GetDllShareData();
std::wstring buffer(_MAX_PATH, L'\0');

// テストのために共有データを弄る
auto& sMacro = shareData.m_Common.m_sMacro;
const std::wstring macroFolder{ sMacro.m_szMACROFOLDER };
::wcscpy_s(sMacro.m_szMACROFOLDER, L".");
const auto testFilePath = GetIniFileName().remove_filename() / L"." / L"test.mac";
::wcscpy_s(sMacro.m_MacroTable[4].m_szFile, L"test.mac");

EXPECT_THAT(pcShareData->GetMacroFilename(4, nullptr, 0), Eq(-std::ssize(testFilePath.native())));

EXPECT_THAT(pcShareData->GetMacroFilename(4, std::data(buffer), int(std::size(buffer))), Eq(std::ssize(testFilePath.native())));
EXPECT_THAT(buffer, StartsWith(testFilePath.native()));

EXPECT_THAT(pcShareData->GetMacroFilename(4, std::data(buffer), int(std::size(testFilePath.native()))), Eq(-std::ssize(testFilePath.native())));

// 共有データを元に戻す
::wcscpy_s(sMacro.m_MacroTable[4].m_szFile, L"");
::wcscpy_s(sMacro.m_szMACROFOLDER, macroFolder.c_str());
}

/*!
* @brief マクロファイル名取得のテスト
*
* 指定されたインデックスのファイル名が相対パス、かつ、マクロフォルダーが '\' で終わらない限界長のフルパス だった場合のテスト
*/
TEST_F(CShareDataTest, GetMacroFilename005)
{
auto& shareData = GetDllShareData();
std::wstring buffer(_MAX_PATH * 2, L'\0');

// テストのために共有データを弄る
auto& sMacro = shareData.m_Common.m_sMacro;
const std::wstring macroFolder{ sMacro.m_szMACROFOLDER };
const std::filesystem::path tooLongPath{ std::format(LR"(C:\{:a<256})", L'a') }; // 259文字のパスを作る(MAX_PATHに収まる限界長。)
::wcsncpy_s(sMacro.m_szMACROFOLDER, tooLongPath.c_str(), _TRUNCATE);
const auto testFilePath = tooLongPath / L"test.mac";
::wcscpy_s(sMacro.m_MacroTable[5].m_szFile, L"test.mac");

EXPECT_THAT(pcShareData->GetMacroFilename(5, nullptr, 0), Eq(-std::ssize(testFilePath.native())));

EXPECT_THAT(pcShareData->GetMacroFilename(5, std::data(buffer), int(std::size(buffer))), Eq(std::ssize(testFilePath.native())));
EXPECT_THAT(buffer, StartsWith(testFilePath.native()));

EXPECT_THAT(pcShareData->GetMacroFilename(5, std::data(buffer), int(std::size(testFilePath.native()))), Eq(-std::ssize(testFilePath.native())));

// 共有データを元に戻す
::wcscpy_s(sMacro.m_MacroTable[5].m_szFile, L"");
::wmemset(sMacro.m_szMACROFOLDER, 0, std::size(sMacro.m_szMACROFOLDER));
::wcscpy_s(sMacro.m_szMACROFOLDER, macroFolder.c_str());
}

TEST_F(CShareDataTest, GetMacroFilename101)
{
EXPECT_THAT(pcShareData->GetMacroFilename(-2, nullptr, 0), Eq(0)); // 👈バグです。インデックスに下限を下回る値を指定したときに、範囲外アクセスしています。
}

TEST_F(CShareDataTest, GetMacroFilename102)
{
auto& shareData = GetDllShareData();
std::wstring buffer(_MAX_PATH, L'\0');

// テストのために共有データを弄る
auto& sMacro = shareData.m_Common.m_sMacro;
const std::wstring macroFolder{ sMacro.m_szMACROFOLDER };
sMacro.m_szMACROFOLDER[0] = L'\0';

EXPECT_THAT(pcShareData->GetMacroFilename(MAX_CUSTMACRO, nullptr, 0), Eq(0)); // 👈バグです。インデックスに上限を上回る値を指定したときに、範囲外アクセスしています。

// 共有データを元に戻す
::wcscpy_s(sMacro.m_szMACROFOLDER, macroFolder.c_str());
}

/*!
* @brief マクロの再読み込み設定取得のテスト
*
* 指定されたインデックスのファイル名が未設定だった場合、falseを返す
*/
TEST_F(CShareDataTest, BeReloadWhenExecuteMacro001)
{
auto& shareData = GetDllShareData();

// テストのために共有データを弄る
auto& sMacro = shareData.m_Common.m_sMacro;
sMacro.m_MacroTable[1].m_szFile[0] = L'\0';

EXPECT_THAT(pcShareData->BeReloadWhenExecuteMacro(1), IsFalse());
}

/*!
* @brief マクロの再読み込み設定取得のテスト
*
* 指定されたインデックスの再読み込みが有効だった場合、trueを返す
*/
TEST_F(CShareDataTest, BeReloadWhenExecuteMacro002)
{
auto& shareData = GetDllShareData();

// テストのために共有データを弄る
auto& sMacro = shareData.m_Common.m_sMacro;
const auto testFilePath = GetExeFileName().replace_filename(L"test.mac"s);
::wcscpy_s(sMacro.m_MacroTable[2].m_szFile, testFilePath.c_str());
sMacro.m_MacroTable[2].m_bReloadWhenExecute = true;

EXPECT_THAT(pcShareData->BeReloadWhenExecuteMacro(2), IsTrue());

// 共有データを元に戻す
::wcscpy_s(sMacro.m_MacroTable[2].m_szFile, L"");
sMacro.m_MacroTable[2].m_bReloadWhenExecute = false;
}

/*!
* @brief マクロの再読み込み設定取得のテスト
*
* 指定されたインデックスの再読み込みが無効だった場合、falseを返す
*/
TEST_F(CShareDataTest, BeReloadWhenExecuteMacro003)
{
auto& shareData = GetDllShareData();

// テストのために共有データを弄る
auto& sMacro = shareData.m_Common.m_sMacro;
const auto testFilePath = GetExeFileName().replace_filename(L"test.mac"s);
::wcscpy_s(sMacro.m_MacroTable[3].m_szFile, testFilePath.c_str());
sMacro.m_MacroTable[3].m_bReloadWhenExecute = false;

EXPECT_THAT(pcShareData->BeReloadWhenExecuteMacro(3), IsFalse());

// 共有データを元に戻す
::wcscpy_s(sMacro.m_MacroTable[3].m_szFile, L"");
}

TEST_F(CShareDataTest, BeReloadWhenExecuteMacro101)
{
EXPECT_THAT(pcShareData->BeReloadWhenExecuteMacro(-1), IsFalse()); // 👈バグです。インデックスに下限を下回る値を指定したときに、範囲外アクセスしています。
}

TEST_F(CShareDataTest, BeReloadWhenExecuteMacro102)
{
EXPECT_THAT(pcShareData->BeReloadWhenExecuteMacro(MAX_CUSTMACRO), IsFalse()); // 👈バグです。インデックスに上限を上回る値を指定したときに、範囲外アクセスしています。
}

} // namespace env
1 change: 1 addition & 0 deletions src/test/resources/pch.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ using ::testing::Lt;
using ::testing::Ne;
using ::testing::NotNull;
using ::testing::Return;
using ::testing::StartsWith;
using ::testing::StrCaseEq;
using ::testing::StrCaseNe;
using ::testing::StrEq;
Expand Down
Loading