public void TransformRange()
        {
            CompressingTreeList <int> list = new CompressingTreeList <int>((a, b) => a == b);

            list.AddRange(new[] { 0, 1, 1, 1, 0, 0 });
            list.TransformRange(2, 3, i => 0);
            Assert.AreEqual(new[] { 0, 1, 0, 0, 0, 0 }, list.ToArray());
        }
        public void CheckAdd10BillionElements()
        {
            const int billion = 1000000000;
            CompressingTreeList <string> list = new CompressingTreeList <string>(string.Equals);

            list.InsertRange(0, billion, "A");
            list.InsertRange(1, billion, "B");
            Assert.AreEqual(2 * billion, list.Count);
            Assert.Throws <OverflowException>(delegate { list.InsertRange(2, billion, "C"); });
        }
        public void AddRepeated()
        {
            CompressingTreeList <int> list = new CompressingTreeList <int>((a, b) => a == b);

            list.Add(42);
            list.Add(42);
            list.Add(42);
            list.Insert(0, 42);
            list.Insert(1, 42);
            Assert.AreEqual(new[] { 42, 42, 42, 42, 42 }, list.ToArray());
        }
        public void Transform()
        {
            CompressingTreeList <int> list = new CompressingTreeList <int>((a, b) => a == b);

            list.AddRange(new[] { 0, 1, 1, 0 });
            int calls = 0;

            list.Transform(i => { calls++; return(i + 1); });
            Assert.AreEqual(3, calls);
            Assert.AreEqual(new[] { 1, 2, 2, 1 }, list.ToArray());
        }
        public void RemoveAtStart()
        {
            CompressingTreeList <int> list = new CompressingTreeList <int>((a, b) => a == b);

            for (int i = 1; i <= 3; i++)
            {
                list.InsertRange(list.Count, 2, i);
            }
            Assert.AreEqual(new[] { 1, 1, 2, 2, 3, 3 }, list.ToArray());
            list.RemoveRange(0, 1);
            Assert.AreEqual(new[] { 1, 2, 2, 3, 3 }, list.ToArray());
        }
        public void EmptyTreeList()
        {
            CompressingTreeList <string> list = new CompressingTreeList <string>(string.Equals);

            Assert.AreEqual(0, list.Count);
            foreach (string v in list)
            {
                Assert.Fail();
            }
            string[] arr = new string[0];
            list.CopyTo(arr, 0);
        }
        public void CheckAdd10BillionElements()
        {
            const int billion = 1000000000;
            CompressingTreeList <string> list = new CompressingTreeList <string>(string.Equals);

            list.InsertRange(0, billion, "A");
            list.InsertRange(1, billion, "B");
            Assert.AreEqual(2 * billion, list.Count);
            try {
                list.InsertRange(2, billion, "C");
                Assert.Fail("Expected OverflowException");
            } catch (OverflowException) {
                // expected
            }
        }