diff --git a/sakura_core/_main/CNormalProcess.cpp b/sakura_core/_main/CNormalProcess.cpp index e209ff66fc..38a38f60e9 100644 --- a/sakura_core/_main/CNormalProcess.cpp +++ b/sakura_core/_main/CNormalProcess.cpp @@ -132,14 +132,16 @@ bool CNormalProcess::InitializeProcess( // スコープを抜けるときシグナル状態になるようにする EventHolder grepEvent; - /* 共有メモリを初期化する */ + // コントロールプロセスが起動している状態にする if (!CProcessFactory::IsExistControlProcess() && - !CProcessFactory::StartControlProcess() || - !CProcess::InitializeProcess(nCmdShow)) + !CProcessFactory::StartControlProcess()) { return false; } + // 共有メモリを初期化する + GetShareData().OpenShareData(); + /* ダークモード設定を反映する */ ApplyDarkModeSetting(GetDllShareData().m_Common.m_sWindow.m_bDarkMode); @@ -209,6 +211,9 @@ bool CNormalProcess::InitializeProcess( if( GetDllShareData().m_Common.m_sTabBar.m_bNewWindow && nGroupId == -1 ){ nGroupId = CAppNodeManager::getInstance()->GetFreeGroupId(); } + + (void)nCmdShow; //TODO: CEditWndのCreate()に渡すようにする + // CEditAppを作成 m_pcEditApp = CEditApp::getInstance(); m_pcEditApp->Create(GetProcessInstance(), nGroupId); diff --git a/sakura_core/_main/CProcess.cpp b/sakura_core/_main/CProcess.cpp index 06b00fcd56..4d727f5bcf 100644 --- a/sakura_core/_main/CProcess.cpp +++ b/sakura_core/_main/CProcess.cpp @@ -188,24 +188,6 @@ std::filesystem::path CProcess::GetIniFileName() const return GetExeFileName().replace_extension(L".ini"); } -/*! - @brief プロセスを初期化する - - 共有メモリを初期化する -*/ -bool CProcess::InitializeProcess( - int nCmdShow [[maybe_unused]] -) -{ - GetShareData().InitShareData(); - - /* リソースから製品バージョンの取得 */ - // 2004.05.13 Moca 共有データのバージョン情報はコントロールプロセスだけが - // ShareDataで設定するように変更したのでここからは削除 - - return true; -} - /*! * @brief プロセス実行 * diff --git a/sakura_core/_main/CProcess.h b/sakura_core/_main/CProcess.h index f281b0e098..c6276bd0b8 100644 --- a/sakura_core/_main/CProcess.h +++ b/sakura_core/_main/CProcess.h @@ -157,7 +157,7 @@ class CProcess : public TSingleInstance { virtual bool InitializeProcess( int nCmdShow [[maybe_unused]] - ); + ) = 0; protected: virtual bool MainLoop() = 0; diff --git a/sakura_core/env/CShareData.cpp b/sakura_core/env/CShareData.cpp index a6c5d4a501..73069a5172 100644 --- a/sakura_core/env/CShareData.cpp +++ b/sakura_core/env/CShareData.cpp @@ -86,20 +86,19 @@ CMutex& CShareData::GetMutexShareWork(){ return g_cMutexShareWork; } -//! CShareDataクラスの初期化処理 /*! - CShareDataクラスを利用する前に必ず呼び出すこと。 - - @retval true 初期化成功 - @retval false 初期化失敗 - - @note 既に存在する共有メモリのバージョンがこのエディタが使うものと - 異なる場合は致命的エラーを防ぐためにfalseを返します。CProcess::Initialize() - でInit()に失敗するとメッセージを出してエディタの起動を中止します。 - - @date 2018/06/01 仕様変更 https://github.com/sakura-editor/sakura/issues/29 -*/ -bool CShareData::InitShareData() + * @brief CShareDataクラスの初期化処理 + * + * 共有メモリを新規作成して初期化する。 + * 他プロセスが作成した共有メモリが残っていても上書きする。 + * + * コントロールプロセス専用。 + * + * @note ここで初期化した共有メモリは、後続のINI設定ファイルの読み込み処理で上書きされる。 + * + * @date 2018/06/01 仕様変更 https://github.com/sakura-editor/sakura/issues/29 + */ +void CShareData::InitShareData() { MY_RUNNINGTIMER(cRunningTimer,L"CShareData::InitShareData" ); @@ -129,14 +128,12 @@ bool CShareData::InitShareData() ); } - if( GetLastError() != ERROR_ALREADY_EXISTS ){ - /* オブジェクトが存在していなかった場合 */ + // ファイルのビューを、 呼び出し側プロセスのアドレス空間にマップします + m_MappedData = m_FileMapping.MapViewOfFile( + FILE_MAP_ALL_ACCESS + ); - // ファイルのビューを、 呼び出し側プロセスのアドレス空間にマップします - m_MappedData = m_FileMapping.MapViewOfFile( - FILE_MAP_ALL_ACCESS - ); - + { // マップされたビューにDLLSHAREDATA構造体を配置します m_pShareData = new (m_MappedData.get()) DLLSHAREDATA; @@ -666,14 +663,14 @@ bool CShareData::InitShareData() /* 2006.08.16 Moca 初期化単位を PRINTSETTINGに変更。CShareDataには依存しない。 */ - WCHAR szSettingName[64]; - int i = 0; - auto_sprintf( szSettingName, L"印刷設定 %d", i + 1 ); + using SPrintSettingName = StaticString<64>; + SPrintSettingName szSettingName{}; + szSettingName = strprintf(L"%s %d", LS(STR_PRINT_SET_NAME), 1); CPrint::SettingInitialize( m_pShareData->m_PrintSettingArr[0], szSettingName ); // 初期化命令。 } for( int i = 1; i < MAX_PRINTSETTINGARR; ++i ){ m_pShareData->m_PrintSettingArr[i] = m_pShareData->m_PrintSettingArr[0]; - auto_sprintf( m_pShareData->m_PrintSettingArr[i].m_szPrintSettingName, L"印刷設定 %d", i + 1 ); /* 印刷設定の名前 */ + auto_sprintf_s( m_pShareData->m_PrintSettingArr[i].m_szPrintSettingName, L"%s %d", LS(STR_PRINT_SET_NAME), i + 1 ); /* 印刷設定の名前 */ } } @@ -710,13 +707,46 @@ bool CShareData::InitShareData() m_pShareData->m_bLineNumIsCRLF_ForJump = true; /* 指定行へジャンプの「改行単位の行番号」か「折り返し単位の行番号」か */ } - }else{ - /* オブジェクトがすでに存在する場合 */ - // ファイルのビューを、 呼び出し側プロセスのアドレス空間にマップします - m_MappedData = m_FileMapping.MapViewOfFile( - FILE_MAP_ALL_ACCESS + } +} + +/*! + * @brief CShareDataクラスの初期化処理 + * + * 他プロセスが作成した共有メモリを開き、自プロセスに取り込む。 + * + * エディタープロセス用。 + */ +void CShareData::OpenShareData() +{ + // ファイルマッピングオブジェクト + try + { + const auto pszProfileName = GetProfileName(); + std::wstring strShareDataName = GSTR_SHAREDATA; + strShareDataName += pszProfileName; + m_FileMapping = FileMapping::OpenFileMappingW( + GENERIC_READ | GENERIC_WRITE, + FALSE, + strShareDataName ); - + } + // エラーが発生した場合 + catch (const std::system_error&) + { + throw basis::make_initialization_error( + // L"CreateFileMapping()に失敗しました" + LS(STR_ERR_CSHAREDATA01) + , static_cast(EAppExitCode::Exited) //エラーなのに正常っぽいコードを返すのは妥当か? + ); + } + + // ファイルのビューを、 呼び出し側プロセスのアドレス空間にマップします + m_MappedData = m_FileMapping.MapViewOfFile( + FILE_MAP_ALL_ACCESS + ); + + { // マップされたビューに配置されたDLLSHAREDATA構造体を参照します m_pShareData = m_MappedData.get(); @@ -736,7 +766,6 @@ bool CShareData::InitShareData() SelectCharWidthCache(CWM_FONT_EDIT, CWM_CACHE_SHARE); InitCharWidthCache(m_pShareData->m_Common.m_sView.m_lf); } - return true; } static void ConvertLangString( wchar_t* pBuf, size_t chBufSize, std::wstring& org, std::wstring& to ) diff --git a/sakura_core/env/CShareData.h b/sakura_core/env/CShareData.h index 72f8db5c1a..2974bf51fc 100644 --- a/sakura_core/env/CShareData.h +++ b/sakura_core/env/CShareData.h @@ -79,7 +79,9 @@ class CShareData : public TSingleInstance /* || Attributes & Operations */ - bool InitShareData(); /* CShareDataクラスの初期化処理 */ + void InitShareData(); + void OpenShareData(); + void RefreshString(); /* 言語選択後に共有メモリ内の文字列を更新する */ //MRU系 diff --git a/src/test/cpp/tests1/macro/test-macro.cpp b/src/test/cpp/tests1/macro/test-macro.cpp index 52bfedb687..158d86bc84 100644 --- a/src/test/cpp/tests1/macro/test-macro.cpp +++ b/src/test/cpp/tests1/macro/test-macro.cpp @@ -112,8 +112,6 @@ TEST_F(MacroMgrTest, CKeyMacroMgr001) auto mgr = std::unique_ptr(CMacroFactory::getInstance()->Create(L"mac")); - const HINSTANCE unusedArg1 = nullptr; - EXPECT_THAT(mgr->LoadKeyMacroStr(unusedArg1, L""), IsTrue()); EXPECT_THAT(mgr->ExecKeyMacro(&pcEditWnd->GetActiveView(), 0), IsTrue()); diff --git a/src/test/cpp/tests1/test-cdlgopenfile.cpp b/src/test/cpp/tests1/test-cdlgopenfile.cpp index f95733cf07..77ad2d4f12 100644 --- a/src/test/cpp/tests1/test-cdlgopenfile.cpp +++ b/src/test/cpp/tests1/test-cdlgopenfile.cpp @@ -619,7 +619,6 @@ struct SelectFileTest : public ::testing::Test, public window::EditorTestSuite, std::ofstream ofs{ path }; ofs.close(); - constexpr HINSTANCE unusedArg1 = nullptr; hWnd = pcEditWnd->GetHwnd(); // テスト用ダミーダイアログを作る diff --git a/src/test/cpp/tests1/test-csakuraenvironment.cpp b/src/test/cpp/tests1/test-csakuraenvironment.cpp index b829f7b668..22519e53cd 100644 --- a/src/test/cpp/tests1/test-csakuraenvironment.cpp +++ b/src/test/cpp/tests1/test-csakuraenvironment.cpp @@ -38,6 +38,8 @@ #include +#include "window/UiaTestSuite.hpp" //COleInit + using namespace std::literals::string_literals; std::filesystem::path GetTempFilePathWithExt(std::wstring_view prefix, std::wstring_view extension); @@ -351,6 +353,9 @@ TEST_F(CSakuraEnvironmentTest, GetDlgInitialDir001) */ TEST_F(CSakuraEnvironmentTest, ResolvePath001) { + // OLEを初期化する + const auto pcOleInit = std::make_unique(); + // ショートカットのターゲットとなるファイルを作成する const auto target = GetTempFilePathWithExt(L"lnk", L"txt"); std::wofstream fs(target); @@ -420,7 +425,10 @@ INSTANTIATE_TEST_SUITE_P(ExpandParamCases ExpandParamTestParam{ L"$E", STR_NO_TITLE1 }, ExpandParamTestParam{ L"$e", STR_NO_TITLE1 }, ExpandParamTestParam{ L"$B", L""s }, - ExpandParamTestParam{ L"$Q", L"印刷設定 1"s }, + + //TODO: GitHub Actionsでも動くよう対応する + //ExpandParamTestParam{ L"$Q", strprintf(L"%s %d", LS(STR_PRINT_SET_NAME), 1) }, + ExpandParamTestParam{ L"$C", L""s }, ExpandParamTestParam{ L"$x", L"1"s }, ExpandParamTestParam{ L"$y", L"1"s }, diff --git a/src/test/cpp/tests1/test-csharedata.cpp b/src/test/cpp/tests1/test-csharedata.cpp index 75c57dcebb..b2ee888541 100644 --- a/src/test/cpp/tests1/test-csharedata.cpp +++ b/src/test/cpp/tests1/test-csharedata.cpp @@ -1648,7 +1648,7 @@ MATCHER_P4(IsInitializedShareData, pszProfileName, isMultiUserSettings, userRoot } for (int i = 0; i < std::ssize(shareData.m_PrintSettingArr); ++i) { - EXPECT_THAT(shareData.m_PrintSettingArr[i].m_szPrintSettingName, StrEq(std::format(L"{:s} {:d}", LS(STR_PRINT_SET_NAME), i + 1))) << L"Unexpected value at index " << i; + EXPECT_THAT(shareData.m_PrintSettingArr[i].m_szPrintSettingName, StrEq(strprintf(L"%s %d", LS(STR_PRINT_SET_NAME), i + 1))) << L"Unexpected value at index " << i; EXPECT_THAT(shareData.m_PrintSettingArr[i].m_szPrintFontFaceHan, StrEq(L"MS 明朝")); EXPECT_THAT(shareData.m_PrintSettingArr[i].m_szPrintFontFaceZen, StrEq(L"MS 明朝")); EXPECT_THAT(shareData.m_PrintSettingArr[i].m_bColorPrint, IsFalse()); diff --git a/src/test/cpp/tests1/test-window.cpp b/src/test/cpp/tests1/test-window.cpp index fc9e71b584..9c951b685a 100644 --- a/src/test/cpp/tests1/test-window.cpp +++ b/src/test/cpp/tests1/test-window.cpp @@ -1359,8 +1359,6 @@ TEST_F(TrayWndTest, ShowContextMenu001) } struct EditWndTest : public ::testing::Test, public window::EditorTestSuite, public window::UiaTestSuite { - static constexpr HINSTANCE unusedArg1 = nullptr; - static inline std::filesystem::path backupAgentTargetPath{}; static inline std::filesystem::path backupPath{}; static inline std::filesystem::path backupPathB00{}; diff --git a/src/test/cpp/tests1/test-winmain.cpp b/src/test/cpp/tests1/test-winmain.cpp index 800a6b790e..b29193fedc 100644 --- a/src/test/cpp/tests1/test-winmain.cpp +++ b/src/test/cpp/tests1/test-winmain.cpp @@ -1024,6 +1024,40 @@ INSTANTIATE_TEST_SUITE_P(WinMain * テスト実行後に設定ファイルを残しておく意味はないので終了後も削除している。 */ struct WinMainFuncTest : public TWinMainTest<::testing::Test> { + /*! + * テストスイートの終了後に1回だけ呼ばれる関数 + */ + static void TearDownTestSuite() { + // コントロールプロセスに終了指示を出して終了を待つ + testing::TerminateControlProcess(L""); + } + + /*! + * トレイウインドウのクラス名 + */ + std::wstring trayWndClassName{ GSTR_CEDITAPP }; + + /*! + * テストが起動される直前に毎回呼ばれる関数 + */ + void SetUp() override { + // トレイウインドウを検索する + if (const auto hTrayWnd = cxx::FindWindowW(trayWndClassName, trayWndClassName); + !hTrayWnd) + { + // コントロールプロセスを起動する + const auto cp = testing::CreateControlProcess(L""); + ASSERT_THAT(cp, NotNull()); + } + } + + /*! + * テストが実行された直後に毎回呼ばれる関数 + */ + void TearDown() override { + Kernel32::resetInstance(); + } + std::wstring_view GetProfileName() const override { return L""; } @@ -1036,6 +1070,9 @@ struct WinMainFuncTest : public TWinMainTest<::testing::Test> { */ TEST_F(WinMainFuncTest, CreateControlProcess101) { + // コントロールプロセスに終了指示を出して終了を待つ + testing::TerminateControlProcess(L""); + // テスト用プロファイル名 const auto profileName{ GetProfileName() }; @@ -1051,67 +1088,14 @@ TEST_F(WinMainFuncTest, CreateControlProcess101) ASSERT_EXIT({ StartEditorProcess(std::format(LR"(-NOWIN -PROF="{:s}")", profileName)); }, ::testing::ExitedWithCode(0), ".*"); // たぶんバグです。エラー終了なのに0を返してる。 } -/*! - * @brief WinMainを起動してみるテスト - * プログラムが起動する正常ルートに潜む障害を検出するためのもの。 - * コントロールプロセス起動の失敗をテストする。(異なるバージョン) - */ -TEST_F(WinMainFuncTest, CreateControlProcess102) -{ - // テスト用プロファイル名 - const auto profileName{ GetProfileName() }; - - // 共有データの名前を組み立てる - SFilePath shareDataName{ GSTR_SHAREDATA }; - shareDataName.append(profileName); - - // ファイルマッピングオブジェクトを作る - const auto hFileMap = ::CreateFileMappingW( - INVALID_HANDLE_VALUE, - nullptr, - PAGE_READWRITE | SEC_COMMIT, - 0, - sizeof(DLLSHAREDATA), - shareDataName - ); - - ASSERT_THAT(hFileMap, NotNull()); - - // スマートポインターに入れる - cxx::HandleHolder fileMapHolder{ hFileMap }; - - // ファイルマッピングオブジェクトをマップする - using MappedDataHolder = cxx::ResourceHolder<&::UnmapViewOfFile, DLLSHAREDATA*>; - MappedDataHolder mappedData = (DLLSHAREDATA*)::MapViewOfFile( - hFileMap, - FILE_MAP_ALL_ACCESS, - 0, - 0, - 0 - ); - - ASSERT_THAT(mappedData, NotNull()); - - auto pShareData = static_cast(mappedData); - - ASSERT_THAT(pShareData, NotNull()); - - // DLLSHAREDATAのサイズを不正にする - pShareData->m_nSize = sizeof(DLLSHAREDATA) + 1; - - // コントロールプロセスを起動する - EXPECT_EXIT({ StartEditorProcess(std::format(LR"(-NOWIN -PROF="{:s}")", profileName)); }, ::testing::ExitedWithCode(0), ".*"); // たぶんバグです。エラー終了なのに0を返してる。 - - // DLLSHAREDATAのサイズを元に戻す - // 共有メモリはスーパーグローバル変数なので、テスト終了後は元に戻す必要がある - pShareData->m_nSize = sizeof(DLLSHAREDATA); -} - /*! * @brief コントロールプロセス起動の失敗をテストする。(初期化完了イベント作成済み) */ TEST_F(WinMainFuncTest, CreateControlProcess103) { + // コントロールプロセスに終了指示を出して終了を待つ + testing::TerminateControlProcess(L""); + // テスト用プロファイル名 const auto profileName{ GetProfileName() }; @@ -1355,8 +1339,6 @@ TEST_F(WinMainFuncTest, CreateControlProcess108) }), ThrowsMessage(StartsWith("CreateMutex()")) ); - - Kernel32::resetInstance(); } /*! @@ -1387,8 +1369,6 @@ TEST_F(WinMainFuncTest, CreateControlProcess109) }), ThrowsMessage(StartsWith("CreateMutex()")) ); - - Kernel32::resetInstance(); } /*! @@ -1396,6 +1376,9 @@ TEST_F(WinMainFuncTest, CreateControlProcess109) */ TEST_F(WinMainFuncTest, CreateControlProcess110) { + // コントロールプロセスに終了指示を出して終了を待つ + testing::TerminateControlProcess(L""); + Kernel32::setInstance(); auto pKernel32 = (MockKernel32*)Kernel32::getInstance(); @@ -1435,8 +1418,6 @@ TEST_F(WinMainFuncTest, CreateControlProcess110) }), ThrowsMessage(StartsWith("CreateFileMapping()")) ); - - Kernel32::resetInstance(); } /*! @@ -1444,6 +1425,9 @@ TEST_F(WinMainFuncTest, CreateControlProcess110) */ TEST_F(WinMainFuncTest, CreateControlProcess111) { + // コントロールプロセスに終了指示を出して終了を待つ + testing::TerminateControlProcess(L""); + Kernel32::setInstance(); auto pKernel32 = (MockKernel32*)Kernel32::getInstance(); @@ -1487,8 +1471,6 @@ TEST_F(WinMainFuncTest, CreateControlProcess111) }), ThrowsMessage(StartsWith("MapViewOfFile")) ); - - Kernel32::resetInstance(); } /*! @@ -1518,9 +1500,6 @@ TEST_F(WinMainFuncTest, DISABLED_CreateEditorProcess001) // 安定しないの // 編集ウインドウが閉じられた後、プロセスが完全に終了するまで待つ ep.lock(); - - // コントロールプロセスに終了指示を出して終了を待つ - testing::TerminateControlProcess(profileName); } /*! @@ -1547,8 +1526,6 @@ TEST_F(WinMainFuncTest, CreateEditorProcess101) }), ThrowsMessage(StartsWith("CreateMutex()")) ); - - Kernel32::resetInstance(); } /*! @@ -1582,8 +1559,6 @@ TEST_F(WinMainFuncTest, CreateEditorProcess102) }), ThrowsMessage(StartsWith("エディタまたはシステムがビジー")) ); - - Kernel32::resetInstance(); } /*! @@ -1634,7 +1609,7 @@ TEST_F(WinMainFuncTest, CreateEditorProcess110) .WillRepeatedly(testing::DoDefault()); // NULLを返して失敗させる - EXPECT_CALL(*pKernel32, CreateFileMappingW(_, _, _, _, _, _)) + EXPECT_CALL(*pKernel32, OpenFileMappingW(_, _, _)) .WillOnce(Return(HANDLE(nullptr))); // エディタプロセスを起動する @@ -1645,11 +1620,6 @@ TEST_F(WinMainFuncTest, CreateEditorProcess110) }), ThrowsMessage(StartsWith("CreateFileMapping()")) ); - - Kernel32::resetInstance(); - - // コントロールプロセスに終了指示を出して終了を待つ - testing::TerminateControlProcess(L""); } /*! @@ -1673,7 +1643,7 @@ TEST_F(WinMainFuncTest, CreateEditorProcess111) .WillRepeatedly(testing::DoDefault()); // デフォルト処理を呼んで成功させる - EXPECT_CALL(*pKernel32, CreateFileMappingW(_, _, _, _, _, _)) + EXPECT_CALL(*pKernel32, OpenFileMappingW(_, _, _)) .WillOnce(testing::DoDefault()); // NULLを返して失敗させる @@ -1688,11 +1658,6 @@ TEST_F(WinMainFuncTest, CreateEditorProcess111) }), ThrowsMessage(StartsWith("MapViewOfFile()")) ); - - Kernel32::resetInstance(); - - // コントロールプロセスに終了指示を出して終了を待つ - testing::TerminateControlProcess(L""); } /*! @@ -1716,7 +1681,7 @@ TEST_F(WinMainFuncTest, CreateEditorProcess112) .WillRepeatedly(testing::DoDefault()); // デフォルト処理を呼んで成功させる - EXPECT_CALL(*pKernel32, CreateFileMappingW(_, _, _, _, _, _)) + EXPECT_CALL(*pKernel32, OpenFileMappingW(_, _, _)) .WillOnce(testing::DoDefault()); // NULLを返して失敗させる @@ -1743,11 +1708,6 @@ TEST_F(WinMainFuncTest, CreateEditorProcess112) }), ThrowsMessage(StartsWith("異なるバージョンの")) ); - - Kernel32::resetInstance(); - - // コントロールプロセスに終了指示を出して終了を待つ - testing::TerminateControlProcess(L""); } /*! @@ -1757,9 +1717,15 @@ TEST_F(WinMainFuncTest, CreateEditorProcess112) */ TEST_F(WinMainFuncTest, DoGrep001) { + // コントロールプロセスに終了指示を出して終了を待つ + testing::TerminateControlProcess(L""); + // テスト用プロファイル名 const auto profileName{ GetProfileName() }; + // INIファイルのパスを組み立てる + iniPath = GetIniFileName(); + // ケース独自の設定ファイルを使うので、一旦削除する std::filesystem::remove(iniPath); @@ -1797,7 +1763,10 @@ TEST_F(WinMainFuncTest, DoGrep001) ep.lock(); // コントロールプロセスに終了指示を出して終了を待つ - testing::TerminateControlProcess(profileName, cp.dwProcessId); + testing::TerminateControlProcess(profileName); + + // 後続テストに影響させないよう削除しておく + std::filesystem::remove(iniPath); } /*! @@ -1820,9 +1789,6 @@ TEST_F(WinMainFuncTest, OpenDebugWindow001) // 編集ウインドウが閉じられた後、プロセスが完全に終了するまで待つ ep.lock(); - - // コントロールプロセスに終了指示を出して終了を待つ - testing::TerminateControlProcess(profileName); } /*! @@ -1832,9 +1798,16 @@ TEST_F(WinMainFuncTest, OpenDebugWindow001) */ TEST_F(WinMainFuncTest, ShowDlgGrep101) { + // コントロールプロセスに終了指示を出して終了を待つ + testing::TerminateControlProcess(L""); + // テスト用プロファイル名 const auto profileName{ GetProfileName() }; + // コントロールプロセスを起動する + auto cp = testing::CreateControlProcess(profileName); + ASSERT_THAT(cp, NotNull()); + // 表示されたGrepダイアログを閉じるためのスレッドを起動する auto t = StartDialogCloser(L"Grep", [] (IUIAutomation* pUIAutomation, HWND hWndDlg, std::stop_token st) { EmulateInvokeButton(pUIAutomation, hWndDlg, IDCANCEL, st); @@ -2048,10 +2021,6 @@ struct OutlineTest : public ::testing::TestWithParam { }; cxx::writeTextFile( iniPath, iniLines ); - - // コントロールプロセスを起動する - auto cp = testing::CreateControlProcess(L""); - ASSERT_THAT(cp, NotNull()); } static void TearDownTestSuite() { diff --git a/src/test/cpp/tests1/window/EditorTestSuite.cpp b/src/test/cpp/tests1/window/EditorTestSuite.cpp index 2765c2d458..82f6f6b339 100644 --- a/src/test/cpp/tests1/window/EditorTestSuite.cpp +++ b/src/test/cpp/tests1/window/EditorTestSuite.cpp @@ -8,6 +8,16 @@ #include "window/EditorTestSuite.hpp" #include "_main/CAppMode.h" +#include "_main/CProcessFactory.h" + +namespace testing { + +void TerminateControlProcess( + std::wstring_view profileName, + DWORD dwControlProcessId = 0 +); + +} // namespace testing namespace window { @@ -20,7 +30,30 @@ namespace window { pCommandLine = std::make_unique(); pCommandLine->ParseCommandLine(L"-PROF=", false); - SetUpShareData(); + // 言語環境を初期化する + CSelectLang::InitializeLanguageEnvironment(); + + // コントロールプロセスが起動している状態にする + CProcessFactory::StartControlProcess(); + + // 共有メモリのインスタンスを生成する + pcShareData = std::make_unique(); + + // 共有メモリを初期化する + pcShareData->OpenShareData(); + + // 言語を日本語に固定する + GetDllShareData().m_Common.m_sWindow.m_szLanguageDll = L""; + CSelectLang::ChangeLang(GetDllShareData().m_Common.m_sWindow.m_szLanguageDll); + + dmpPath = GetExeFileName().replace_extension(".dmp"); + iniBkPath = GetIniFileName().concat(".bak"); + profIniPath = GetExeFileName().replace_extension().concat("_prof.ini"); + + std::error_code ec; + std::filesystem::remove(dmpPath, ec); + std::filesystem::remove(iniBkPath, ec); + std::filesystem::remove(profIniPath, ec); // CanBeMoveリージョンをテストケースに分割する。(すぐ対応できないのでコメント残し) @@ -145,9 +178,17 @@ namespace window { pcEditDoc = nullptr; + std::error_code ec; + std::filesystem::remove(dmpPath, ec); + std::filesystem::remove(iniBkPath, ec); + std::filesystem::remove(profIniPath, ec); + TearDownShareData(); pCommandLine = nullptr; + + // コントロールプロセスに終了指示を出して終了を待つ + testing::TerminateControlProcess(L""); } } // namespace window diff --git a/src/test/cpp/tests1/window/EditorTestSuite.hpp b/src/test/cpp/tests1/window/EditorTestSuite.hpp index 5afce4e6df..fad5a74d91 100644 --- a/src/test/cpp/tests1/window/EditorTestSuite.hpp +++ b/src/test/cpp/tests1/window/EditorTestSuite.hpp @@ -27,6 +27,12 @@ namespace window { struct EditorTestSuite : public env::ShareDataTestSuite { + static constexpr HINSTANCE unusedArg1 = nullptr; + + static inline std::filesystem::path dmpPath{}; + static inline std::filesystem::path iniBkPath{}; + static inline std::filesystem::path profIniPath{}; + static inline std::unique_ptr pCommandLine = nullptr; static inline std::unique_ptr pcEditDoc = nullptr;