単体テストで起きたassert失敗を捕捉できるように、コンソールモードではメッセージボックスを表示しないようにしたい #1362
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
PR の目的
コンソールモードではメッセージボックスを表示しないようにします。
カテゴリ
PR の背景
このPRは #1351
デバッグ用のメッセージ出力を改善する
をベースに、修正箇所を最小に抑えて変更内容を分かりやすくしたものです。前提知識
自動テストできない
ということです。問題点
考えられる対策
これは、メッセージボックスを表示するコードはテストしない、になるので良くない気がします。
メッセージボックス表示関数の呼び出しをラップして、呼ばれても表示しない、を実施する作戦です。
サクラエディタには既にラッパー関数が存在しているため、多少のカスタムで実現可能です。
この方式ならば、メッセージボックスを表示するコードの自動テストを書くことができます。
経緯
単体テストで文字列リソースを利用できるようにする
sakura.sln
でビルドした単体テストにリソースが埋め込まれるような修正を実施。プロファイルマネージャを表示するかどうかの判定をテスト可能にする
CDlgProfileMgrのテストを導入して、ダイアログ表示の要否判定をテスト可能に。
単体テストで x64 Debug で CDlgProfileMgr.TrySelectProfile_001 で assert になる
バッチから単体テストを実行した場合、MSVC版であってもCMakeでビルドされた単体テストが実行されるようになっていたことにより発生した問題。CMakeLists.txtのMSVC版設定をsakura_rc.resを取り込むように修正して、CMake×MSVCでビルドした単体テストでassertが出る問題は解決済み。単体テストでのassert時にテスト実行が中断されてしまう問題が残課題。
単体テストで assert が発生したときに MessageBox が表示されないようにする
単体テストで x64 Debug で CDlgProfileMgr.TrySelectProfile_001 で assert になる #1334 の残課題対策PR。迷走中。
デバッグ用のメッセージ出力を改善する
単体テストで x64 Debug で CDlgProfileMgr.TrySelectProfile_001 で assert になる #1334 の残課題対策PR。単体テストで assert が発生したときに MessageBox が表示されないようにする #1342 のカウンターPRとして作成。push先ブランチが間違っていたため一旦破棄。
このPRの元ネタ(完全版)。
PR のメリット
PR のデメリット (トレードオフとかあれば)
仕様・動作説明
debug/Debug1.h
TRACE(...)
debug/Debug2.h
debug_output(...)
debug/Debug2.h
debug_exit()
debug/Debug2.h
debug_exit2(...)
debug/Debug2.h
warning_point()
debug/Debug2.h
assert()
debug/Debug2.h
assert_warning()
util/MessageBoxF.cpp
Wrap_MessageBox(...)
テスト内容
テスト1
既存メッセージボックスが表示できることの確認手順です。
手順
aaaa
と打って改行、行ごとコピーして3行以上にします。連続した重複行の削除(Ctrl + M)
します。N行マージしました。
のメッセージボックスが表示されたらOKです。テスト2
変更後仕様のassertが設計通りに動作することの確認手順です。
手順
assert(false):
を挿入します。PR の影響範囲
関連 issue, PR
resolves #1334
単体テストで x64 Debug で CDlgProfileMgr.TrySelectProfile_001 で assert になる
#1342
単体テストで assert が発生したときに MessageBox が表示されないようにする
#1351
デバッグ用のメッセージ出力を改善する
参考資料
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox
https://docs.microsoft.com/en-us/windows/console/getstdhandle
http://eternalwindows.jp/windevelop/console/console02.html
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/assert-macro-assert-wassert?view=vs-2019
https://c.keicode.com/lib/assert-when-you-should-use.php