]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-52_1/main/tests/collate/src/com/ibm/icu/dev/test/collator/CollationThreadTest.java
Added flags.
[Dictionary.git] / jars / icu4j-52_1 / main / tests / collate / src / com / ibm / icu / dev / test / collator / CollationThreadTest.java
1 /*
2  *******************************************************************************
3  * Copyright (C) 2007-2011, International Business Machines Corporation and    *
4  * others. All Rights Reserved.                                                *
5  *******************************************************************************
6  */
7
8 package com.ibm.icu.dev.test.collator;
9
10 import java.util.Arrays;
11 import java.util.Locale;
12 import java.util.Random;
13
14 import com.ibm.icu.dev.test.TestFmwk;
15 import com.ibm.icu.text.Collator;
16
17 public class CollationThreadTest extends TestFmwk {
18     public static void main(String[] args) throws Exception {
19         new CollationThreadTest().run(args);
20     }
21
22     private static final String[] threadTestData;
23     static {
24         final Collator collator = Collator.getInstance(new Locale("pl", "", ""));
25         final String[] temporaryData = {
26                 "Banc Se\u00F3kdyaaouq Pfuymjec",
27                 "BSH \u00F3y",
28                 "ABB - \u00F3g",
29                 "G\u00F3kpo Adhdoetpwtx Twxma, qm. Ilnudx",
30                 "G\u00F3bjh Zcgopqmjidw Dyhlu, ky. Npyamr",
31                 "G\u00F3dxb Slfduvgdwfi Qhreu, ao. Adyfqx",
32                 "G\u00F3ten Emrmbmttgne Rtpir, rx. Mgmpjy",
33                 "G\u00F3kjo Hciqkymfcds Jpudo, ti. Ueceedbm (tkvyj vplrnpoq)",
34                 "Przjrpnbhrflnoo Dbiccp Lnmikfhsuo\u00F3s Tgfhlpqoso / ZAD ENR",
35                 "Bang Nbygmoyc Nd\u00F3nipcryjtzm",
36                 "Citjk\u00EBd Qgmgvr Er. w u.x.",
37                 "Dyrscywp Kvoifmyxo Ivv\u00F3r Lbyxtrwnzp",
38                 "G\u00E9awk Ssqenl Pk. c r.g.",
39                 "Nesdo\u00E9 Ilwbay Z.U.",
40                 "Poczsb Lrdtqg",
41                 "Pocafu Tgbmpn - wwg zo Mpespnzdllqk",
42                 "Polyvmg Z.C.",
43                 "POLUHONANQ FO",
44                 "Polrpycn",
45                 "Poleeaw-Rqzghgnnj R.W.",
46                 "Polyto Sgrgcvncz",
47                 "Polixj Tyfc\u00F3vcga Gbkjxf\u00F3f Tuogcybbbkyd C.U.",
48                 "Poltmzzlrkwt",
49                 "Polefgb Oiqefrkq",
50                 "Polrfdk K\u00F3nvyrfot Xuzbzzn f Ujmfwkdbnzh E.U. Wxkfiwss",
51                 "Polxtcf Hfowus Zzobblfm N.I.",
52                 "POLJNXO ZVYU L.A.",
53                 "PP Lowyr Rmknyoew",
54                 "Pralpe",
55                 "Preyojy Qnrxr",
56                 "PRK -5",
57                 "PRONENC U.P.",
58                 "Prowwyq & Relnda Hxkvauksnn Znyord Tz. w t.o.",
59                 "Propydv Afobbmhpg",
60                 "Proimpoupvp",
61                 "Probfo Hfttyr",
62                 "Propgi Lutgumnj X.W. BL",
63                 "Prozkch K.E.",
64                 "Progiyvzr Erejqk T.W.",
65                 "Prooxwq-Ydglovgk J.J.",
66                 "PTU Ntcw Lwkxjk S.M. UYF",
67                 "PWN",
68                 "PWP",
69                 "PZU I.D. Tlpzmhax",
70                 "PZU ioii A.T. Yqkknryu - bipdq badtg 500/9",
71                 "Qumnl-Udffq",
72                 "Radmvv",
73                 "Railoggeqd Aewy Fwlmsp K.S. Ybrqjgyr",
74                 "Remhmxkx Ewuhxbg",
75                 "Renafwp Sapnqr io v z.n.",
76                 "Repqbpuuo",
77                 "Resflig",
78                 "Rocqz Mvwftutxozs VQ",
79                 "Rohkui",
80                 "RRC",
81                 "Samgtzg Fkbulcjaaqv Ollllq Ad. l l.v.",
82                 "Schelrlw Fu. t z.x.",
83                 "Schemxgoc Axvufoeuh",
84                 "Siezsxz Eb. n r.h",
85                 "Sikj Wyvuog",
86                 "Sobcwssf Oy. q o.s. Kwaxj",
87                 "Sobpxpoc Fb. w q.h. Elftx",
88                 "Soblqeqs Kpvppc RH - tbknhjubw siyaenc Njsjbpx Buyshpgyv",
89                 "Sofeaypq FJ",
90                 "Stacyok Qurqjw Hw. f c.h.",
91                 "STOWN HH",
92                 "Stopjhmq Prxhkakjmalkvdt Weqxejbyig Wgfplnvk D.C.",
93                 "STRHAEI Clydqr Ha. d z.j.",
94                 "Sun Clvaqupknlk",
95                 "TarfAml",
96                 "Tchukm Rhwcpcvj Cc. v y.a.",
97                 "Teco Nyxm Rsvzkx pm. J a.t.",
98                 "Tecdccaty",
99                 "Telruaet Nmyzaz Twwwuf",
100                 "Tellrwihv Xvtjle N.U.",
101                 "Telesjedc Boewsx A.F",
102                 "tellqfwiqkv dinjlrnyit yktdhlqquihzxr (ohvso)",
103                 "Tetft Kna Ab. j l.z.",
104                 "Thesch",
105                 "Totqucvhcpm Gejxkgrz Is. e k.i.",
106                 "Towajgixetj Ngaayjitwm fj csxm Mxebfj Sbocok X.H.",
107                 "Toyfon Meesp Neeban Jdsjmrn sz v z.w.",
108                 "TRAJQ NZHTA Li. n x.e. - Vghfmngh",
109                 "Triuiu",
110                 "Tripsq",
111                 "TU ENZISOP ZFYIPF V.U.",
112                 "TUiX Kscdw G.G.",
113                 "TVN G.A.",
114                 "Tycd",
115                 "Unibjqxv rdnbsn - ZJQNJ XCG / Wslqfrk",
116                 "Unilcs - hopef ps 20 nixi",
117                 "UPC Gwwmru Ds. g o.r.",
118                 "Vaidgoav",
119                 "Vatyqzcgqh Kjnnsy GQ WT",
120                 "Volhz",
121                 "Vos Jviggogjt Iyqhlm Ih. w j.y. (fbshoihdnb)",
122                 "WARMFC E.D.",
123                 "Wincqk Pqadskf",
124                 "WKRD",
125                 "Wolk Pyug",
126                 "WPRV",
127                 "WSiI",
128                 "Wurag XZ",
129                 "Zacrijl B.B.",
130                 "Zakja Tziaboysenum Squlslpp - Diifw V.D.",
131                 "Zakgat Meqivadj Nrpxlekmodx s Bbymjozge W.Y.",
132                 "Zjetxpbkpgj Mmhhgohasjtpkjd Uwucubbpdj K.N.",
133                 "ZREH"
134         };
135         sort(temporaryData, collator);
136         threadTestData = temporaryData;
137     }
138
139     private static void scramble(String[] data, Random r) {
140         for (int i = 0; i < data.length; ++i) {
141             int ix = r.nextInt(data.length);
142             String s = data[i];
143             data[i] = data[ix];
144             data[ix] = s;
145         }
146     }
147
148     private static void sort(String[] data, Collator collator) {
149         Arrays.sort(data, collator);
150     }
151
152     private static boolean verifySort(String[] data) {
153         for (int i = 0; i < data.length; i++) {
154             if (!data[i].equals(threadTestData[i])) {
155                 return false;
156             }
157         }
158         return true;
159     }
160
161     public void testThreads() {
162         final Collator theCollator = Collator.getInstance(new Locale("pl", "", ""));
163         final String[] theData = threadTestData;
164         final Random r = new Random();
165
166         class Control {
167             private boolean go;
168             private String fail;
169
170             synchronized void start() {
171                 go = true;
172                 notifyAll();
173             }
174
175             synchronized void stop() {
176                 go = false;
177                 notifyAll();
178             }
179
180             boolean go() {
181                 return go;
182             }
183
184             void fail(String msg) {
185                 fail = msg;
186                 stop();
187             }
188         }
189
190         final Control control = new Control();
191
192         class Test implements Runnable {
193             private String[] data;
194             private Collator collator;
195             private String name;
196
197             Test(String name) {
198                 this.name = name;
199
200                 try {
201                     data = (String[]) theData.clone();
202                     collator = (Collator) theCollator.clone();
203                 } catch (CloneNotSupportedException e) {
204                     // should not happen, if it does we'll get an exception right away
205                     errln("could not clone");
206                     data = null;
207                     collator = null;
208                 }
209             }
210
211             public void run() {
212                 try {
213                     synchronized (control) {
214                         while (!control.go()) {
215                             control.wait();
216                         }
217                     }
218
219                     while (control.go()) {
220                         scramble(this.data, r);
221                         sort(this.data, this.collator);
222                         if (!verifySort(this.data)) {
223                             control.fail(name + ": incorrect sort");
224                         }
225                     }
226                 } catch (InterruptedException e) {
227                     // die
228                 } catch (IndexOutOfBoundsException e) {
229                     control.fail(name + " " + e.getMessage());
230                 }
231             }
232         }
233
234         Thread[] threads = new Thread[10];
235         for (int i = 0; i < threads.length; ++i) {
236             threads[i] = new Thread(new Test("test " + i));
237             threads[i].start();
238         }
239
240         try {
241             control.start();
242
243             long stopTime = System.currentTimeMillis() + 5000;
244             do {
245                 Thread.sleep(100);
246             } while (control.go() && System.currentTimeMillis() < stopTime);
247
248             control.stop();
249
250             for (int i = 0; i < threads.length; ++i) {
251                 threads[i].join();
252             }
253         } catch (InterruptedException e) {
254             // die
255         }
256
257         if (control.fail != null) {
258             errln(control.fail);
259         }
260     }
261
262
263     class FrozenCollatorTest implements Runnable {
264         private final String name;
265         private final Collator collator;
266         private final String[] data;
267         private final Random r;
268
269         public FrozenCollatorTest(String name, Collator collator, String[] data, Random r) {
270             this.name = name;
271             this.collator = collator;
272             this.data = data;
273             this.r = r;
274         }
275
276         public void run() {
277             while(true) {
278                 try {
279                     scramble(this.data, r);
280                     sort(this.data, this.collator);
281                     if (!verifySort(this.data)) {
282                         errln("Error in frozen collation test: thread (" + this.name + ") incorrect sort");
283                     }
284                 } catch (Exception e) {
285                     errln("Error in frozen collation test: thread (" + this.name + ") exception = " + e);
286                 }
287             }
288         }   
289     }
290
291     public void testFrozenThreads() throws Exception {
292         final Collator theCollator = Collator.getInstance(new Locale("pl", "", ""));
293         theCollator.freeze();
294         final Random r = new Random();
295
296         Thread[] threads = new Thread[10];
297         for (int i = 0; i < threads.length; ++i) {
298             threads[i] = new Thread(new FrozenCollatorTest("test " + i, theCollator, threadTestData.clone(), r));
299         }
300
301         for (int i = 0; i < threads.length; ++i) {
302             threads[i].start();
303         }
304
305         for (int i = 0; i < threads.length; ++i) {
306             threads[i].join(500);
307         }
308     }
309 }