public static string RandomSubString(Random random, int wordLength, bool simple) { if (wordLength == 0) { return(""); } int evilness = TestUtil.NextInt32(random, 0, 20); StringBuilder sb = new StringBuilder(); while (sb.Length < wordLength) { ; if (simple) { sb.Append(random.NextBoolean() ? TestUtil.RandomSimpleString(random, wordLength) : TestUtil.RandomHtmlishString(random, wordLength)); } else { if (evilness < 10) { sb.Append(TestUtil.RandomSimpleString(random, wordLength)); } else if (evilness < 15) { Assert.AreEqual(0, sb.Length); // we should always get wordLength back! sb.Append(TestUtil.RandomRealisticUnicodeString(random, wordLength, wordLength)); } else if (evilness == 16) { sb.Append(TestUtil.RandomHtmlishString(random, wordLength)); } else if (evilness == 17) { // gives a lot of punctuation sb.Append(TestUtil.RandomRegexpishString(random, wordLength)); } else { sb.Append(TestUtil.RandomUnicodeString(random, wordLength)); } } } if (sb.Length > wordLength) { sb.Length = wordLength; if (char.IsHighSurrogate(sb[wordLength - 1])) { sb.Length = wordLength - 1; } } if (random.Next(17) == 0) { // mix up case string mixedUp = TestUtil.RandomlyRecaseString(random, sb.ToString()); Assert.True(mixedUp.Length == sb.Length, "Lengths are not the same: mixedUp = " + mixedUp + ", length = " + mixedUp.Length + ", sb = " + sb + ", length = " + sb.Length); return(mixedUp); } else { return(sb.ToString()); } }