]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/core/src/com/ibm/icu/dev/test/shaping/ArabicShapingRegTest.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / core / src / com / ibm / icu / dev / test / shaping / ArabicShapingRegTest.java
1 /*\r
2 *******************************************************************************\r
3 *   Copyright (C) 2001-2010, International Business Machines\r
4 *   Corporation and others.  All Rights Reserved.\r
5 *******************************************************************************\r
6 */\r
7 \r
8 package com.ibm.icu.dev.test.shaping;\r
9 \r
10 import java.util.MissingResourceException;\r
11 \r
12 import com.ibm.icu.dev.test.TestFmwk;\r
13 import com.ibm.icu.text.ArabicShaping;\r
14 import com.ibm.icu.text.ArabicShapingException;\r
15 \r
16 /**\r
17  * Regression test for Arabic shaping.\r
18  */\r
19 public class ArabicShapingRegTest extends TestFmwk {\r
20 \r
21     /* constants copied from ArabicShaping for convenience */\r
22 \r
23     public static final int LENGTH_GROW_SHRINK = 0;\r
24     public static final int LENGTH_FIXED_SPACES_NEAR = 1;\r
25     public static final int LENGTH_FIXED_SPACES_AT_END = 2;\r
26     public static final int LENGTH_FIXED_SPACES_AT_BEGINNING = 3;\r
27 \r
28     public static final int TEXT_DIRECTION_LOGICAL = 0;\r
29     public static final int TEXT_DIRECTION_VISUAL_LTR = 4;\r
30 \r
31     public static final int LETTERS_NOOP = 0;\r
32     public static final int LETTERS_SHAPE = 8;\r
33     public static final int LETTERS_SHAPE_TASHKEEL_ISOLATED = 0x18;\r
34     public static final int LETTERS_UNSHAPE = 0x10;\r
35 \r
36     public static final int DIGITS_NOOP = 0;\r
37     public static final int DIGITS_EN2AN = 0x20;\r
38     public static final int DIGITS_AN2EN = 0x40;\r
39     public static final int DIGITS_EN2AN_INIT_LR = 0x60;\r
40     public static final int DIGITS_EN2AN_INIT_AL = 0x80;\r
41 //    private static final int DIGITS_RESERVED = 0xa0;\r
42 \r
43     public static final int DIGIT_TYPE_AN = 0;\r
44     public static final int DIGIT_TYPE_AN_EXTENDED = 0x100;\r
45 \r
46     public static class TestData {\r
47         public int type;\r
48         public String source;\r
49         public int flags;\r
50         public String result;\r
51         public int length;\r
52         public Class error;\r
53 \r
54         public static final int STANDARD = 0;\r
55         public static final int PREFLIGHT = 1;\r
56         public static final int ERROR = 2;\r
57 \r
58         public static TestData standard(String source, int flags, String result) {\r
59             return new TestData(STANDARD, source, flags, result, 0, null);\r
60         }\r
61 \r
62         public static TestData preflight(String source, int flags, int length) {\r
63             return new TestData(PREFLIGHT, source, flags, null, length, null);\r
64         }\r
65 \r
66         public static TestData error(String source, int flags, Class error) {\r
67             return new TestData(ERROR, source, flags, null, 0, error);\r
68         }\r
69 \r
70         private TestData(int type, String source, int flags, String result, int length, Class error) {\r
71             this.type = type;\r
72             this.source = source;\r
73             this.flags = flags;\r
74             this.result = result;\r
75             this.length = length;\r
76             this.error = error;\r
77         }\r
78 \r
79         private static final String[] typenames = { "standard", "preflight", "error" };\r
80 \r
81         public String toString() {\r
82             StringBuffer buf = new StringBuffer(super.toString());\r
83             buf.append("[\n");\r
84             buf.append(typenames[type]);\r
85             buf.append(",\n");\r
86             if (source == null) {\r
87                 buf.append("null");\r
88             } else {\r
89                 buf.append('"');\r
90                 buf.append(escapedString(source));\r
91                 buf.append('"');\r
92             }\r
93             buf.append(",\n");\r
94             buf.append(Integer.toHexString(flags));\r
95             buf.append(",\n");\r
96             if (result == null) {\r
97                 buf.append("null");\r
98             } else {\r
99                 buf.append('"');\r
100                 buf.append(escapedString(result));\r
101                 buf.append('"');\r
102             }\r
103             buf.append(",\n");\r
104             buf.append(length);\r
105             buf.append(",\n");\r
106             buf.append(error);\r
107             buf.append(']');\r
108             return buf.toString();\r
109         }\r
110     }\r
111 \r
112     private static final String lamAlefSpecialVLTR =\r
113         "\u0020\u0646\u0622\u0644\u0627\u0020" +\r
114          "\u0646\u0623\u064E\u0644\u0627\u0020" +\r
115          "\u0646\u0627\u0670\u0644\u0627\u0020" +\r
116          "\u0646\u0622\u0653\u0644\u0627\u0020" +\r
117          "\u0646\u0625\u0655\u0644\u0627\u0020" +\r
118          "\u0646\u0622\u0654\u0644\u0627\u0020" +\r
119          "\uFEFC\u0639";\r
120 \r
121     private static final String tashkeelSpecialVLTR =\r
122         "\u064A\u0628\u0631\u0639\u0020" +\r
123         "\u064A\u0628\u0651\u0631\u064E\u0639\u0020" +\r
124         "\u064C\u064A\u0628\u0631\u064F\u0639\u0020" +\r
125         "\u0628\u0670\u0631\u0670\u0639\u0020" +\r
126         "\u0628\u0653\u0631\u0653\u0639\u0020" +\r
127         "\u0628\u0654\u0631\u0654\u0639\u0020" +\r
128         "\u0628\u0655\u0631\u0655\u0639\u0020";\r
129 \r
130     private static final String logicalUnshape =\r
131         "\u0020\u0020\u0020\uFE8D\uFEF5\u0020\uFEE5\u0020\uFE8D\uFEF7\u0020" +\r
132         "\uFED7\uFEFC\u0020\uFEE1\u0020\uFE8D\uFEDF\uFECC\uFEAE\uFE91\uFEF4" +\r
133         "\uFE94\u0020\uFE8D\uFEDF\uFEA4\uFEAE\uFE93\u0020\u0020\u0020\u0020";\r
134 \r
135     private static final String numSource =\r
136         "\u0031" +  /* en:1 */\r
137         "\u0627" +  /* arabic:alef */\r
138         "\u0032" +  /* en:2 */\r
139         "\u06f3" +  /* an:3 */\r
140         "\u0061" +  /* latin:a */\r
141         "\u0034";   /* en:4 */\r
142 \r
143     private static final TestData[] standardTests = {\r
144         /* lam alef special visual ltr */\r
145         TestData.standard(lamAlefSpecialVLTR,\r
146                           LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_NEAR,\r
147                           "\u0020\ufee5\u0020\ufef5\ufe8d\u0020" +\r
148                           "\ufee5\u0020\ufe76\ufef7\ufe8d\u0020" +\r
149                           "\ufee5\u0020\u0670\ufefb\ufe8d\u0020" +\r
150                           "\ufee5\u0020\u0653\ufef5\ufe8d\u0020" +\r
151                           "\ufee5\u0020\u0655\ufef9\ufe8d\u0020" +\r
152                           "\ufee5\u0020\u0654\ufef5\ufe8d\u0020" +\r
153                           "\ufefc\ufecb"),\r
154         TestData.standard(lamAlefSpecialVLTR,\r
155                           LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_AT_END,\r
156                           "\u0020\ufee5\ufef5\ufe8d\u0020\ufee5" +\r
157                           "\ufe76\ufef7\ufe8d\u0020\ufee5\u0670" +\r
158                           "\ufefb\ufe8d\u0020\ufee5\u0653\ufef5" +\r
159                           "\ufe8d\u0020\ufee5\u0655\ufef9\ufe8d" +\r
160                           "\u0020\ufee5\u0654\ufef5\ufe8d\u0020" +\r
161                           "\ufefc\ufecb\u0020\u0020\u0020\u0020" +\r
162                           "\u0020\u0020"),\r
163         TestData.standard(lamAlefSpecialVLTR,\r
164                           LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_AT_BEGINNING,\r
165                           "\u0020\u0020\u0020\u0020\u0020\u0020" +\r
166                           "\u0020\ufee5\ufef5\ufe8d\u0020\ufee5" +\r
167                           "\ufe76\ufef7\ufe8d\u0020\ufee5\u0670" +\r
168                           "\ufefb\ufe8d\u0020\ufee5\u0653\ufef5" +\r
169                           "\ufe8d\u0020\ufee5\u0655\ufef9\ufe8d" +\r
170                           "\u0020\ufee5\u0654\ufef5\ufe8d\u0020" +\r
171                           "\ufefc\ufecb"),\r
172         TestData.standard(lamAlefSpecialVLTR,\r
173                           LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_GROW_SHRINK,\r
174                           "\u0020\ufee5\ufef5\ufe8d\u0020\ufee5" +\r
175                           "\ufe76\ufef7\ufe8d\u0020\ufee5\u0670" +\r
176                           "\ufefb\ufe8d\u0020\ufee5\u0653\ufef5" +\r
177                           "\ufe8d\u0020\ufee5\u0655\ufef9\ufe8d" +\r
178                           "\u0020\ufee5\u0654\ufef5\ufe8d\u0020" +\r
179                           "\ufefc\ufecb"),\r
180 \r
181         /* TASHKEEL */\r
182         TestData.standard(lamAlefSpecialVLTR,\r
183                           LETTERS_SHAPE_TASHKEEL_ISOLATED | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_NEAR,\r
184                           "\u0020\ufee5\u0020\ufef5\ufe8d\u0020" +\r
185                           "\ufee5\u0020\ufe76\ufef7\ufe8d\u0020" +\r
186                           "\ufee5\u0020\u0670\ufefb\ufe8d\u0020" +\r
187                           "\ufee5\u0020\u0653\ufef5\ufe8d\u0020" +\r
188                           "\ufee5\u0020\u0655\ufef9\ufe8d\u0020" +\r
189                           "\ufee5\u0020\u0654\ufef5\ufe8d\u0020" +\r
190                           "\ufefc\ufecb"),\r
191         TestData.standard(lamAlefSpecialVLTR,\r
192                           LETTERS_SHAPE_TASHKEEL_ISOLATED | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_AT_END,\r
193                           "\u0020\ufee5\ufef5\ufe8d\u0020\ufee5" +\r
194                           "\ufe76\ufef7\ufe8d\u0020\ufee5\u0670" +\r
195                           "\ufefb\ufe8d\u0020\ufee5\u0653\ufef5" +\r
196                           "\ufe8d\u0020\ufee5\u0655\ufef9\ufe8d" +\r
197                           "\u0020\ufee5\u0654\ufef5\ufe8d\u0020" +\r
198                           "\ufefc\ufecb\u0020\u0020\u0020\u0020" +\r
199                           "\u0020\u0020"),\r
200         TestData.standard(lamAlefSpecialVLTR,\r
201                           LETTERS_SHAPE_TASHKEEL_ISOLATED | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_AT_BEGINNING,\r
202                           "\u0020\u0020\u0020\u0020\u0020\u0020" +\r
203                           "\u0020\ufee5\ufef5\ufe8d\u0020\ufee5" +\r
204                           "\ufe76\ufef7\ufe8d\u0020\ufee5\u0670" +\r
205                           "\ufefb\ufe8d\u0020\ufee5\u0653\ufef5" +\r
206                           "\ufe8d\u0020\ufee5\u0655\ufef9\ufe8d" +\r
207                           "\u0020\ufee5\u0654\ufef5\ufe8d\u0020" +\r
208                           "\ufefc\ufecb"),\r
209         TestData.standard(lamAlefSpecialVLTR,\r
210                           LETTERS_SHAPE_TASHKEEL_ISOLATED | TEXT_DIRECTION_VISUAL_LTR | LENGTH_GROW_SHRINK,\r
211                           "\u0020\ufee5\ufef5\ufe8d\u0020\ufee5" +\r
212                           "\ufe76\ufef7\ufe8d\u0020\ufee5\u0670" +\r
213                           "\ufefb\ufe8d\u0020\ufee5\u0653\ufef5" +\r
214                           "\ufe8d\u0020\ufee5\u0655\ufef9\ufe8d" +\r
215                           "\u0020\ufee5\u0654\ufef5\ufe8d\u0020" +\r
216                           "\ufefc\ufecb"),\r
217 \r
218         /* tashkeel special visual ltr */\r
219         TestData.standard(tashkeelSpecialVLTR,\r
220                           LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_NEAR,\r
221                           "\ufef2\ufe91\ufeae\ufecb\u0020" +\r
222                           "\ufef2\ufe91\ufe7c\ufeae\ufe77\ufecb\u0020" +\r
223                           "\ufe72\ufef2\ufe91\ufeae\ufe79\ufecb\u0020" +\r
224                           "\ufe8f\u0670\ufeae\u0670\ufecb\u0020" +\r
225                           "\ufe8f\u0653\ufeae\u0653\ufecb\u0020" +\r
226                           "\ufe8f\u0654\ufeae\u0654\ufecb\u0020" +\r
227                           "\ufe8f\u0655\ufeae\u0655\ufecb\u0020"),\r
228 \r
229         TestData.standard(tashkeelSpecialVLTR,\r
230                           LETTERS_SHAPE_TASHKEEL_ISOLATED | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_NEAR,\r
231                           "\ufef2\ufe91\ufeae\ufecb\u0020" +\r
232                           "\ufef2\ufe91\ufe7c\ufeae\ufe76\ufecb\u0020" +\r
233                           "\ufe72\ufef2\ufe91\ufeae\ufe78\ufecb\u0020" +\r
234                           "\ufe8f\u0670\ufeae\u0670\ufecb\u0020" +\r
235                           "\ufe8f\u0653\ufeae\u0653\ufecb\u0020" +\r
236                           "\ufe8f\u0654\ufeae\u0654\ufecb\u0020" +\r
237                           "\ufe8f\u0655\ufeae\u0655\ufecb\u0020"),\r
238 \r
239         /* logical unshape */\r
240         TestData.standard(logicalUnshape,\r
241                           LETTERS_UNSHAPE | TEXT_DIRECTION_LOGICAL | LENGTH_FIXED_SPACES_NEAR,\r
242                           "\u0020\u0020\u0020\u0627\u0644\u0622\u0646\u0020\u0627\u0644\u0623\u0642\u0644\u0627" +\r
243                           "\u0645\u0020\u0627\u0644\u0639\u0631\u0628\u064a\u0629\u0020\u0627\u0644\u062d\u0631" +\r
244                           "\u0629\u0020\u0020\u0020\u0020"),\r
245         TestData.standard(logicalUnshape,\r
246                           LETTERS_UNSHAPE | TEXT_DIRECTION_LOGICAL | LENGTH_FIXED_SPACES_AT_END,\r
247                           "\u0020\u0020\u0020\u0627\u0644\u0622\u0020\u0646\u0020\u0627\u0644\u0623\u0020\u0642" +\r
248                           "\u0644\u0627\u0020\u0645\u0020\u0627\u0644\u0639\u0631\u0628\u064a\u0629\u0020\u0627" +\r
249                           "\u0644\u062d\u0631\u0629\u0020"),\r
250         TestData.standard(logicalUnshape,\r
251                           LETTERS_UNSHAPE | TEXT_DIRECTION_LOGICAL | LENGTH_FIXED_SPACES_AT_BEGINNING,\r
252                           "\u0627\u0644\u0622\u0020\u0646\u0020\u0627\u0644\u0623\u0020\u0642\u0644\u0627\u0020" +\r
253                           "\u0645\u0020\u0627\u0644\u0639\u0631\u0628\u064a\u0629\u0020\u0627\u0644\u062d\u0631" +\r
254                           "\u0629\u0020\u0020\u0020\u0020"),\r
255         TestData.standard(logicalUnshape,\r
256                           LETTERS_UNSHAPE | TEXT_DIRECTION_LOGICAL | LENGTH_GROW_SHRINK,\r
257                           "\u0020\u0020\u0020\u0627\u0644\u0622\u0020\u0646\u0020\u0627\u0644\u0623\u0020\u0642" +\r
258                           "\u0644\u0627\u0020\u0645\u0020\u0627\u0644\u0639\u0631\u0628\u064a\u0629\u0020\u0627" +\r
259                           "\u0644\u062d\u0631\u0629\u0020\u0020\u0020\u0020"),\r
260 \r
261         /* numbers */\r
262         TestData.standard(numSource,\r
263                           DIGITS_EN2AN | DIGIT_TYPE_AN,\r
264                           "\u0661\u0627\u0662\u06f3\u0061\u0664"),\r
265         TestData.standard(numSource,\r
266                           DIGITS_AN2EN | DIGIT_TYPE_AN_EXTENDED,\r
267                           "\u0031\u0627\u0032\u0033\u0061\u0034"),\r
268         TestData.standard(numSource,\r
269                           DIGITS_EN2AN_INIT_LR | DIGIT_TYPE_AN,\r
270                           "\u0031\u0627\u0662\u06f3\u0061\u0034"),\r
271         TestData.standard(numSource,\r
272                           DIGITS_EN2AN_INIT_AL | DIGIT_TYPE_AN_EXTENDED,\r
273                           "\u06f1\u0627\u06f2\u06f3\u0061\u0034"),\r
274         TestData.standard(numSource,\r
275                           DIGITS_EN2AN_INIT_LR | DIGIT_TYPE_AN | TEXT_DIRECTION_VISUAL_LTR,\r
276                           "\u0661\u0627\u0032\u06f3\u0061\u0034"),\r
277         TestData.standard(numSource,\r
278                           DIGITS_EN2AN_INIT_AL | DIGIT_TYPE_AN_EXTENDED | TEXT_DIRECTION_VISUAL_LTR,\r
279                           "\u06f1\u0627\u0032\u06f3\u0061\u06f4"),\r
280 \r
281         /* no-op */\r
282         TestData.standard(numSource,\r
283                           0,\r
284                           numSource),\r
285     };\r
286 \r
287     private static final TestData[] preflightTests = {\r
288         /* preflight */\r
289         TestData.preflight("\u0644\u0627",\r
290                            LETTERS_SHAPE | LENGTH_GROW_SHRINK,\r
291                            1),\r
292 \r
293         TestData.preflight("\u0644\u0627\u0031",\r
294                            DIGITS_EN2AN | DIGIT_TYPE_AN_EXTENDED | LENGTH_GROW_SHRINK,\r
295                            3),\r
296 \r
297         TestData.preflight("\u0644\u0644",\r
298                            LETTERS_SHAPE | LENGTH_GROW_SHRINK,\r
299                            2),\r
300 \r
301         TestData.preflight("\ufef7",\r
302                            LETTERS_UNSHAPE | LENGTH_GROW_SHRINK,\r
303                            2),\r
304     };\r
305 \r
306     private static final TestData[] errorTests = {\r
307         /* bad data */\r
308         TestData.error("\u0020\ufef7\u0644\u0020",\r
309                        LETTERS_UNSHAPE | LENGTH_FIXED_SPACES_NEAR,\r
310                        ArabicShapingException.class),\r
311 \r
312         TestData.error("\u0020\ufef7",\r
313                        LETTERS_UNSHAPE | LENGTH_FIXED_SPACES_AT_END,\r
314                        ArabicShapingException.class),\r
315 \r
316         TestData.error("\ufef7\u0020",\r
317                        LETTERS_UNSHAPE | LENGTH_FIXED_SPACES_AT_BEGINNING,\r
318                        ArabicShapingException.class),\r
319 \r
320         /* bad options */\r
321         TestData.error("\ufef7",\r
322                        0xffffffff,\r
323                        IllegalArgumentException.class),\r
324 \r
325         TestData.error("\ufef7",\r
326                        LETTERS_UNSHAPE | LENGTH_GROW_SHRINK,\r
327                        ArabicShapingException.class),\r
328 \r
329         TestData.error(null,\r
330                        LETTERS_UNSHAPE | LENGTH_FIXED_SPACES_AT_END,\r
331                        IllegalArgumentException.class),\r
332     };\r
333 \r
334     public void TestStandard() {\r
335         for (int i = 0; i < standardTests.length; ++i) {\r
336             TestData test = standardTests[i];\r
337 \r
338             Exception ex = null;\r
339             String result = null;\r
340             ArabicShaping shaper = null;\r
341 \r
342             try {\r
343                 shaper = new ArabicShaping(test.flags);\r
344                 result = shaper.shape(test.source);\r
345             }\r
346             catch(MissingResourceException e){\r
347                 throw e;\r
348             }\r
349             catch (IllegalStateException ie){\r
350                 warnln("IllegalStateException: "+ie.toString());\r
351                 return;\r
352             }\r
353             catch (Exception e) {\r
354                 ex = e;\r
355             }\r
356 \r
357             if (!test.result.equals(result)) {\r
358                 reportTestFailure(i, test, shaper, result, ex);\r
359             }\r
360         }\r
361     }\r
362 \r
363     public void TestPreflight() {\r
364         for (int i = 0; i < preflightTests.length; ++i) {\r
365             TestData test = preflightTests[i];\r
366 \r
367             Exception ex = null;\r
368             char src[] = null;\r
369             int len = 0;\r
370             ArabicShaping shaper = null;\r
371 \r
372             if (test.source != null) {\r
373                 src = test.source.toCharArray();\r
374             }\r
375 \r
376             try {\r
377                 shaper = new ArabicShaping(test.flags);\r
378                 len = shaper.shape(src, 0, src.length, null, 0, 0);\r
379             }\r
380             catch (Exception e) {\r
381                 ex = e;\r
382             }\r
383 \r
384             if (test.length != len) {\r
385                 reportTestFailure(i, test, shaper, test.source, ex);\r
386             }\r
387         }\r
388     }\r
389 \r
390     public void TestError() {\r
391         for (int i = 0; i < errorTests.length; ++i) {\r
392             TestData test = errorTests[i];\r
393 \r
394             Exception ex = null;\r
395             char src[] = null;\r
396             int len = 0;\r
397             ArabicShaping shaper = null;\r
398 \r
399             if (test.source != null) {\r
400                 src = test.source.toCharArray();\r
401                 len = src.length;\r
402             }\r
403 \r
404             try {\r
405                 shaper = new ArabicShaping(test.flags);\r
406                 shaper.shape(src, 0, len);\r
407             }\r
408             catch (Exception e) {\r
409                 ex = e;\r
410             }\r
411 \r
412             if (!test.error.isInstance(ex)) {\r
413                 reportTestFailure(i, test, shaper, test.source, ex);\r
414             }\r
415         }\r
416     }\r
417 \r
418     public void TestEquals()\r
419     {\r
420         ArabicShaping as1 = new ArabicShaping(LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_NEAR);\r
421         ArabicShaping as2 = new ArabicShaping(LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_NEAR);\r
422         ArabicShaping as3 = new ArabicShaping(LETTERS_UNSHAPE | TEXT_DIRECTION_LOGICAL | LENGTH_FIXED_SPACES_AT_BEGINNING);\r
423 \r
424         if (! as1.equals(as1)) {\r
425             err("as1: " + as1 + " does not equal itself!\n");\r
426         }\r
427 \r
428         if (! as1.equals(as2)) {\r
429             err("as1: " + as1 + ", as2: " + as2 + " are not equal, but should be.\n");\r
430         }\r
431 \r
432         if (as1.equals(as3)) {\r
433             err("as1: " + as1 + ", as3: " + as3 + " are equal but should not be.\n");\r
434         }\r
435     }\r
436 \r
437     public void reportTestFailure(int index, TestData test, ArabicShaping shaper, String result, Exception error) {\r
438         if (noData() && error != null && error instanceof MissingResourceException ) {\r
439             warnln(error.getMessage());\r
440         }\r
441 \r
442         StringBuffer buf = new StringBuffer();\r
443         buf.append("*** test failure ***\n");\r
444         buf.append("index: " + index + "\n");\r
445         buf.append("test: " + test + "\n");\r
446         buf.append("shaper: " + shaper + "\n");\r
447         buf.append("result: " + escapedString(result) + "\n");\r
448         buf.append("error: " + error + "\n");\r
449 \r
450         if (result != null && test.result != null && !test.result.equals(result)) {\r
451             for (int i = 0; i < Math.max(test.result.length(), result.length()); ++i) {\r
452                 String temp = Integer.toString(i);\r
453                 if (temp.length() < 2) {\r
454                     temp = " ".concat(temp);\r
455                 }\r
456                 char trg = i < test.result.length() ? test.result.charAt(i) : '\uffff';\r
457                 char res = i < result.length() ? result.charAt(i) : '\uffff';\r
458 \r
459                 buf.append("[" + temp + "] ");\r
460                 buf.append(escapedString("" + trg) + " ");\r
461                 buf.append(escapedString("" + res) + " ");\r
462                 if (trg != res) {\r
463                     buf.append("***");\r
464                 }\r
465                 buf.append("\n");\r
466             }\r
467         }\r
468         err(buf.toString());\r
469     }\r
470 \r
471     private static String escapedString(String str) {\r
472         if (str == null) {\r
473             return null;\r
474         }\r
475 \r
476         StringBuffer buf = new StringBuffer(str.length() * 6);\r
477         for (int i = 0; i < str.length(); ++i) {\r
478             char ch = str.charAt(i);\r
479             buf.append("\\u");\r
480             if (ch < 0x1000) {\r
481                 buf.append('0');\r
482             }\r
483             if (ch < 0x0100) {\r
484                 buf.append('0');\r
485             }\r
486             if (ch < 0x0010) {\r
487                 buf.append('0');\r
488             }\r
489             buf.append(Integer.toHexString(ch));\r
490         }\r
491         return buf.toString();\r
492     }\r
493 \r
494     public static void main(String[] args) {\r
495         try {\r
496             new ArabicShapingRegTest().run(args);\r
497         }\r
498         catch (Exception e) {\r
499             System.out.println(e);\r
500         }\r
501     }\r
502     \r
503     /* Tests the method\r
504      *      public int shape(char[] source, int sourceStart, int sourceLength,\r
505      *      char[] dest, int destStart, int destSize) throws ArabicShapingException)\r
506      */\r
507     public void TestShape(){\r
508         // Tests when\r
509         //      if (sourceStart < 0 || sourceLength < 0 || sourceStart + sourceLength > source.length)\r
510         // Is true\r
511         ArabicShaping as = new ArabicShaping(0);\r
512         char[] source = {'d','u','m','m','y'};\r
513         char[] dest = {'d','u','m','m','y'};\r
514         int[] negNum = {-1,-2,-5,-10,-100};\r
515         \r
516         \r
517         for(int i=0; i<negNum.length; i++){\r
518             try{\r
519                 // Checks when "sourceStart < 0"\r
520                 as.shape(source, negNum[i], 0, dest, 0, 0);\r
521                 errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
522                         "suppose to return an exception when 'sourceStart < 0'.");\r
523             } catch(Exception e){}\r
524             \r
525             try{\r
526                 // Checks when "sourceLength < 0"\r
527                 as.shape(source, 0, negNum[i], dest, 0, 0);\r
528                 errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
529                         "suppose to return an exception when 'sourceLength < 0'.");\r
530             } catch(Exception e){}\r
531         }\r
532         \r
533         // Checks when "sourceStart + sourceLength > source.length"\r
534         try{\r
535             as.shape(source, 3, 3, dest, 0, 0);\r
536             errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
537                     "suppose to return an exception when 'sourceStart + sourceLength > source.length'.");\r
538         } catch(Exception e){}\r
539         try{\r
540             as.shape(source, 2, 4, dest, 0, 0);\r
541             errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
542                     "suppose to return an exception when 'sourceStart + sourceLength > source.length'.");\r
543         } catch(Exception e){}\r
544         try{\r
545             as.shape(source, 1, 5, dest, 0, 0);\r
546             errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
547                     "suppose to return an exception when 'sourceStart + sourceLength > source.length'.");\r
548         } catch(Exception e){}\r
549         try{\r
550             as.shape(source, 0, 6, dest, 0, 0);\r
551             errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
552                     "suppose to return an exception when 'sourceStart + sourceLength > source.length'.");\r
553         } catch(Exception e){}\r
554         \r
555         // Checks when "if (dest == null && destSize != 0)" is true\r
556         try{\r
557             as.shape(source, 2, 2, null, 0, 1);\r
558             errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
559                     "suppose to return an exception when 'dest == null && destSize != 0'.");\r
560         } catch(Exception e){}\r
561         \r
562         // Checks when\r
563         // if ((destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length))\r
564         for(int i=0; i<negNum.length; i++){\r
565             try{\r
566                 as.shape(source, 2, 2, dest, negNum[i], 1);\r
567                 errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
568                         "suppose to return an exception when " +\r
569                         "(destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length).");\r
570             } catch(Exception e){}\r
571             \r
572             try{\r
573                 as.shape(source, 2, 2, dest, 0, negNum[i]);\r
574                 errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
575                         "suppose to return an exception when " +\r
576                         "(destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length).");\r
577             } catch(Exception e){}\r
578         }\r
579         \r
580         // Checks when "destStart + destSize > dest.length"\r
581         try{\r
582             as.shape(source, 2, 2, dest, 3, 3);\r
583             errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
584                     "suppose to return an exception when " +\r
585                     "(destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length).");\r
586         } catch(Exception e){}\r
587         try{\r
588             as.shape(source, 2, 2, dest, 2, 4);\r
589             errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
590                     "suppose to return an exception when " +\r
591                     "(destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length).");\r
592         } catch(Exception e){}\r
593         try{\r
594             as.shape(source, 2, 2, dest, 1, 5);\r
595             errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
596                     "suppose to return an exception when " +\r
597                     "(destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length).");\r
598         } catch(Exception e){}\r
599         try{\r
600             as.shape(source, 2, 2, dest, 0, 6);\r
601             errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
602                     "suppose to return an exception when " +\r
603                     "(destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length).");\r
604         } catch(Exception e){}\r
605         \r
606         // Tests when "throw new IllegalArgumentException("Wrong Tashkeel argument")"\r
607         int[] invalid_Tashkeel = {-1000, -500, -100}; \r
608         for(int i=0; i < invalid_Tashkeel.length; i++){\r
609             ArabicShaping arabicShape = new ArabicShaping(invalid_Tashkeel[i]);\r
610             try {\r
611                 arabicShape.shape(source,0,0,dest,0,1);\r
612                 errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +\r
613                         "suppose to return an exception for 'Wrong Tashkeel argument' for " +\r
614                         "an option value of " + invalid_Tashkeel[i]);\r
615             } catch (Exception e) {}\r
616         }\r
617     }\r
618 }\r
619 \r