我正在尝试为一些字符串格式化代码编写单元测试。在某些情况下,格式化输出可能包含双向文本,即从左到右和从右到左的混合。
在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
会帮助我吗?
答案 0 :(得分:0)
该字符串上的典型assertEquals
和返回相同String的方法(即一个新的String对象)对我来说很好,使用IntelliJ 14.0.3 Ultimate,UTF-8设置为实际文本文件。
什么也可以,你可以尝试,是获取你想要比较的字符串的字节(可能手动指定一个特定的编码),然后使用{{1}将返回的字节数组相互比较}。我不明白为什么使用手动设置编码获取String的字节至少不起作用。
如果您愿意,可以查看此页面以获取灵感:https://docs.oracle.com/javase/tutorial/i18n/text/string.html