-
Notifications
You must be signed in to change notification settings - Fork 169
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
メッセージボックス関数の単体テスト向け独自拡張の不具合を修正したい #1813
メッセージボックス関数の単体テスト向け独自拡張の不具合を修正したい #1813
Conversation
元から仕組みがあったがgtestで使えないので改良。 gtestではワイド文字列を扱えないのでUTF8で書き出して読み出した文字列をUTF16LEに戻してから評価する。
パフォーマンスに悪影響が出るほどに膨大なテキスト出力に耐える固定長バッファを確保していたのをやめて、動的にバッファ確保するよう変更する。
c1abab5
to
dfcafad
Compare
✅ Build sakura 1.0.4073 completed (commit 621a8d1932 by @berryzplus) |
✅ Build sakura 1.0.4074 completed (commit cf80443eef by @berryzplus) |
ところで、C++11以降では これらのデータ型に格納された文字とマルチバイト文字との相互変換に使える関数は
(出典: https://en.cppreference.com/w/cpp/header/cuchar ) このPRでは(C++20でも用意されていない)ワイド文字とUTF-8間の変換関数を追加するわけですが、関数名を |
https://cpprefjp.github.io/lang/cpp20/char8_t.html |
❌ Build sakura 1.0.4075 failed (commit bb6d7cd7fd by @berryzplus) |
Kudos, SonarCloud Quality Gate passed! |
Code Factorがエラーを吐いてるのはいつも通りなのでスルーで。 おそらく「ファイル内の累積複雑度が基準値を超えている」という警告。 |
✅ Build sakura 1.0.4076 completed (commit bb6d7cd7fd by @berryzplus) |
|
現時点ではC++20は採用できません(= C++20の GCCは10.1以降なら使えるらしいですが、こっちのことはよく知りません。 あと |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
テストも通っていますし、LGTMです。
僕の方ではVS2017の廃止対応が済み、17.2がリリースされるまでC++20の導入を提案しないつもりですが、他の方からの導入要望は歓迎します。 |
レビューありがとうございます。マージしちゃいます。 |
「なんちゃって C++20 」で構わなければ、ビルドオプションで あと、記憶が確かなら |
https://docs.microsoft.com/ja-jp/cpp/overview/visual-cpp-language-conformance?view=msvc-170
|
ホント言うと、wcs も u8s も mbs も「迂闊に使うとエディタ仕様を損なう危険がある」と思っているので、 じゃ、なんで入れとんねん! ってことになりますが、 |
PR の目的
タイトル通りです。
カテゴリ
テスト専用コードの不具合を修正します。
PR の背景
Wrap_MessageBox
に不具合があることが分かりました。通常、メッセージボックスの表示を含むコードは自動テストできません。
サクラエディタにはメッセージボックスを表示するコードが多いので、
「メッセージボックスを表示する=テストできません」だと困ってしまいます。
なので #1362 で
Wrap_MessageBox
を改造し、表示しようとしたメッセージをコンソールに出力するようにしました。ところがテストプログラムでコンソールに出力したメッセージの取得を試みたところ、うまくいきませんでした。(#1812)
テストで使えるように入れた機能がテストプログラムから簡単に扱えないのは、たとえ仕様的には正しくても不具合だと思うので、不具合として修正したいと思います。
PR のメリット
PR のデメリット (トレードオフとかあれば)
仕様・動作説明
アプリの本体コード内に埋め込んだテスト専用コードを修正します。
アプリの仕様・挙動に影響を与える修正ではありません。
Wrap_MessageBox
旧)コンソールへの出力に
WriteConsoleW
を利用。gtestでキャプチャしようとすると失敗した。新)コンソールへの出力に
std::clog
を利用。gtestでキャプチャできるようになった。コンソールへの出力に
std::wcerr
を利用しようとしたところ、出力された文字列を gtest で取得できなかった。Wrap_MessageBox
旧)コンソールへの出力時に
wchar_t*
の文字列をそのまま出力していた。新)コンソールへの出力時に
wchar_t*
の文字列をUTF-8
に変換して出力するように変えた。ACP(=Windows-31J、シフトJIS)に変換する仕様とすると「変換できない問題」が発生するので
UTF-8
を採用した。VMessageBoxF
旧)固定長16000文字の内部バッファを使ってフォーマットしていた。 VMessageBoxFのバッファ長 #1416 の通り、バッファサイズが明らかに大きすぎで、しかも、フォーマット結果が15999文字を超えた場合にはメッセージが切り捨てられてしまう制約があった。
新)フォーマット関数を strprintf に変更し、動的にバッファ確保するように変えた。
PR の影響範囲
テスト専用コードの不具合修正なので、アプリの挙動には影響しません。
不具合が解消することにより「処理結果としてメッセージ表示するコード」の単体テストを書けるようになります。
追加したwcsとu8sの相互変換関数を、アプリ内で転用することができるようになります。
テスト内容
このPRは改修部分の単体テストコードを含んでいます。
テスト1
手順
関連 issue, PR
参考資料