17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2008, International Business Machines Corporation and         *
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.lang;
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.LinkedList;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.List;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.ListIterator;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UCharacter;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author aheninger
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class UCharacterThreadTest extends TestFmwk {
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  // constructor -----------------------------------------------------------
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Private constructor to prevent initialisation
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public UCharacterThreadTest()
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      // public methods --------------------------------------------------------
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] arg)
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UCharacterThreadTest test = new UCharacterThreadTest();
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            test.run(arg);
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (Exception e)
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              e.printStackTrace();
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //  Test multi-threaded parallel calls to UCharacter.getName(codePoint)
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //  Regression test for ticket 6264.
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestUCharactersGetName() throws InterruptedException {
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        List threads = new LinkedList();
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int t=0; t<20; t++) {
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          int codePoint = 47 + t;
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          String correctName = UCharacter.getName(codePoint);
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          GetNameThread thread = new GetNameThread(codePoint, correctName);
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          thread.start();
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          threads.add(thread);
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ListIterator i = threads.listIterator();
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (i.hasNext()) {
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            GetNameThread thread = (GetNameThread)i.next();
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            thread.join();
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!thread.correctName.equals(thread.actualName)) {
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL, expected \"" + thread.correctName + "\", got \"" + thread.actualName + "\"");
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      }
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      private static class GetNameThread extends Thread {
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final int codePoint;
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final String correctName;
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private String actualName;
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        GetNameThread(int codePoint, String correctName) {
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           this.codePoint = codePoint;
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           this.correctName = correctName;
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public void run() {
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          for(int i=0; i<10000; i++) {
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            actualName = UCharacter.getName(codePoint);
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!correctName.equals(actualName)) {
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              break;
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          }
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      }
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
89