Exemple #1
0
        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));
        }
Exemple #2
0
        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));
        }
Exemple #3
0
        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));
        }