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