public void Grow() { // 0 3 6 11 15 19 22 27 32 36 const string original = "onetwothreefourfivesixseveneightnineten"; var arr = original.ToCharArray(); var set = new StringSet(4); string str; set.Add(arr, 0, 3, out str); // one set.Add(arr, 3, 3, out str); // two set.Add(arr, 6, 5, out str); // three set.Add(arr, 11, 4, out str); // four Assert.AreEqual(4, set.MaxSize); // make sure we can find something Assert.AreEqual("two", set.GetExistingString(arr, 3, 3)); set.Add(arr, 15, 4, out str); // five Assert.Greater(set.MaxSize, 4, "The set should have expanded to greater than 4 maximum size."); set.Add(arr, 19, 3, out str); // six set.Add(arr, 22, 5, out str); // seven set.Add(arr, 27, 5, out str); // eight set.Add(arr, 32, 4, out str); // nine set.Add(arr, 36, 3, out str); // ten Assert.AreEqual(10, set.Count); Assert.GreaterOrEqual(set.MaxSize, set.Count); Assert.AreEqual("two", set.GetExistingString(arr, 3, 3)); Assert.AreEqual("seven", set.GetExistingString(arr, 22, 5)); }
public void GetExisting() { const string original = "thisthatthen"; var arr = original.ToCharArray(); var set = new StringSet(10); Assert.IsNull(set.GetExistingString(arr, 0, 4)); string str; Assert.True(set.Add(arr, 0, 4, out str)); Assert.False(set.Add(arr, 0, 4, out str)); Assert.AreEqual(str, set.GetExistingString(arr, 0, 4)); Assert.IsNull(set.GetExistingString(arr, 4, 4)); }
public void StringInterning() { var s = new ReusableStream(100); var strings = new[] { "cat", "deer", "snail", "dog", "frog", "human" }; const int max = 4; const string exclude = "frog"; foreach (var str in strings) { s.WriteString(str, false); } s.ResetForReading(); // we're not interning yet - make sure new strings were returned foreach (var str in strings) { var read = s.ReadString(false); Assert.AreEqual(str, read); Assert.AreNotSame(str, read); } s.ResetForReading(); var options = new StringSetOptions(); options.MaxEncodedSizeToLookupInSet = max; Assert.Throws <InvalidOperationException>(() => s.SetDefaultStringSetOptions(options)); var set = new StringSet(10); s.StringSet = set; s.SetDefaultStringSetOptions(options); s.StringSet = null; // should throw because no StringSet has been provided Assert.Throws <InvalidOperationException>(() => s.ReadString(false)); foreach (var str in strings) { if (str != exclude) { set.Add(str); } } s.StringSet = set; // read with interning (but no auto-interning) foreach (var str in strings) { var read = s.ReadString(false); Assert.AreEqual(str, read); if (str.Length <= max && str != exclude) { Assert.AreSame(str, read); } else { Assert.AreNotSame(str, read); } } // make sure the excluded string didn't get added to the set Assert.AreEqual(null, set.GetExistingString(exclude.ToCharArray(), 0, exclude.Length)); s.ResetForReading(); options.PerformDangerousAutoAddToSet = true; s.SetDefaultStringSetOptions(options); // read with auto-interning foreach (var str in strings) { var read = s.ReadString(false); Assert.AreEqual(str, read); if (str.Length <= max && str != exclude) { Assert.AreSame(str, read); } else { Assert.AreNotSame(str, read); } } // make sure the excluded string got added to the set Assert.AreEqual(exclude, set.GetExistingString(exclude.ToCharArray(), 0, exclude.Length)); }