1b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio/* 2b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio * Copyright (C) 2013 The Android Open Source Project 3b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio * 4b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio * Licensed under the Apache License, Version 2.0 (the "License"); 5b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio * you may not use this file except in compliance with the License. 6b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio * You may obtain a copy of the License at 7b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio * 8b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio * http://www.apache.org/licenses/LICENSE-2.0 9b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio * 10b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio * Unless required by applicable law or agreed to in writing, software 11b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio * distributed under the License is distributed on an "AS IS" BASIS, 12b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio * See the License for the specific language governing permissions and 14b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio * limitations under the License. 15b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio */ 16b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 17b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Megliopackage android.support.v4.text; 18b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 19b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglioimport android.test.AndroidTestCase; 20b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 21b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglioimport java.util.Locale; 22b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 23ecb514d2c0de2256be6fc466665197f35fadc5f9Scott Main/** @hide */ 24b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Megliopublic class BidiFormatterTest extends AndroidTestCase { 25b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 26b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio private static final BidiFormatter LTR_FMT = BidiFormatter.getInstance(false /* LTR context */); 27b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio private static final BidiFormatter RTL_FMT = BidiFormatter.getInstance(true /* RTL context */); 28b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 29b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio private static final BidiFormatter LTR_FMT_EXIT_RESET = 30b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio new BidiFormatter.Builder(false /* LTR context */).stereoReset(false).build(); 31b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio private static final BidiFormatter RTL_FMT_EXIT_RESET = 32b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio new BidiFormatter.Builder(true /* RTL context */).stereoReset(false).build(); 33b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 34b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio private static final String EN = "abba"; 35b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio private static final String HE = "\u05e0\u05e1"; 36b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 37b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio private static final String LRM = "\u200E"; 38b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio private static final String RLM = "\u200F"; 39b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio private static final String LRE = "\u202A"; 40b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio private static final String RLE = "\u202B"; 41b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio private static final String PDF = "\u202C"; 42b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 43b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio public void testIsRtlContext() { 44b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals(false, LTR_FMT.isRtlContext()); 45b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals(true, RTL_FMT.isRtlContext()); 46b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 47b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals(false, BidiFormatter.getInstance(Locale.ENGLISH).isRtlContext()); 48b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals(true, BidiFormatter.getInstance(true).isRtlContext()); 49b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio } 50b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 51b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio public void testBuilderIsRtlContext() { 52b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals(false, new BidiFormatter.Builder(false).build().isRtlContext()); 53b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals(true, new BidiFormatter.Builder(true).build().isRtlContext()); 54b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio } 55b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 56b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio public void testIsRtl() { 57b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals(true, BidiFormatter.getInstance(true).isRtl(HE)); 58b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals(true, BidiFormatter.getInstance(false).isRtl(HE)); 59b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 60b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals(false, BidiFormatter.getInstance(true).isRtl(EN)); 61b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals(false, BidiFormatter.getInstance(false).isRtl(EN)); 62b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio } 63b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 64b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio public void testUnicodeWrap() { 65b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio // Uniform directionality in opposite context. 66b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("uniform dir opposite to LTR context", 67b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RLE + "." + HE + "." + PDF + LRM, 68b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT_EXIT_RESET.unicodeWrap("." + HE + ".")); 69b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("uniform dir opposite to LTR context, stereo reset", 70b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LRM + RLE + "." + HE + "." + PDF + LRM, 71b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT.unicodeWrap("." + HE + ".")); 72b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("uniform dir opposite to LTR context, stereo reset, no isolation", 73b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RLE + "." + HE + "." + PDF, 74b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT.unicodeWrap("." + HE + ".", false)); 75b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("neutral treated as opposite to LTR context", 76b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RLE + "." + PDF + LRM, 77b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT_EXIT_RESET.unicodeWrap(".", TextDirectionHeuristicsCompat.RTL)); 78b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("uniform dir opposite to RTL context", 79b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LRE + "." + EN + "." + PDF + RLM, 80b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT_EXIT_RESET.unicodeWrap("." + EN + ".")); 81b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("uniform dir opposite to RTL context, stereo reset", 82b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RLM + LRE + "." + EN + "." + PDF + RLM, 83b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT.unicodeWrap("." + EN + ".")); 84b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("uniform dir opposite to RTL context, stereo reset, no isolation", 85b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LRE + "." + EN + "." + PDF, 86b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT.unicodeWrap("." + EN + ".", false)); 87b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("neutral treated as opposite to RTL context", 88b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LRE + "." + PDF + RLM, 89b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT_EXIT_RESET.unicodeWrap(".", TextDirectionHeuristicsCompat.LTR)); 90b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 91b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio // We test mixed-directionality cases only with an explicit overall directionality parameter 92b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio // because the estimation logic is outside the sphere of BidiFormatter, and different 93b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio // estimators will treat them differently. 94b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 95b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio // Overall directionality matching context, but with opposite exit directionality. 96b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("exit dir opposite to LTR context", 97b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio EN + HE + LRM, 98b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT_EXIT_RESET.unicodeWrap(EN + HE, TextDirectionHeuristicsCompat.LTR)); 99b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("exit dir opposite to LTR context, stereo reset", 100b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio EN + HE + LRM, 101b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT.unicodeWrap(EN + HE, TextDirectionHeuristicsCompat.LTR)); 102b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("exit dir opposite to LTR context, stereo reset, no isolation", 103b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio EN + HE, 104b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT.unicodeWrap(EN + HE, TextDirectionHeuristicsCompat.LTR, false)); 105b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 106b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("exit dir opposite to RTL context", 107b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio HE + EN + RLM, 108b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT_EXIT_RESET.unicodeWrap(HE + EN, TextDirectionHeuristicsCompat.RTL)); 109b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("exit dir opposite to RTL context, stereo reset", 110b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio HE + EN + RLM, 111b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT.unicodeWrap(HE + EN, TextDirectionHeuristicsCompat.RTL)); 112b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("exit dir opposite to RTL context, stereo reset, no isolation", 113b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio HE + EN, 114b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT.unicodeWrap(HE + EN, TextDirectionHeuristicsCompat.RTL, false)); 115b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 116b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio // Overall directionality matching context, but with opposite entry directionality. 117b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("entry dir opposite to LTR context", 118b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio HE + EN, 119b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT_EXIT_RESET.unicodeWrap(HE + EN, TextDirectionHeuristicsCompat.LTR)); 120b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("entry dir opposite to LTR context, stereo reset", 121b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LRM + HE + EN, 122b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT.unicodeWrap(HE + EN, TextDirectionHeuristicsCompat.LTR)); 123b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("entry dir opposite to LTR context, stereo reset, no isolation", 124b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio HE + EN, 125b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT.unicodeWrap(HE + EN, TextDirectionHeuristicsCompat.LTR, false)); 126b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 127b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("entry dir opposite to RTL context", 128b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio EN + HE, 129b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT_EXIT_RESET.unicodeWrap(EN + HE, TextDirectionHeuristicsCompat.RTL)); 130b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("entry dir opposite to RTL context, stereo reset", 131b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RLM + EN + HE, 132b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT.unicodeWrap(EN + HE, TextDirectionHeuristicsCompat.RTL)); 133b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("entry dir opposite to RTL context, stereo reset, no isolation", 134b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio EN + HE, 135b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT.unicodeWrap(EN + HE, TextDirectionHeuristicsCompat.RTL, false)); 136b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 137b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio // Overall directionality matching context, but with opposite entry and exit directionality. 138b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("entry and exit dir opposite to LTR context", 139b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio HE + EN + HE + LRM, 140b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT_EXIT_RESET.unicodeWrap(HE + EN + HE, TextDirectionHeuristicsCompat.LTR)); 141b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("entry and exit dir opposite to LTR context, stereo reset", 142b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LRM + HE + EN + HE + LRM, 143b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT.unicodeWrap(HE + EN + HE, TextDirectionHeuristicsCompat.LTR)); 144b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("entry and exit dir opposite to LTR context, no isolation", 145b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio HE + EN + HE, 146b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT_EXIT_RESET.unicodeWrap(HE + EN + HE, TextDirectionHeuristicsCompat.LTR, false)); 147b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 148b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("entry and exit dir opposite to RTL context", 149b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio EN + HE + EN + RLM, 150b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT_EXIT_RESET.unicodeWrap(EN + HE + EN, TextDirectionHeuristicsCompat.RTL)); 151b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("entry and exit dir opposite to RTL context, no isolation", 152b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio EN + HE + EN, 153b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT_EXIT_RESET.unicodeWrap(EN + HE + EN, TextDirectionHeuristicsCompat.RTL, false)); 154b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 155b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio // Entry and exit directionality matching context, but with opposite overall directionality. 156b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("overall dir (but not entry or exit dir) opposite to LTR context", 157b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RLE + EN + HE + EN + PDF + LRM, 158b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT_EXIT_RESET.unicodeWrap(EN + HE + EN, TextDirectionHeuristicsCompat.RTL)); 159b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("overall dir (but not entry or exit dir) opposite to LTR context, stereo reset", 160b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LRM + RLE + EN + HE + EN + PDF + LRM, 161b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT.unicodeWrap(EN + HE + EN, TextDirectionHeuristicsCompat.RTL)); 162b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("overall dir (but not entry or exit dir) opposite to LTR context, no isolation", 163b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RLE + EN + HE + EN + PDF, 164b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LTR_FMT_EXIT_RESET.unicodeWrap(EN + HE + EN, TextDirectionHeuristicsCompat.RTL, false)); 165b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio 166b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("overall dir (but not entry or exit dir) opposite to RTL context", 167b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LRE + HE + EN + HE + PDF + RLM, 168b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT_EXIT_RESET.unicodeWrap(HE + EN + HE, TextDirectionHeuristicsCompat.LTR)); 169b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("overall dir (but not entry or exit dir) opposite to RTL context, stereo reset", 170b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RLM + LRE + HE + EN + HE + PDF + RLM, 171b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT.unicodeWrap(HE + EN + HE, TextDirectionHeuristicsCompat.LTR)); 172b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio assertEquals("overall dir (but not entry or exit dir) opposite to RTL context, no isolation", 173b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio LRE + HE + EN + HE + PDF, 174b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio RTL_FMT_EXIT_RESET.unicodeWrap(HE + EN + HE, TextDirectionHeuristicsCompat.LTR, false)); 175b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio } 176b37703fef07bb1940fd9d933bb9cc5b6c3959cb2Fabrice Di Meglio} 177