Exemple #1
0
        public void InsertVariableSizeItemAfterDelete()
        {
            int pageSize         = 4096;
            var dummyPageManager = new FileSystemPageManager(pageSize);
            var p = new Page(dummyPageManager, 0, new byte[pageSize]);

            var header = new RadixTreeNodesPageHeader
            {
                FreeSpace = (ushort)PageFormatter.GetMaximalFreeSpace((PageSize)p.Length)
            };

            PageFormatter.InitPage(p, header);

            var r = new Random();

            var items = new List <byte[]>();

            var item = new byte[r.Next(100) + 1];

            r.NextBytes(item);

            short itemIndex = 0;

            while (itemIndex != -1)
            {
                itemIndex = PageFormatter.AddVariableSizeItem(p, item);
                items.Add(item);

                item = new byte[r.Next(100) + 1];
                r.NextBytes(item);
            }

            bool hasRemainingItems;

            // replace with the same
            PageFormatter.DeleteVariableSizeItem(p, 1, out hasRemainingItems);
            Assert.AreEqual(1, PageFormatter.AddVariableSizeItem(p, items[1]));

            item = PageFormatter.ReadVariableSizeItem(p, 1);
            Assert.IsTrue(AreEqualByteArrays(items[1], item));

            // replace with smaller one
            PageFormatter.DeleteVariableSizeItem(p, 1, out hasRemainingItems);
            var smallItem = new byte[items[1].Length / 2 + 1];

            r.NextBytes(smallItem);
            Assert.AreEqual(1, PageFormatter.AddVariableSizeItem(p, smallItem));

            item = PageFormatter.ReadVariableSizeItem(p, 1);
            Assert.IsTrue(AreEqualByteArrays(smallItem, item));

            // and put original again
            PageFormatter.DeleteVariableSizeItem(p, 1, out hasRemainingItems);
            PageFormatter.AddVariableSizeItem(p, items[1]);

            item = PageFormatter.ReadVariableSizeItem(p, 1);
            Assert.IsTrue(AreEqualByteArrays(items[1], item));
        }
Exemple #2
0
        public void PageHasNoRemainingItemsAfterDelete()
        {
            int pageSize         = 4096;
            var dummyPageManager = new FileSystemPageManager(pageSize);
            var p = new Page(dummyPageManager, 0, new byte[pageSize]);

            var header = new RadixTreeNodesPageHeader
            {
                FreeSpace = (ushort)PageFormatter.GetMaximalFreeSpace((PageSize)p.Length)
            };

            PageFormatter.InitPage(p, header);

            var r = new Random();

            var items = new List <byte[]>();

            var item = new byte[r.Next(100) + 1];

            r.NextBytes(item);

            short itemIndex = 0;

            while (itemIndex != -1)
            {
                itemIndex = PageFormatter.AddVariableSizeItem(p, item);
                if (itemIndex == -1)
                {
                    continue;
                }

                items.Add(item);

                item = new byte[r.Next(100) + 1];
                r.NextBytes(item);
            }

            bool hasRemainingItems;

            for (short i = 0; i < items.Count; i++)
            {
                PageFormatter.DeleteVariableSizeItem(p, i, out hasRemainingItems);
                if (i < items.Count - 1)
                {
                    Assert.IsTrue(hasRemainingItems);
                }
                else
                {
                    Assert.IsFalse(hasRemainingItems);
                }
            }
        }
Exemple #3
0
        public void ReadVariableSizeItems()
        {
            int pageSize         = 4096;
            var dummyPageManager = new FileSystemPageManager(pageSize);
            var p = new Page(dummyPageManager, 0, new byte[pageSize]);

            var header = new RadixTreeNodesPageHeader
            {
                FreeSpace = (ushort)PageFormatter.GetMaximalFreeSpace((PageSize)p.Length)
            };

            PageFormatter.InitPage(p, header);

            var r = new Random();

            var items = new List <byte[]>();

            var item = new byte[r.Next(100) + 1];

            r.NextBytes(item);

            while (PageFormatter.AddVariableSizeItem(p, item) != -1)
            {
                items.Add(item);

                item = new byte[r.Next(100) + 1];
                r.NextBytes(item);
            }

            for (short i = 0; i < items.Count; i++)
            {
                item = PageFormatter.ReadVariableSizeItem(p, i);
                Assert.IsTrue(AreEqualByteArrays(items[i], item));
            }

            bool hasRemainingItems;

            PageFormatter.DeleteVariableSizeItem(p, 0, out hasRemainingItems);
            PageFormatter.DeleteVariableSizeItem(p, 2, out hasRemainingItems);
            PageFormatter.DeleteVariableSizeItem(p, (short)(items.Count - 1), out hasRemainingItems);

            Assert.Throws <PageFormatException>(() => PageFormatter.ReadVariableSizeItem(p, 0));
            Assert.Throws <PageFormatException>(() => PageFormatter.ReadVariableSizeItem(p, 2));
            Assert.Throws <PageFormatException>(() => PageFormatter.ReadVariableSizeItem(p, (short)(items.Count - 1)));
        }