Skip to content

Commit

Permalink
Merge cff81c1 into e67c8ce
Browse files Browse the repository at this point in the history
  • Loading branch information
berryzplus authored Mar 19, 2022
2 parents e67c8ce + cff81c1 commit 398d83d
Show file tree
Hide file tree
Showing 9 changed files with 220 additions and 6 deletions.
1 change: 1 addition & 0 deletions sakura_core/_main/CNormalProcess.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,6 @@ class CNormalProcess final : public CProcess {

private:
CEditApp* m_pcEditApp; //2007.10.23 kobake
CMigemo m_cMigemo;
};
#endif /* SAKURA_CNORMALPROCESS_F2808B31_61DC_4BE0_8661_9626478AC7F9_H_ */
2 changes: 2 additions & 0 deletions sakura_core/extmodule/CHtmlHelp.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
#define SAKURA_CHTMLHELP_7003298B_3900_42FD_9A02_1BCD4E9A8546_H_
#pragma once

#include <HtmlHelp.h>

#include "CDllHandler.h"

/*!
Expand Down
2 changes: 1 addition & 1 deletion sakura_core/extmodule/CIcu4cI18n.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ typedef enum UErrorCode {
/*!
* ICU4C の i18n ライブラリ(icuin.dll) をラップするクラス
*/
class CIcu4cI18n final : public CDllImp
class CIcu4cI18n : public CDllImp
{
// DLL関数型定義
typedef UCharsetDetector* (__cdecl *ucsdet_open_t)(UErrorCode *status);
Expand Down
6 changes: 2 additions & 4 deletions sakura_core/extmodule/CMigemo.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,9 @@ typedef struct _migemo migemo;
#include "CDllHandler.h"
#include "util/design_template.h"

class CMigemo : public TSingleton<CMigemo>, public CDllImp {
friend class TSingleton<CMigemo>;
CMigemo(){}

class CMigemo : public CDllImp, public TSingleInstance<CMigemo> {
public:
CMigemo() = default;
virtual ~CMigemo();

// Entry Point
Expand Down
2 changes: 1 addition & 1 deletion sakura_core/extmodule/CUchardet.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ typedef struct uchardet * uchardet_t;
/*!
* uchardet ライブラリ(uchardet.dll) をラップするクラス
*/
class CUchardet final : public CDllImp
class CUchardet : public CDllImp
{
public:
// DLL関数ポインタ
Expand Down
101 changes: 101 additions & 0 deletions tests/unittests/TExtModule.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/*! @file */
/*
Copyright (C) 2022, Sakura Editor Organization
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented;
you must not claim that you wrote the original software.
If you use this software in a product, an acknowledgment
in the product documentation would be appreciated but is
not required.
2. Altered source versions must be plainly marked as such,
and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
*/
#include <gtest/gtest.h>

#include "extmodule/CDllHandler.h"

#include <type_traits>

/*!
外部DLL読み込みをテストするためのテンプレートクラス
CDllImp派生クラスを指定して使う。
テストではロード処理後の挙動をチェックするので、コンストラクタでinitしてしまう。
*/
template<class T, std::enable_if_t<std::is_base_of_v<CDllImp, T>, std::nullptr_t> = nullptr>
class TExtModule : public T {
private:
std::wstring_view dllName = L"";

protected:
//! DLLパスを返す
LPCWSTR GetDllNameImp(int index) override {
return dllName.empty() ? T::GetDllNameImp(index) : dllName.data();
}

public:
//! コンストラクタ
explicit TExtModule(std::wstring_view path = L"")
: dllName(path) {
// この関数の戻り値型はC++では推奨されない。
// あちこちで警告が出るとうっとおしいので呼出箇所をまとめておく
// 将来的には、適切な戻り値型に変更したい。
this->InitDll(nullptr);
}
};

/*!
外部DLLの読み込み失敗をテストするためのテンプレートクラス
CDllImp派生クラスを指定して使う。
DLL読み込み失敗をテストするために「あり得ないパス」を指定する。
*/
template<class T>
class TUnresolvedExtModule : public TExtModule<T> {
private:
// あり得ないパス
static constexpr auto& BadDllName = LR"(>\(^o^)\<)";

// 基底クラスの型
using Base = TExtModule<T>;

public:
TUnresolvedExtModule()
: Base(BadDllName) {
}
};

/*!
外部DLLの読み込み失敗をテストするためのテンプレートクラス
CDllImp派生クラスを指定して使う。
エクスポート関数のアドレス取得失敗をテストするためにMSHTMLを指定する。
MSHTMLは、Windowsには必ず存在していてサクラエディタでは使わないもの。
将来的にMSHTMLを使いたくなったら他のDLLを選定して定義を修正すること。
*/
template<class T>
class TUnsufficientExtModule : public TExtModule<T> {
private:
// サクラエディタでは利用しないWindowsのDLL名
static constexpr auto& UnusedWindowsDllName = L"MSHTML.DLL";

// 基底クラスの型
using Base = TExtModule<T>;

public:
TUnsufficientExtModule()
: Base(UnusedWindowsDllName) {
}
};
104 changes: 104 additions & 0 deletions tests/unittests/test-extmodules.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/*! @file */
/*
Copyright (C) 2022, Sakura Editor Organization
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented;
you must not claim that you wrote the original software.
If you use this software in a product, an acknowledgment
in the product documentation would be appreciated but is
not required.
2. Altered source versions must be plainly marked as such,
and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
*/
#include <gtest/gtest.h>

#include "TExtModule.hpp"

#include "extmodule/CBregexpDll2.h"
#include "extmodule/CHtmlHelp.h"
#include "extmodule/CIcu4cI18n.h"
#include "extmodule/CMigemo.h"
#include "extmodule/CUchardet.h"
//#include "extmodule/CUxTheme.h" //TSingletonなのでテストできない
#include "macro/CPPA.h"
//#include "plugin/CDllPlugin.h" //継承不可なのでテストできない

/*!
外部DLLの読み込みテスト
*/
template <typename T>
class LoadTest : public ::testing::Test {
};

//! パラメータテストであるとマークする
TYPED_TEST_CASE_P(LoadTest);

/*!
読み込み失敗のテスト
DLLが見つからなくて失敗するケース
*/
TYPED_TEST_P(LoadTest, FailedToLoadLibrary)
{
// テスト対象のCDllImpl派生クラスをテストするための型を定義する
using ExtModule = TUnresolvedExtModule<TypeParam>;

// テストクラスをインスタンス化する
ExtModule extModule;

// DLLが見つからなくてIsAvailableはfalseになる
EXPECT_FALSE(extModule.IsAvailable());
}

/*!
読み込み失敗のテスト
エクスポート関数が取得できなくて失敗するケース
*/
TYPED_TEST_P(LoadTest, FailedToGetProcAddress)
{
// テスト対象のCDllImpl派生クラスをテストするための型を定義する
using ExtModule = TUnsufficientExtModule<TypeParam>;

// テストクラスをインスタンス化する
ExtModule extModule;

// エクスポート関数の一部が見つからなくてIsAvailableはfalseになる
EXPECT_FALSE(extModule.IsAvailable());
}

// test suiteを登録する
REGISTER_TYPED_TEST_SUITE_P(
LoadTest,
FailedToLoadLibrary, FailedToGetProcAddress);

/*!
テスト対象(外部DLLを読み込むクラス)
CDllImp派生クラスである必要がある。
*/
using ExtModuleImplementations = ::testing::Types<
CBregexpDll2,
CHtmlHelp,
CIcu4cI18n,
CMigemo,
CUchardet,
CPPA>;

//! パラメータテストをインスタンス化する
INSTANTIATE_TYPED_TEST_SUITE_P(
ExtModule,
LoadTest,
ExtModuleImplementations);
2 changes: 2 additions & 0 deletions tests/unittests/tests1.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
<ClCompile Include="test-crunningtimer.cpp" />
<ClCompile Include="test-csharedata.cpp" />
<ClCompile Include="test-czipfile.cpp" />
<ClCompile Include="test-extmodules.cpp" />
<ClCompile Include="test-printEFunctionCode.cpp" />
<ClCompile Include="test-cclipboard.cpp" />
<ClCompile Include="test-ccodebase.cpp" />
Expand Down Expand Up @@ -159,6 +160,7 @@
</ItemGroup>
<ItemGroup>
<ClInclude Include="eval_outputs.hpp" />
<ClInclude Include="TExtModule.hpp" />
<ClInclude Include="tests1_rc.h" />
</ItemGroup>
<ItemGroup>
Expand Down
6 changes: 6 additions & 0 deletions tests/unittests/tests1.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,9 @@
<ClCompile Include="test-cppa.cpp">
<Filter>Test Files</Filter>
</ClCompile>
<ClCompile Include="test-extmodules.cpp">
<Filter>Test Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="StartEditorProcessForTest.h">
Expand All @@ -177,6 +180,9 @@
<ClInclude Include="eval_outputs.hpp">
<Filter>Other Files</Filter>
</ClInclude>
<ClInclude Include="TExtModule.hpp">
<Filter>Other Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClInclude Include="tests1_rc.h">
Expand Down

0 comments on commit 398d83d

Please sign in to comment.