Index: icu46/source/test/threadtest/stringtest.cpp |
=================================================================== |
--- icu46/source/test/threadtest/stringtest.cpp (revision 0) |
+++ icu46/source/test/threadtest/stringtest.cpp (revision 0) |
@@ -0,0 +1,143 @@ |
+// |
+//******************************************************************** |
+// Copyright (C) 2002, International Business Machines |
+// Corporation and others. All Rights Reserved. |
+//******************************************************************** |
+// |
+// File stringtest.cpp |
+// |
+ |
+#include "threadtest.h" |
+#include "unicode/unistr.h" |
+#include "stdio.h" |
+ |
+class StringThreadTest: public AbstractThreadTest { |
+public: |
+ StringThreadTest(); |
+ virtual ~StringThreadTest(); |
+ virtual void check(); |
+ virtual void runOnce(); |
+ void makeStringCopies(int recursionCount); |
+ |
+private: |
+ UnicodeString *fCleanStrings; |
+ UnicodeString *fSourceStrings; |
+}; |
+ |
+StringThreadTest::StringThreadTest() { |
+ // cleanStrings and sourceStrings are separately initialized to the same values. |
+ // cleanStrings are never touched after in any remotely unsafe way. |
+ // sourceStrings are copied during the test, which will run their buffer's reference |
+ // counts all over the place. |
+ fCleanStrings = new UnicodeString[5]; |
+ fSourceStrings = new UnicodeString[5]; |
+ |
+ fCleanStrings[0] = "When sorrows come, they come not single spies, but in batallions."; |
+ fSourceStrings[0] = "When sorrows come, they come not single spies, but in batallions."; |
+ fCleanStrings[1] = "Away, you scullion! You rampallion! You fustilarion! I'll tickle your catastrophe!"; |
+ fSourceStrings[1] = "Away, you scullion! You rampallion! You fustilarion! I'll tickle your catastrophe!"; |
+ fCleanStrings[2] = "hot"; |
+ fSourceStrings[2] = "hot"; |
+ fCleanStrings[3] = ""; |
+ fSourceStrings[3] = ""; |
+ fCleanStrings[4] = "Tomorrow, and tomorrow, and tomorrow,\n" |
+ "Creeps in this petty pace from day to day\n" |
+ "To the last syllable of recorded time;\n" |
+ "And all our yesterdays have lighted fools \n" |
+ "The way to dusty death. Out, out brief candle!\n" |
+ "Life's but a walking shadow, a poor player\n" |
+ "That struts and frets his hour upon the stage\n" |
+ "And then is heard no more. It is a tale\n" |
+ "Told by and idiot, full of sound and fury,\n" |
+ "Signifying nothing.\n"; |
+ fSourceStrings[4] = "Tomorrow, and tomorrow, and tomorrow,\n" |
+ "Creeps in this petty pace from day to day\n" |
+ "To the last syllable of recorded time;\n" |
+ "And all our yesterdays have lighted fools \n" |
+ "The way to dusty death. Out, out brief candle!\n" |
+ "Life's but a walking shadow, a poor player\n" |
+ "That struts and frets his hour upon the stage\n" |
+ "And then is heard no more. It is a tale\n" |
+ "Told by and idiot, full of sound and fury,\n" |
+ "Signifying nothing.\n"; |
+}; |
+ |
+ |
+StringThreadTest::~StringThreadTest() { |
+ delete [] fCleanStrings; |
+ delete [] fSourceStrings; |
+} |
+ |
+ |
+void StringThreadTest::runOnce() { |
+ makeStringCopies(25); |
+} |
+ |
+void StringThreadTest::makeStringCopies(int recursionCount) { |
+ UnicodeString firstGeneration[5]; |
+ UnicodeString secondGeneration[5]; |
+ UnicodeString thirdGeneration[5]; |
+ UnicodeString fourthGeneration[5]; |
+ |
+ // Make four generations of copies of the source strings, in slightly variant ways. |
+ // |
+ int i; |
+ for (i=0; i<5; i++) { |
+ firstGeneration[i] = fSourceStrings[i]; |
+ secondGeneration[i] = firstGeneration[i]; |
+ thirdGeneration[i] = UnicodeString(secondGeneration[i]); |
+ // fourthGeneration[i] = UnicodeString("Lay on, MacDuff, And damn'd be him that first cries, \"Hold, enough!\""); |
+ fourthGeneration[i] = UnicodeString(); |
+ fourthGeneration[i] = thirdGeneration[i]; |
+ } |
+ |
+ |
+ // Recurse to make even more copies of the strings/ |
+ // |
+ if (recursionCount > 0) { |
+ makeStringCopies(recursionCount-1); |
+ } |
+ |
+ |
+ // Verify that all four generations are equal. |
+ for (i=0; i<5; i++) { |
+ if (firstGeneration[i] != fSourceStrings[i] || |
+ firstGeneration[i] != secondGeneration[i] || |
+ firstGeneration[i] != thirdGeneration[i] || |
+ firstGeneration[i] != fourthGeneration[i]) |
+ { |
+ fprintf(stderr, "Error, strings don't compare equal.\n"); |
+ } |
+ } |
+ |
+}; |
+ |
+ |
+void StringThreadTest::check() { |
+ // |
+ // Check that the reference counts on the buffers for all of the source strings |
+ // are one. The ref counts will have run way up while the test threads |
+ // make numerous copies of the strings, but at the top of the loop all |
+ // of the copies should be gone. |
+ // |
+ int i; |
+ |
+ for (i=0; i<5; i++) { |
+ if (fSourceStrings[i].fFlags & UnicodeString::kRefCounted) { |
+ const UChar *buf = fSourceStrings[i].getBuffer(); |
+ uint32_t refCount = fSourceStrings[i].refCount(); |
+ if (refCount != 1) { |
+ fprintf(stderr, "\nFailure. SourceString Ref Count was %d, should be 1.\n", refCount); |
+ } |
+ } |
+ } |
+}; |
+ |
+ |
+// |
+// Factory functoin for StringThreadTest. |
+// C function lets ThreadTest create StringTests without needing StringThreadTest header. |
+// |
+AbstractThreadTest *createStringTest() { |
+ return new StringThreadTest(); |
+}; |
Property changes on: icu46/source/test/threadtest/stringtest.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |