Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(169)

Side by Side Diff: tests/lib/i18n/bidi_utils_test.dart

Issue 10592011: Add BiDirectional Text formatting utilites to the i18n library. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5
6 #library('bidi_utils_test');
7
8 #import('../../../lib/i18n/bidi_utils.dart');
9 #import('../../../lib/unittest/unittest.dart');
10
11 /**
12 * Tests the bidi utilities library.
13 */
14 main() {
15 var LRE = '\u202A';
16 var RLE = '\u202B';
17 var PDF = '\u202C';
18 var LRM = '\u200E';
19 var RLM = '\u200F';
20
21 test('isRtlLang', () {
22 expect(BidiUtils.isRtlLanguage('en'), isFalse);
23 expect(BidiUtils.isRtlLanguage('fr'), isFalse);
24 expect(BidiUtils.isRtlLanguage('zh-CN'), isFalse);
25 expect(BidiUtils.isRtlLanguage('fil'), isFalse);
26 expect(BidiUtils.isRtlLanguage('az'), isFalse);
27 expect(BidiUtils.isRtlLanguage('iw-Latn'), isFalse);
28 expect(BidiUtils.isRtlLanguage('iw-LATN'), isFalse);
29 expect(BidiUtils.isRtlLanguage('iw_latn'), isFalse);
30 expect(BidiUtils.isRtlLanguage('ar'), isTrue);
31 expect(BidiUtils.isRtlLanguage('AR'), isTrue);
32 expect(BidiUtils.isRtlLanguage('iw'), isTrue);
33 expect(BidiUtils.isRtlLanguage('he'), isTrue);
34 expect(BidiUtils.isRtlLanguage('fa'), isTrue);
35 expect(BidiUtils.isRtlLanguage('ar-EG'), isTrue);
36 expect(BidiUtils.isRtlLanguage('az-Arab'), isTrue);
37 expect(BidiUtils.isRtlLanguage('az-ARAB-IR'), isTrue);
38 expect(BidiUtils.isRtlLanguage('az_arab_IR'), isTrue);
39 });
40
41 test('hasAnyLtr', () {
42 expect(BidiUtils.hasAnyLtr(''), isFalse);
43 expect(BidiUtils.hasAnyLtr('\u05e0\u05e1\u05e2'), isFalse);
44 expect(BidiUtils.hasAnyLtr('\u05e0\u05e1z\u05e2'), isTrue);
45 expect(BidiUtils.hasAnyLtr('123\t... \n'), isFalse);
46 expect(BidiUtils.hasAnyLtr('<br>123&lt;', false), isTrue);
47 expect(BidiUtils.hasAnyLtr('<br>123&lt;', true), isFalse);
48 });
49
50 test('hasAnyRtl', () {
51 expect(BidiUtils.hasAnyRtl(''), isFalse);
52 expect(BidiUtils.hasAnyRtl('abc'), isFalse);
53 expect(BidiUtils.hasAnyRtl('ab\u05e0c'), isTrue);
54 expect(BidiUtils.hasAnyRtl('123\t... \n'), isFalse);
55 expect(BidiUtils.hasAnyRtl('<input value=\u05e0>123', false), isTrue);
56 expect(BidiUtils.hasAnyRtl('<input value=\u05e0>123', true), isFalse);
57 });
58
59
60 test('endsWithLtr', () {
61 expect(BidiUtils.endsWithLtr('a'), isTrue);
62 expect(BidiUtils.endsWithLtr('abc'), isTrue);
63 expect(BidiUtils.endsWithLtr('a (!)'), isTrue);
64 expect(BidiUtils.endsWithLtr('a.1'), isTrue);
65 expect(BidiUtils.endsWithLtr('http://www.google.com '), isTrue);
66 expect(BidiUtils.endsWithLtr('\u05e0a'), isTrue);
67 expect(BidiUtils.endsWithLtr(' \u05e0\u05e1a\u05e2\u05e3 a (!)'), isTrue);
68 expect(BidiUtils.endsWithLtr(''), isFalse);
69 expect(BidiUtils.endsWithLtr(' '), isFalse);
70 expect(BidiUtils.endsWithLtr('1'), isFalse);
71 expect(BidiUtils.endsWithLtr('\u05e0'), isFalse);
72 expect(BidiUtils.endsWithLtr('\u05e0 1(!)'), isFalse);
73 expect(BidiUtils.endsWithLtr('a\u05e0'), isFalse);
74 expect(BidiUtils.endsWithLtr('a abc\u05e0\u05e1def\u05e2. 1'), isFalse);
75 expect(BidiUtils.endsWithLtr(' \u05e0\u05e1a\u05e2 &lt;', true), isFalse);
76 expect(BidiUtils.endsWithLtr(' \u05e0\u05e1a\u05e2 &lt;', false), isTrue);
77 });
78
79 test('endsWithRtl', () {
80 expect(BidiUtils.endsWithRtl('\u05e0'), isTrue);
81 expect(BidiUtils.endsWithRtl('\u05e0\u05e1\u05e2'), isTrue);
82 expect(BidiUtils.endsWithRtl('\u05e0 (!)'), isTrue);
83 expect(BidiUtils.endsWithRtl('\u05e0.1'), isTrue);
84 expect(BidiUtils.endsWithRtl('http://www.google.com/\u05e0 '), isTrue);
85 expect(BidiUtils.endsWithRtl('a\u05e0'), isTrue);
86 expect(BidiUtils.endsWithRtl(' a abc\u05e0def\u05e3. 1'), isTrue);
87 expect(BidiUtils.endsWithRtl(''), isFalse);
88 expect(BidiUtils.endsWithRtl(' '), isFalse);
89 expect(BidiUtils.endsWithRtl('1'), isFalse);
90 expect(BidiUtils.endsWithRtl('a'), isFalse);
91 expect(BidiUtils.endsWithRtl('a 1(!)'), isFalse);
92 expect(BidiUtils.endsWithRtl('\u05e0a'), isFalse);
93 expect(BidiUtils.endsWithRtl('\u05e0 \u05e0\u05e1ab\u05e2 a (!)'), isFalse);
94 expect(BidiUtils.endsWithRtl(' \u05e0\u05e1a\u05e2 &lt;', true), isTrue);
95 expect(BidiUtils.endsWithRtl(' \u05e0\u05e1a\u05e2 &lt;', false), isFalse);
96 });
97
98 test('guardBracketInHtml', () {
99 var strWithRtl = "asc \u05d0 (\u05d0\u05d0\u05d0)";
100 expect(BidiUtils.guardBracketInHtml(strWithRtl),
101 equals("asc \u05d0 <span dir=rtl>(\u05d0\u05d0\u05d0)</span>"));
102 expect(BidiUtils.guardBracketInHtml(strWithRtl, true),
103 equals("asc \u05d0 <span dir=rtl>(\u05d0\u05d0\u05d0)</span>"));
104 expect(BidiUtils.guardBracketInHtml(strWithRtl, false),
105 equals("asc \u05d0 <span dir=ltr>(\u05d0\u05d0\u05d0)</span>"));
106
107 var strWithRtl2 = "\u05d0 a (asc:))";
108 expect(BidiUtils.guardBracketInHtml(strWithRtl2),
109 equals("\u05d0 a <span dir=rtl>(asc:))</span>"));
110 expect(BidiUtils.guardBracketInHtml(strWithRtl2, true),
111 equals("\u05d0 a <span dir=rtl>(asc:))</span>"));
112 expect(BidiUtils.guardBracketInHtml(strWithRtl2, false),
113 equals("\u05d0 a <span dir=ltr>(asc:))</span>"));
114
115 var strWithoutRtl = "a (asc) {{123}}";
116 expect(BidiUtils.guardBracketInHtml(strWithoutRtl),
117 equals("a <span dir=ltr>(asc)</span> <span dir=ltr>{{123}}</span>"));
118 expect(BidiUtils.guardBracketInHtml(strWithoutRtl, true),
119 equals("a <span dir=rtl>(asc)</span> <span dir=rtl>{{123}}</span>"));
120 expect(BidiUtils.guardBracketInHtml(strWithoutRtl, false),
121 equals("a <span dir=ltr>(asc)</span> <span dir=ltr>{{123}}</span>"));
122
123 });
124
125 test('guardBracketInText', () {
126 var strWithRtl = "asc \u05d0 (\u05d0\u05d0\u05d0)";
127 expect(BidiUtils.guardBracketInText(strWithRtl),
128 equals("asc \u05d0 \u200f(\u05d0\u05d0\u05d0)\u200f"));
129 expect(BidiUtils.guardBracketInText(strWithRtl, true),
130 equals("asc \u05d0 \u200f(\u05d0\u05d0\u05d0)\u200f"));
131 expect(BidiUtils.guardBracketInText(strWithRtl, false),
132 equals("asc \u05d0 \u200e(\u05d0\u05d0\u05d0)\u200e"));
133
134 var strWithRtl2 = "\u05d0 a (asc:))";
135 expect(BidiUtils.guardBracketInText(strWithRtl2),
136 equals("\u05d0 a \u200f(asc:))\u200f"));
137 expect(BidiUtils.guardBracketInText(strWithRtl2, true),
138 equals("\u05d0 a \u200f(asc:))\u200f"));
139 expect(BidiUtils.guardBracketInText(strWithRtl2, false),
140 equals("\u05d0 a \u200e(asc:))\u200e"));
141
142 var strWithoutRtl = "a (asc) {{123}}";
143 expect(BidiUtils.guardBracketInText(strWithoutRtl),
144 equals("a \u200e(asc)\u200e \u200e{{123}}\u200e"));
145 expect(BidiUtils.guardBracketInText(strWithoutRtl, true),
146 equals("a \u200f(asc)\u200f \u200f{{123}}\u200f"));
147 expect(BidiUtils.guardBracketInText(strWithoutRtl, false),
148 equals("a \u200e(asc)\u200e \u200e{{123}}\u200e"));
149
150 });
151
152 test('enforceRtlInHtml', () {
153 var str = '<div> first <br> second </div>';
154 expect(BidiUtils.enforceRtlInHtml(str),
155 equals('<div dir=rtl> first <br> second </div>'));
156 str = 'first second';
157 expect(BidiUtils.enforceRtlInHtml(str),
158 equals('\n<span dir=rtl>first second</span>'));
159 });
160
161 test('enforceRtlInText', () {
162 var str = 'first second';
163 expect(BidiUtils.enforceRtlInText(str), equals('${RLE}first second$PDF'));
164 });
165
166 test('enforceLtrInHtml', () {
167 var str = '<div> first <br> second </div>';
168 expect(BidiUtils.enforceLtrInHtml(str),
169 equals('<div dir=ltr> first <br> second </div>'));
170 str = 'first second';
171 expect(BidiUtils.enforceLtrInHtml(str),
172 equals('\n<span dir=ltr>first second</span>'));
173 });
174
175 test('enforceLtrInText', () {
176 var str = 'first second';
177 expect(BidiUtils.enforceLtrInText(str), equals('${LRE}first second$PDF'));
178 });
179
180 test('normalizeHebrewQuote', () {
181 expect(BidiUtils.normalizeHebrewQuote('\u05d0"'), equals('\u05d0\u05f4'));
182 expect(BidiUtils.normalizeHebrewQuote('\u05d0\''), equals('\u05d0\u05f3'));
183 expect(BidiUtils.normalizeHebrewQuote('\u05d0"\u05d0\''),
184 equals('\u05d0\u05f4\u05d0\u05f3'));
185 });
186
187 test('mirrorCSS', () {
188 var str = 'left:10px;right:20px';
189 expect(BidiUtils.mirrorCSS(str), equals('right:10px;left:20px'));
190 str = 'border:10px 20px 30px 40px';
191 expect(BidiUtils.mirrorCSS(str), equals('border:10px 40px 30px 20px'));
192 });
193
194 test('estimateDirection', () {
195 expect(BidiUtils.estimateDirection('', false).value,
196 equals(TextDirection.UNKNOWN.value));
197 expect(BidiUtils.estimateDirection(' ', false).value,
198 equals(TextDirection.UNKNOWN.value));
199 expect(BidiUtils.estimateDirection('! (...)', false).value,
200 equals(TextDirection.UNKNOWN.value));
201 expect(BidiUtils.estimateDirection('All-Ascii content', false).value,
202 equals(TextDirection.LTR.value));
203 expect(BidiUtils.estimateDirection('-17.0%', false).value,
204 equals(TextDirection.LTR.value));
205 expect(BidiUtils.estimateDirection('http://foo/bar/', false).value,
206 equals(TextDirection.LTR.value));
207 expect(BidiUtils.estimateDirection(
208 'http://foo/bar/?s=\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0'
209 '\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0'
210 '\u05d0\u05d0\u05d0\u05d0\u05d0').value,
211 equals(TextDirection.LTR.value));
212 expect(BidiUtils.estimateDirection('\u05d0', false).value,
213 equals(TextDirection.RTL.value));
214 expect(BidiUtils.estimateDirection(
215 '9 \u05d0 -> 17.5, 23, 45, 19', false).value,
216 equals(TextDirection.RTL.value));
217 expect(BidiUtils.estimateDirection(
218 'http://foo/bar/ \u05d0 http://foo2/bar2/ http://foo3/bar3/').value,
219 equals(TextDirection.RTL.value));
220 expect(BidiUtils.estimateDirection(
221 '\u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc\u05e8\u05d0'
222 '\u05d5\u05ea: \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea\u05d9 \u05d4'
223 '\u05e8\u05d1\u05d4 \u05d5\u05d2\u05dd \u05d0\u05dd \u05d4\u05d9\u05d9'
224 '\u05ea\u05d9 \u05de\u05e6\u05dc\u05dd, \u05d4\u05d9\u05d4 \u05e9'
225 '\u05dd').value,
226 equals(TextDirection.RTL.value));
227 expect(BidiUtils.estimateDirection(
228 '\u05db\u05d0 - http://geek.co.il/gallery/v/2007-06 - \u05d0\u05d9'
229 '\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc\u05e8\u05d0\u05d5\u05ea:'
230 ' \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea\u05d9 \u05d4\u05e8\u05d1 '
231 '\u05d5\u05d2\u05dd \u05d0\u05dd \u05d4\u05d9\u05d9\u05d9 \u05de\u05e6'
232 '\u05dc\u05dd, \u05d4\u05d9\u05d4 \u05e9\u05dd \u05d1\u05e2\u05d9\u05e7'
233 ' \u05d4\u05e8\u05d1\u05d4 \u05d0\u05e0\u05e9\u05d9\u05dd. \u05de\u05d4'
234 ' \u05e9\u05db\u05df - \u05d0\u05e4\u05e9\u05e8 \u05dc\u05e0\u05e6'
235 '\u05dc \u05d0\u05ea \u05d4\u05d4 \u05d3\u05d6\u05de\u05e0\u05d5 '
236 '\u05dc\u05d4\u05e1\u05ea\u05db\u05dc \u05e2\u05dc \u05db\u05de\u05d4 '
237 '\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05de\u05e9\u05e9\u05e2\u05d5'
238 '\u05ea \u05d9\u05e9\u05e0\u05d5 \u05d9\u05d5\u05ea\u05e8 \u05e9\u05d9'
239 '\u05e9 \u05dc\u05d9 \u05d1\u05d0\u05ea\u05e8', false).value,
240 equals(TextDirection.RTL.value));
241 expect(BidiUtils.estimateDirection(
242 'CAPTCHA \u05de\u05e9\u05d5\u05db\u05dc\u05dc '
243 '\u05de\u05d3\u05d9?').value,
244 equals(TextDirection.RTL.value));
245 expect(BidiUtils.estimateDirection(
246 'Yes Prime Minister \u05e2\u05d3\u05db\u05d5\u05df. \u05e9\u05d0\u05dc'
247 '\u05d5 \u05d0\u05d5\u05ea\u05d9 \u05de\u05d4 \u05d0\u05e0\u05d9 '
248 '\u05e8\u05d5\u05e6\u05d4 \u05de\u05ea\u05e0\u05d4 \u05dc\u05d7'
249 '\u05d2').value,
250 equals(TextDirection.RTL.value));
251 expect(BidiUtils.estimateDirection(
252 '17.4.02 \u05e9\u05e2\u05d4:13-20 .15-00 .\u05dc\u05d0 \u05d4\u05d9'
253 '\u05d9\u05ea\u05d9 \u05db\u05d0\u05df.').value,
254 equals(TextDirection.RTL.value));
255 expect(BidiUtils.estimateDirection(
256 '5710 5720 5730. \u05d4\u05d3\u05dc\u05ea. \u05d4\u05e0\u05e9\u05d9'
257 '\u05e7\u05d4', false).value,
258 equals(TextDirection.RTL.value));
259 expect(BidiUtils.estimateDirection(
260 '\u05d4\u05d3\u05dc\u05ea http://www.google.com '
261 'http://www.gmail.com').value,
262 equals(TextDirection.RTL.value));
263 expect(BidiUtils.estimateDirection(
264 '\u05d4\u05d3\u05dc <some quite nasty html mark up>').value,
265 equals(TextDirection.LTR.value));
266 expect(BidiUtils.estimateDirection(
267 '\u05d4\u05d3\u05dc <some quite nasty html mark up>').value,
268 equals(TextDirection.LTR.value));
269 expect(BidiUtils.estimateDirection(
270 '\u05d4\u05d3\u05dc\u05ea &amp; &lt; &gt;').value,
271 equals(TextDirection.LTR.value));
272 expect(BidiUtils.estimateDirection(
273 '\u05d4\u05d3\u05dc\u05ea &amp; &lt; &gt;', true).value,
274 equals(TextDirection.RTL.value));
275 });
276
277 test('detectRtlDirectionality', () {
278 var bidiText = [];
279 var item = new SampleItem('Pure Ascii content');
280 bidiText.add(item);
281
282 item = new SampleItem('\u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4'
283 ' \u05dc\u05e8\u05d0\u05d5\u05ea: \u05dc\u05d0 \u05e6\u05d9\u05dc'
284 '\u05de\u05ea\u05d9 \u05d4\u05e8\u05d1\u05d4 \u05d5\u05d2\u05dd '
285 '\u05d0\u05dd \u05d4\u05d9\u05d9\u05ea\u05d9 \u05de\u05e6\u05dc\u05dd, '
286 '\u05d4\u05d9\u05d4 \u05e9\u05dd', true);
287 bidiText.add(item);
288
289 item = new SampleItem('\u05db\u05d0\u05df - http://geek.co.il/gallery/v/'
290 '2007-06 - \u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc'
291 '\u05e8\u05d0\u05d5\u05ea: \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea'
292 '\u05d9 \u05d4\u05e8\u05d1\u05d4 \u05d5\u05d2\u05dd \u05d0\u05dd \u05d4'
293 '\u05d9\u05d9\u05ea\u05d9 \u05de\u05e6\u05dc\u05dd, \u05d4\u05d9\u05d4 '
294 '\u05e9\u05dd \u05d1\u05e2\u05d9\u05e7\u05e8 \u05d4\u05e8\u05d1\u05d4 '
295 '\u05d0\u05e0\u05e9\u05d9\u05dd. \u05de\u05d4 \u05e9\u05db\u05df - '
296 '\u05d0\u05e4\u05e9\u05e8 \u05dc\u05e0\u05e6\u05dc \u05d0\u05ea \u05d4'
297 '\u05d4\u05d3\u05d6\u05de\u05e0\u05d5\u05ea \u05dc\u05d4\u05e1\u05ea'
298 '\u05db\u05dc \u05e2\u05dc \u05db\u05de\u05d4 \u05ea\u05de\u05d5\u05e0'
299 '\u05d5\u05ea \u05de\u05e9\u05e2\u05e9\u05e2\u05d5\u05ea \u05d9\u05e9'
300 '\u05e0\u05d5\u05ea \u05d9\u05d5\u05ea\u05e8 \u05e9\u05d9\u05e9 \u05dc'
301 '\u05d9 \u05d1\u05d0\u05ea\u05e8', true);
302 bidiText.add(item);
303
304 item = new SampleItem('CAPTCHA \u05de\u05e9\u05d5\u05db\u05dc\u05dc '
305 '\u05de\u05d3\u05d9?', true);
306 bidiText.add(item);
307
308
309 item = new SampleItem('Yes Prime Minister \u05e2\u05d3\u05db\u05d5\u05df. '
310 '\u05e9\u05d0\u05dc\u05d5 \u05d0\u05d5\u05ea\u05d9 \u05de\u05d4 \u05d0'
311 '\u05e0\u05d9 \u05e8\u05d5\u05e6\u05d4 \u05de\u05ea\u05e0\u05d4 '
312 '\u05dc\u05d7\u05d2', true);
313 bidiText.add(item);
314
315 item = new SampleItem('17.4.02 \u05e9\u05e2\u05d4:13-20 .15-00 .\u05dc'
316 '\u05d0 \u05d4\u05d9\u05d9\u05ea\u05d9 \u05db\u05d0\u05df.', true);
317 bidiText.add(item);
318
319 item = new SampleItem('5710 5720 5730. \u05d4\u05d3\u05dc\u05ea. \u05d4'
320 '\u05e0\u05e9\u05d9\u05e7\u05d4', true);
321 bidiText.add(item);
322
323 item = new SampleItem('\u05d4\u05d3\u05dc\u05ea http://www.google.com '
324 'http://www.gmail.com', true);
325 bidiText.add(item);
326
327 item = new SampleItem('&gt;\u05d4&lt;', true, true);
328 bidiText.add(item);
329
330 item = new SampleItem('&gt;\u05d4&lt;', false);
331 bidiText.add(item);
332
333 for (var i = 0; i < bidiText.length; i++) {
334 var isRtlDir = BidiUtils.detectRtlDirectionality(bidiText[i].text,
335 bidiText[i].isHtml);
336 if (isRtlDir != bidiText[i].isRtl) {
337 var str = '"${bidiText[i].text} " should be '
338 '${bidiText[i].isRtl ? "rtl" : "ltr"} but detected as '
339 '${isRtlDir ? "rtl" : "ltr"}';
340 //alert(str);
341 }
342 expect(bidiText[i].isRtl, isRtlDir);
343 }
344 });
345 }
346
347 class SampleItem {
348 String text;
349 bool isRtl;
350 bool isHtml;
351 SampleItem([someText='', someIsRtl=false, isHtml=false]) :
352 this.text=someText, this.isRtl=someIsRtl, this.isHtml=isHtml;
353 }
OLDNEW
« lib/i18n/bidi_utils.dart ('K') | « tests/lib/i18n/bidi_format_test.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698