| /* |
| ******************************************************************************* |
| * Copyright (C) 2007-2014, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| */ |
| |
| package com.ibm.icu.dev.test.collator; |
| |
| import java.util.Arrays; |
| import java.util.Locale; |
| import java.util.Random; |
| |
| import com.ibm.icu.dev.test.TestFmwk; |
| import com.ibm.icu.text.Collator; |
| |
| public class CollationThreadTest extends TestFmwk { |
| public static void main(String[] args) throws Exception { |
| new CollationThreadTest().run(args); |
| } |
| |
| private static final String[] threadTestData; |
| static { |
| final Collator collator = Collator.getInstance(new Locale("pl", "", "")); |
| final String[] temporaryData = { |
| "Banc Se\u00F3kdyaaouq Pfuymjec", |
| "BSH \u00F3y", |
| "ABB - \u00F3g", |
| "G\u00F3kpo Adhdoetpwtx Twxma, qm. Ilnudx", |
| "G\u00F3bjh Zcgopqmjidw Dyhlu, ky. Npyamr", |
| "G\u00F3dxb Slfduvgdwfi Qhreu, ao. Adyfqx", |
| "G\u00F3ten Emrmbmttgne Rtpir, rx. Mgmpjy", |
| "G\u00F3kjo Hciqkymfcds Jpudo, ti. Ueceedbm (tkvyj vplrnpoq)", |
| "Przjrpnbhrflnoo Dbiccp Lnmikfhsuo\u00F3s Tgfhlpqoso / ZAD ENR", |
| "Bang Nbygmoyc Nd\u00F3nipcryjtzm", |
| "Citjk\u00EBd Qgmgvr Er. w u.x.", |
| "Dyrscywp Kvoifmyxo Ivv\u00F3r Lbyxtrwnzp", |
| "G\u00E9awk Ssqenl Pk. c r.g.", |
| "Nesdo\u00E9 Ilwbay Z.U.", |
| "Poczsb Lrdtqg", |
| "Pocafu Tgbmpn - wwg zo Mpespnzdllqk", |
| "Polyvmg Z.C.", |
| "POLUHONANQ FO", |
| "Polrpycn", |
| "Poleeaw-Rqzghgnnj R.W.", |
| "Polyto Sgrgcvncz", |
| "Polixj Tyfc\u00F3vcga Gbkjxf\u00F3f Tuogcybbbkyd C.U.", |
| "Poltmzzlrkwt", |
| "Polefgb Oiqefrkq", |
| "Polrfdk K\u00F3nvyrfot Xuzbzzn f Ujmfwkdbnzh E.U. Wxkfiwss", |
| "Polxtcf Hfowus Zzobblfm N.I.", |
| "POLJNXO ZVYU L.A.", |
| "PP Lowyr Rmknyoew", |
| "Pralpe", |
| "Preyojy Qnrxr", |
| "PRK -5", |
| "PRONENC U.P.", |
| "Prowwyq & Relnda Hxkvauksnn Znyord Tz. w t.o.", |
| "Propydv Afobbmhpg", |
| "Proimpoupvp", |
| "Probfo Hfttyr", |
| "Propgi Lutgumnj X.W. BL", |
| "Prozkch K.E.", |
| "Progiyvzr Erejqk T.W.", |
| "Prooxwq-Ydglovgk J.J.", |
| "PTU Ntcw Lwkxjk S.M. UYF", |
| "PWN", |
| "PWP", |
| "PZU I.D. Tlpzmhax", |
| "PZU ioii A.T. Yqkknryu - bipdq badtg 500/9", |
| "Qumnl-Udffq", |
| "Radmvv", |
| "Railoggeqd Aewy Fwlmsp K.S. Ybrqjgyr", |
| "Remhmxkx Ewuhxbg", |
| "Renafwp Sapnqr io v z.n.", |
| "Repqbpuuo", |
| "Resflig", |
| "Rocqz Mvwftutxozs VQ", |
| "Rohkui", |
| "RRC", |
| "Samgtzg Fkbulcjaaqv Ollllq Ad. l l.v.", |
| "Schelrlw Fu. t z.x.", |
| "Schemxgoc Axvufoeuh", |
| "Siezsxz Eb. n r.h", |
| "Sikj Wyvuog", |
| "Sobcwssf Oy. q o.s. Kwaxj", |
| "Sobpxpoc Fb. w q.h. Elftx", |
| "Soblqeqs Kpvppc RH - tbknhjubw siyaenc Njsjbpx Buyshpgyv", |
| "Sofeaypq FJ", |
| "Stacyok Qurqjw Hw. f c.h.", |
| "STOWN HH", |
| "Stopjhmq Prxhkakjmalkvdt Weqxejbyig Wgfplnvk D.C.", |
| "STRHAEI Clydqr Ha. d z.j.", |
| "Sun Clvaqupknlk", |
| "TarfAml", |
| "Tchukm Rhwcpcvj Cc. v y.a.", |
| "Teco Nyxm Rsvzkx pm. J a.t.", |
| "Tecdccaty", |
| "Telruaet Nmyzaz Twwwuf", |
| "Tellrwihv Xvtjle N.U.", |
| "Telesjedc Boewsx A.F", |
| "tellqfwiqkv dinjlrnyit yktdhlqquihzxr (ohvso)", |
| "Tetft Kna Ab. j l.z.", |
| "Thesch", |
| "Totqucvhcpm Gejxkgrz Is. e k.i.", |
| "Towajgixetj Ngaayjitwm fj csxm Mxebfj Sbocok X.H.", |
| "Toyfon Meesp Neeban Jdsjmrn sz v z.w.", |
| "TRAJQ NZHTA Li. n x.e. - Vghfmngh", |
| "Triuiu", |
| "Tripsq", |
| "TU ENZISOP ZFYIPF V.U.", |
| "TUiX Kscdw G.G.", |
| "TVN G.A.", |
| "Tycd", |
| "Unibjqxv rdnbsn - ZJQNJ XCG / Wslqfrk", |
| "Unilcs - hopef ps 20 nixi", |
| "UPC Gwwmru Ds. g o.r.", |
| "Vaidgoav", |
| "Vatyqzcgqh Kjnnsy GQ WT", |
| "Volhz", |
| "Vos Jviggogjt Iyqhlm Ih. w j.y. (fbshoihdnb)", |
| "WARMFC E.D.", |
| "Wincqk Pqadskf", |
| "WKRD", |
| "Wolk Pyug", |
| "WPRV", |
| "WSiI", |
| "Wurag XZ", |
| "Zacrijl B.B.", |
| "Zakja Tziaboysenum Squlslpp - Diifw V.D.", |
| "Zakgat Meqivadj Nrpxlekmodx s Bbymjozge W.Y.", |
| "Zjetxpbkpgj Mmhhgohasjtpkjd Uwucubbpdj K.N.", |
| "ZREH" |
| }; |
| sort(temporaryData, collator); |
| threadTestData = temporaryData; |
| } |
| |
| private static void scramble(String[] data, Random r) { |
| for (int i = 0; i < data.length; ++i) { |
| int ix = r.nextInt(data.length); |
| String s = data[i]; |
| data[i] = data[ix]; |
| data[ix] = s; |
| } |
| } |
| |
| private static void sort(String[] data, Collator collator) { |
| Arrays.sort(data, collator); |
| } |
| |
| private static boolean verifySort(String[] data) { |
| for (int i = 0; i < data.length; i++) { |
| if (!data[i].equals(threadTestData[i])) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| private static class Control { |
| private boolean go; |
| private String fail; |
| |
| synchronized void start() { |
| go = true; |
| notifyAll(); |
| } |
| |
| synchronized void stop() { |
| go = false; |
| notifyAll(); |
| } |
| |
| boolean go() { |
| return go; |
| } |
| |
| void fail(String msg) { |
| fail = msg; |
| stop(); |
| } |
| } |
| |
| private static class Test implements Runnable { |
| private String[] data; |
| private Collator collator; |
| private String name; |
| private Control control; |
| private Random r; |
| |
| Test(String name, String[] data, Collator collator, Random r, Control control) { |
| this.name = name; |
| this.data = data; |
| this.collator = collator; |
| this.control = control; |
| this.r = r; |
| } |
| |
| public void run() { |
| try { |
| synchronized (control) { |
| while (!control.go()) { |
| control.wait(); |
| } |
| } |
| |
| while (control.go()) { |
| scramble(this.data, r); |
| sort(this.data, this.collator); |
| if (!verifySort(this.data)) { |
| control.fail(name + ": incorrect sort"); |
| } |
| } |
| } catch (InterruptedException e) { |
| // die |
| } catch (IndexOutOfBoundsException e) { |
| control.fail(name + " " + e.getMessage()); |
| } |
| } |
| } |
| |
| private void runThreads(Thread[] threads, Control control) { |
| for (int i = 0; i < threads.length; ++i) { |
| threads[i].start(); |
| } |
| |
| try { |
| control.start(); |
| |
| long stopTime = System.currentTimeMillis() + 5000; |
| do { |
| Thread.sleep(100); |
| } while (control.go() && System.currentTimeMillis() < stopTime); |
| |
| control.stop(); |
| |
| for (int i = 0; i < threads.length; ++i) { |
| threads[i].join(); |
| } |
| } catch (InterruptedException e) { |
| // die |
| } |
| |
| if (control.fail != null) { |
| errln(control.fail); |
| } |
| } |
| |
| public void testThreads() { |
| final Collator theCollator = Collator.getInstance(new Locale("pl", "", "")); |
| final Random r = new Random(); |
| final Control control = new Control(); |
| |
| Thread[] threads = new Thread[10]; |
| for (int i = 0; i < threads.length; ++i) { |
| Collator coll; |
| try { |
| coll = (Collator)theCollator.clone(); |
| } catch (CloneNotSupportedException e) { |
| // should not happen, if it does we'll get an exception right away |
| errln("could not clone"); |
| return; |
| } |
| Test test = new Test("Collation test thread" + i, threadTestData.clone(), coll, |
| r, control); |
| threads[i] = new Thread(test); |
| } |
| |
| runThreads(threads, control); |
| } |
| |
| public void testFrozen() { |
| final Collator theCollator = Collator.getInstance(new Locale("pl", "", "")); |
| theCollator.freeze(); |
| final Random r = new Random(); |
| Control control = new Control(); |
| |
| Thread[] threads = new Thread[10]; |
| for (int i = 0; i < threads.length; ++i) { |
| Test test = new Test("Frozen collation test thread " + i, threadTestData.clone(), theCollator, |
| r, control); |
| threads[i] = new Thread(test); |
| } |
| |
| runThreads(threads, control); |
| } |
| } |