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

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

Я эмпирически подтвердил, что вывод выглядит корректно для всех комбинаций входа и выхода 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

Intereting Posts
Не удалось разрешить все зависимости для конфигурации: app: _debugCompile'-Facebook Таблица INSERT ИЛИ IGNORE с ключом AUTOINCREMENT в Android Удаление общих настроек Parse.com Ошибка аутентификации: невозможно ответить на любую из этих проблем: {oauth = www-authenticate: OAuth realm = "https://api.twitter.com"} Как узнать, какой ресурс используется? Java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет VM в ListView и ленивые загрузки изображений Как разрешить пользователям оценивать приложение Android из приложения (без перенаправления в Play Маркет) Показать активность снизу вверх Java.lang.RuntimeException: не удается создать обработчик внутри потока, который не вызвал Looper.prepare () Нарисуйте привязку полилинии к дорожке Android google maps app Merory Leak; Объекты не имеют корня GC Скрыть / показать fab с анимацией масштаба Есть ли прослушиватель Dropped Call Listener Устройства без «Приложения с использованием данных использования» или андроида.settings.USAGE_ACCESS_SETTINGS Исключение из памяти + анализ дампа файла hprof