5

文字列書式設定コードの単体テストを作成しようとしています。フォーマット化された出力には、場合によっては双方向のテキスト、つまり左から右と右から左が混在するテキストが含まれる可能性があります。

Android デバイスまたはエミュレーターで実行した場合、LTR と RTL の入力と出力のすべての組み合わせに対して、出力が正しく見えることを経験的に確認しました。ただし、単体テストでこれをキャプチャするのに苦労しています。私のテストケースで、期待される出力を正しく指定する方法がわかりません。

たとえば、返された文字列が次のようにレンダリングされることをアサートしたいと思います。

-د.ك.123,456.78

つまり、グリフは次の順序で左から右に表示されます。

-

1

2

3

,

4

5

6

.

7

8

.

ك

.

د

(SO 編集ボックスでそれを正しいシーケンスに編集することさえどれほど大変だったか、あなたにはわかりません!)

次のように、テストケースで標準の文字列比較方法を使用してみました。

assertEquals("-د.ك.123,456.78", formattedOutput);

しかし、テスト コードの期待される出力文字列のテキストが並べ替えられているため、これは失敗します。実際、ソースを表示するために使用するツール (Android Studio と Github-with-Chrome) に応じて、ソースでの表示も異なるため、正しいことをテストしているとは確信が持てません。

また、エディターでの混乱を避けるために、期待される出力値を段階的に構築しようとしましたが、内部で同じ文字列リテラルが構築されます。

assertEquals("-123,456.78" + SYMBOL, formattedOutput);

論理的な順序ではなく、グリフの視覚的な順序を比較するにはどうすればよいですか? ここでAndroid はBidiFormatter役に立ちますか?

4

1 に答える 1

0

IntelliJ 14.0.3 Ultimate、UTF-8 セットを実際のテキスト ファイルに使用すると、その文字列の典型的なものassertEqualsと同じ文字列 (つまり、新しい文字列オブジェクト) を返すメソッドがうまく機能します。

また、機能し、試してみることができるのは、比較したい String のバイトを取得し (特定のエンコーディングを手動で指定することもできます)、返されたバイト配列を を使用して互いに比較することassertArrayEqualsです。少なくとも、手動で設定されたエンコーディングを使用して文字列のバイトを取得することが機能しない理由がわかりません。

必要に応じて、このページでインスピレーションを得ることができます: https://docs.oracle.com/javase/tutorial/i18n/text/string.html

于 2015-04-12T00:56:14.767 に答える