Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CNativeW の static 関数に対するテストを追加する #1542

Merged

Conversation

kengoide
Copy link
Member

@kengoide kengoide commented Feb 14, 2021

PR の目的

以下の CNativeW の static 関数に対するテストを追加します。

  • CNativeW::GetSizeOfChar
  • CNativeW::GetKetaOfChar
  • CNativeW::GetHabaOfChar
  • CNativeW::GetCharNext
  • CNativeW::GetCharPrev

カテゴリ

  • リファクタリング
  • その他の問題

PR のメリット

  • コードカバレッジが向上します。

PR のデメリット

使用頻度の高い CCharWidthCache のメンバ関数を virtual にするため、パフォーマンスの低下が懸念されます。

ファイルを開いて拡大・縮小し、レイアウト生成を繰り返す手法で簡単にとったプロファイリングによれば、CCharWidthCache::CalcPxWidthByFont が CPU 時間の5~10%を占めますが、実行時間の98%程度が GDI の呼び出しであり、virtual 呼び出し自体はそれほど高価ではないようです。

PR の影響範囲

単体テストを可能にするため既存コードに引数を追加しますが、振る舞いを変更するものではありません。

関連 issue, PR

#1532

@AppVeyorBot
Copy link

Build sakura 1.0.3450 completed (commit 4e7da81bf7 by @k-kagari)

@kengoide kengoide marked this pull request as draft February 14, 2021 17:08
@kengoide
Copy link
Member Author

Code Smells に対応するまで Draft にしておきます。

@AppVeyorBot
Copy link

Build sakura 1.0.3451 completed (commit 0dec8bd846 by @k-kagari)

@kengoide kengoide force-pushed the feature/more-tests-for-cnativew branch from 9f8ec63 to 2222e9c Compare February 15, 2021 11:15
@AppVeyorBot
Copy link

Build sakura 1.0.3452 completed (commit 23d3d49be0 by @k-kagari)

@kengoide kengoide marked this pull request as ready for review February 15, 2021 11:57
@berryzplus
Copy link
Contributor

すぐレビューできなくてすみません。
最近時間が取れんのです。

CodeFactorの警告がまともなのを久々に見た気がします。
対応せんでもいいですが、やったほうがより良いっす。

virtual void Method() override
  • override付けるなら virtual は要らないという指摘みたいです。

@AppVeyorBot
Copy link

Build sakura 1.0.3453 completed (commit ac0da5c255 by @k-kagari)

@sonarcloud
Copy link

sonarcloud bot commented Feb 17, 2021

Kudos, SonarCloud Quality Gate passed!

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 4 Code Smells

100.0% 100.0% Coverage
0.0% 0.0% Duplication

@suconbu
Copy link
Member

suconbu commented Feb 17, 2021

以下の修正が本題と関係しないように見えましたが、ついでに行うリファクタリングでしょうか。
念のため確認させて下さい。

sakura_core/CRegexKeyword.h
sakura_core/doc/CBlockComment.h
sakura_core/doc/CLineComment.h
→「class CStringRef;」の追加

sakura_core/recent/SShare_History.h
sakura_core/env/CAppNodeManager.h
→ include 文の追加

@kengoide
Copy link
Member Author

以下の修正が本題と関係しないように見えましたが、ついでに行うリファクタリングでしょうか。

CNativeW.h で charset/charcode.h と env/DLLSHAREDATA.h を #include すると発生するコンパイルエラーの修正でした。

#include "debug/Debug2.h" //assert
#include "env/DLLSHAREDATA.h"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CNativeWはDLLSHAREDATAの定義に依存する、という意味の変更なので、若干気になっています。
方向的には逆ですよね。(暗黙的に依存していたのを解消させようとしてる)

static CKetaXInt GetKetaOfChar( const wchar_t* pData, int nDataLen, int nIdx ); //!< 指定した位置の文字が半角何個分かを返す
static CHabaXInt GetHabaOfChar( const wchar_t* pData, int nDataLen, int nIdx,
CCharWidthCache& cache = GetCharWidthCache(),
bool bEnableExtEol = GetDllShareData().m_Common.m_sEdit.m_bEnableExtEol );
Copy link
Contributor

@berryzplus berryzplus Feb 17, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

個人的には cache と bEnableExtEol の定義順を逆にして、
bEnableExtEol のデフォルト指定を外したいっす。

bEnableExtEol のデフォルト指定を外すメリットは、#include "DLLSHAREDATA.h" する必要がなくなる、です。
また、デフォルト指定を外すことにより、共有メモリ(=プロセス間をまたがって有効な超グローバル変数)に依存するコードの特定が容易になるっす。共有メモリに依存するコードは現実的にテスト不能なコードなので、テスト可能にできるようにして行ってる認識です。

もちろん、増やした引数のデフォルト指定をやめるってことは、呼出元を変更する必要が出てくるってことなので無理に対応しなくてよいと思っています。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

共有メモリ依存を明確にしていくのは確かに意義がありそうです。別PRで実施します。

Copy link
Contributor

@berryzplus berryzplus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

趣旨・・・同意。
コード・・・問題なさげ。

いいんではないかと思います。

@berryzplus
Copy link
Contributor

ちなみに、残存した4件のCodeSmellsについては、「対応できない」で合意です。

Modify the macro definition so that it needs to be followed by a semicolon, or remove this empty statement.

超約: 行末のセミコロンが不要です。セミコロンがないとエラーになるようにassertマクロを修正するか、行末のセミコロンを削除してください。

セミコロンがないとエラーになるような、アフォな修正をassertマクロに加えることは容易です。
assertマクロ利用箇所のセミコロンを削るのも容易です。

どちらの対応をしても「これ何?」でレビューされない気がするし、「なんでそんな修正しないといけないんだ!」とゴネる人が出そうな気がしました。

@kengoide
Copy link
Member Author

レビューありがとうございます。マージします。

@kengoide kengoide merged commit 5407fd8 into sakura-editor:master Feb 17, 2021
@kengoide kengoide deleted the feature/more-tests-for-cnativew branch February 18, 2021 10:16
@k-takata
Copy link
Member

セミコロンがないとエラーになるような、アフォな修正をassertマクロに加えることは容易です。

標準のassertマクロでは ((void)0) にdefineされてますし、それに合わせてもいいんじゃないですかね。

@kengoide
Copy link
Member Author

ところでですが、assertマクロの独自定義は必要なものなんでしょうか。標準のassertを使っていない理由が気になってきました。

@berryzplus
Copy link
Contributor

ところでですが、assertマクロの独自定義は必要なものなんでしょうか。標準のassertを使っていない理由が気になってきました。

本来は不要、ここのプロジェクトでは必要、の認識です。

独自定義 assert が必要な理由は色々ありますが、端的には以下のような対応をしたことが原因です。

#1342 単体テストで assert が発生したときに MessageBox が表示されないようにする

普通に考えれば「単体テストしづらくなるようなassert書くなよw」なんすけど、コードが先にある状態からテストを付けていってるので諦めるしかない気もします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
refactoring リファクタリング 【ChangeLog除外】 UnitTest
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants