Как выполнить двухстороннюю обработку двунаправленного текста

Я пытаюсь написать модульные тесты для некоторого кода форматирования строки. Форматированный вывод, вероятно, в некоторых случаях содержит двунаправленный текст, то есть смесь как слева направо, так и справа налево.

Я эмпирически подтвердил, что вывод выглядит корректно для всех комбинаций входа и выхода LTR и RTL при запуске на устройстве Android или эмуляторе. Тем не менее, я изо всех сил пытаюсь зафиксировать это в модульных тестах; Я не уверен, как правильно указать в моих тестовых случаях ожидаемый результат.

Например, я хочу утверждать, что возвращаемая строка будет отображаться следующим образом:

-د.ك.123,456.78

То есть, глифы должны появляться в этом порядке слева направо:

-

1

2

3

,

4

5

6

.

7

8

.

ك

.

د

(Вы не представляете, как сильно это было даже редактирование в правильной последовательности в редакторе SO!)

Я попытался использовать стандартные методы сравнения строк в моих тестовых случаях, например:

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

Но это терпит неудачу, потому что строка ожидаемого вывода в тестовом коде имеет свой переупорядоченный текст. На самом деле это даже выглядит по-другому в источнике, в зависимости от того, какой инструмент я использую для просмотра источника (Android Studio vs. Github-with-Chrome), поэтому я не уверен, что он тестирует правильные вещи.

Я также старался наращивать значение ожидаемого результата в шагах, чтобы избежать путаницы в редакторе, хотя это приводит к тому, что тот же строковый литерал создается под капотом:

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

Как сравнить визуальный порядок глифов, а не логический порядок? Будет ли Android BidiFormatter помочь мне здесь?

Типичный assertEquals в этой строке и метод, возвращающий тот же String (т. Е. Новый объект String), отлично подходят для меня, используя IntelliJ 14.0.3 Ultimate, UTF-8, установленный для фактического текстового файла.

Что также работает, и что вы можете попробовать, это получить байты строки, с которой вы хотите сравнить (возможно, вручную указать конкретную кодировку), а затем сравнить возвращаемые массивы байт друг с другом, используя assertArrayEquals . Я не понимаю, почему получение байтов строки с использованием кодированной вручную кодировки не будет работать, по крайней мере.

Вы можете проверить эту страницу для вдохновения, если хотите: https://docs.oracle.com/javase/tutorial/i18n/text/string.html