public void GiveRange_MergeAfterFirstTest() {
    IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(false);
    uidSet.GiveRange(1, 5);
    uidSet.GiveRange(10, 12);
    uidSet.GiveRange(8, 9);
    AssertEquals("[1, 5][8, 12]", uidSet.ToString());
 }
      public void GiveRange_MergeMultipleTest() {
         var hardList = new LinkedList<UniqueIdentificationSet.Segment>().With(list => {
            list.AddLast(new UniqueIdentificationSet.Segment { low = 1, high = 5 });
            list.AddLast(new UniqueIdentificationSet.Segment { low = 12, high = 15 });
            list.AddLast(new UniqueIdentificationSet.Segment { low = 30, high = 50 });
            list.AddLast(new UniqueIdentificationSet.Segment { low = 52, high = 100 });
            list.AddLast(new UniqueIdentificationSet.Segment { low = 150, high = 200 });
         });
         IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(false);
         uidSet.__Assign(hardList);
         uidSet.GiveRange(0, 16);
         AssertEquals("[0, 16][30, 50][52, 100][150, 200]", uidSet.ToString());

         uidSet.__Assign(hardList);
         uidSet.GiveRange(15, 51);
         AssertEquals("[1, 5][12, 100][150, 200]", uidSet.ToString());

         uidSet.__Assign(hardList);
         uidSet.GiveRange(15, UInt32.MaxValue);
         AssertEquals("[1, 5][12, " + UInt32.MaxValue + "]", uidSet.ToString());

         uidSet.__Assign(hardList);
         uidSet.GiveRange(0, UInt32.MaxValue);
         AssertEquals("[0, " + UInt32.MaxValue + "]", uidSet.ToString());

         uidSet.__Assign(hardList);
         uidSet.GiveRange(201, 1000);
         AssertEquals("[1, 5][12, 15][30, 50][52, 100][150, 1000]", uidSet.ToString());

         uidSet.__Assign(hardList);
         uidSet.GiveRange(0, 0);
         AssertEquals("[0, 5][12, 15][30, 50][52, 100][150, 200]", uidSet.ToString());
      }
 public void GiveRange_AppendInMiddleTest() {
    IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(false);
    uidSet.GiveRange(12, 15);
    uidSet.GiveRange(18, 20);
    uidSet.GiveRange(1, 5);
    uidSet.GiveRange(7, 10);
    AssertEquals("[1, 5][7, 10][12, 15][18, 20]", uidSet.ToString());
 }
        public void GiveRange_MergeAfterFirstTest()
        {
            IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(false);

            uidSet.GiveRange(1, 5);
            uidSet.GiveRange(10, 12);
            uidSet.GiveRange(8, 9);
            AssertEquals("[1, 5][8, 12]", uidSet.ToString());
        }
 public void GiveRange_PrependToFrontTest() {
    IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(false);
    uidSet.Clear();
    uidSet.GiveRange(18, 20);
    uidSet.GiveRange(12, 15);
    uidSet.GiveRange(7, 10);
    uidSet.GiveRange(1, 5);
    AssertEquals("[1, 5][7, 10][12, 15][18, 20]", uidSet.ToString());
 }
        public void GiveRange_AppendInMiddleTest()
        {
            IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(false);

            uidSet.GiveRange(12, 15);
            uidSet.GiveRange(18, 20);
            uidSet.GiveRange(1, 5);
            uidSet.GiveRange(7, 10);
            AssertEquals("[1, 5][7, 10][12, 15][18, 20]", uidSet.ToString());
        }
        public void GiveRange_PrependToFrontTest()
        {
            IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(false);

            uidSet.Clear();
            uidSet.GiveRange(18, 20);
            uidSet.GiveRange(12, 15);
            uidSet.GiveRange(7, 10);
            uidSet.GiveRange(1, 5);
            AssertEquals("[1, 5][7, 10][12, 15][18, 20]", uidSet.ToString());
        }
        public void ContainsTest()
        {
            IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(1, 4);

            uidSet.GiveRange(6, 15);
            uidSet.TakeRange(10, 11);

            AssertFalse(uidSet.Contains(0));
            AssertTrue(uidSet.Contains(1));
            AssertTrue(uidSet.Contains(2));
            AssertTrue(uidSet.Contains(3));
            AssertTrue(uidSet.Contains(4));
            AssertFalse(uidSet.Contains(5));
            AssertTrue(uidSet.Contains(6));
            AssertTrue(uidSet.Contains(7));
            AssertTrue(uidSet.Contains(8));
            AssertTrue(uidSet.Contains(9));
            AssertFalse(uidSet.Contains(10));
            AssertFalse(uidSet.Contains(11));
            AssertTrue(uidSet.Contains(12));
            AssertTrue(uidSet.Contains(13));
            AssertTrue(uidSet.Contains(14));
            AssertTrue(uidSet.Contains(15));
            AssertFalse(uidSet.Contains(16));

            AssertTrue(new UniqueIdentificationSet(0, 4).Contains(0));
        }
        public void Any_ComplexTest()
        {
            IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(1, 2);

            uidSet.GiveRange(4, 5);

            AssertEquals(4, uidSet.Count);
        }
        public void GiveTakeMergeExceptInvertIntersectRangeRandomTest()
        {
            var random = new Random();
            var set    = new HashSet <uint>();
            IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(false);

            for (var it = 0; it < 20000; it++)
            {
                var low  = (uint)(random.NextDouble() * (long)100000);
                var high = low + (uint)(random.NextDouble() * (long)100);

                if (random.Next() % 2 == 0)
                {
                    for (var val = low; val <= high; val++)
                    {
                        AssertEquals(set.Add(val), !uidSet.Contains(val));
                    }
                    if (random.Next() % 2 == 0)
                    {
                        uidSet.GiveRange(low, high);
                    }
                    else
                    {
                        uidSet = uidSet.Merge(new UniqueIdentificationSet(low, high).Invert().Invert());
                    }
                    for (var val = low; val <= high; val++)
                    {
                        AssertTrue(uidSet.Contains(val));
                    }
                }
                else
                {
                    for (var val = low; val <= high; val++)
                    {
                        AssertEquals(set.Remove(val), uidSet.Contains(val));
                    }
                    var rand = random.Next() % 3;
                    if (rand == 0)
                    {
                        uidSet.TakeRange(low, high);
                    }
                    else if (rand == 1)
                    {
                        uidSet = uidSet.Except(new UniqueIdentificationSet(low, high).Invert().Invert());
                    }
                    else
                    {
                        uidSet = uidSet.Intersect(new UniqueIdentificationSet(low, high).Invert());
                    }
                    for (var val = low; val <= high; val++)
                    {
                        AssertFalse(uidSet.Contains(val));
                    }
                }
            }
        }
        public void GiveRange_MergeMultipleTest()
        {
            var hardList = new LinkedList <UniqueIdentificationSet.Segment>().With(list => {
                list.AddLast(new UniqueIdentificationSet.Segment {
                    low = 1, high = 5
                });
                list.AddLast(new UniqueIdentificationSet.Segment {
                    low = 12, high = 15
                });
                list.AddLast(new UniqueIdentificationSet.Segment {
                    low = 30, high = 50
                });
                list.AddLast(new UniqueIdentificationSet.Segment {
                    low = 52, high = 100
                });
                list.AddLast(new UniqueIdentificationSet.Segment {
                    low = 150, high = 200
                });
            });
            IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(false);

            uidSet.__Assign(hardList);
            uidSet.GiveRange(0, 16);
            AssertEquals("[0, 16][30, 50][52, 100][150, 200]", uidSet.ToString());

            uidSet.__Assign(hardList);
            uidSet.GiveRange(15, 51);
            AssertEquals("[1, 5][12, 100][150, 200]", uidSet.ToString());

            uidSet.__Assign(hardList);
            uidSet.GiveRange(15, UInt32.MaxValue);
            AssertEquals("[1, 5][12, " + UInt32.MaxValue + "]", uidSet.ToString());

            uidSet.__Assign(hardList);
            uidSet.GiveRange(0, UInt32.MaxValue);
            AssertEquals("[0, " + UInt32.MaxValue + "]", uidSet.ToString());

            uidSet.__Assign(hardList);
            uidSet.GiveRange(201, 1000);
            AssertEquals("[1, 5][12, 15][30, 50][52, 100][150, 1000]", uidSet.ToString());

            uidSet.__Assign(hardList);
            uidSet.GiveRange(0, 0);
            AssertEquals("[0, 5][12, 15][30, 50][52, 100][150, 200]", uidSet.ToString());
        }
      public void ContainsTest() {
         IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(1, 4);
         uidSet.GiveRange(6, 15);
         uidSet.TakeRange(10, 11);

         AssertFalse(uidSet.Contains(0));
         AssertTrue(uidSet.Contains(1));
         AssertTrue(uidSet.Contains(2));
         AssertTrue(uidSet.Contains(3));
         AssertTrue(uidSet.Contains(4));
         AssertFalse(uidSet.Contains(5));
         AssertTrue(uidSet.Contains(6));
         AssertTrue(uidSet.Contains(7));
         AssertTrue(uidSet.Contains(8));
         AssertTrue(uidSet.Contains(9));
         AssertFalse(uidSet.Contains(10));
         AssertFalse(uidSet.Contains(11));
         AssertTrue(uidSet.Contains(12));
         AssertTrue(uidSet.Contains(13));
         AssertTrue(uidSet.Contains(14));
         AssertTrue(uidSet.Contains(15));
         AssertFalse(uidSet.Contains(16));

         AssertTrue(new UniqueIdentificationSet(0, 4).Contains(0));
      }
      public void Any_ComplexTest() {
         IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(1, 2);
         uidSet.GiveRange(4, 5);

         AssertEquals(4, uidSet.Count);
      }
      public void GiveTakeMergeExceptInvertIntersectRangeRandomTest() {
         var random = new Random();
         var set = new HashSet<uint>();
         IUniqueIdentificationSet uidSet = new UniqueIdentificationSet(false);
         for (var it = 0; it < 20000; it++) {
            var low = (uint)(random.NextDouble() * (long)100000);
            var high = low + (uint)(random.NextDouble() * (long)100);

            if (random.Next() % 2 == 0) {
               for (var val = low; val <= high; val++) {
                  AssertEquals(set.Add(val), !uidSet.Contains(val));
               }
               if (random.Next() % 2 == 0) {
                  uidSet.GiveRange(low, high);
               } else {
                  uidSet = uidSet.Merge(new UniqueIdentificationSet(low, high).Invert().Invert());
               }
               for (var val = low; val <= high; val++) {
                  AssertTrue(uidSet.Contains(val));
               }
            } else {
               for (var val = low; val <= high; val++) {
                  AssertEquals(set.Remove(val), uidSet.Contains(val));
               }
               var rand = random.Next() % 3;
               if (rand == 0) {
                  uidSet.TakeRange(low, high);
               } else if (rand == 1) {
                  uidSet = uidSet.Except(new UniqueIdentificationSet(low, high).Invert().Invert());
               } else {
                  uidSet = uidSet.Intersect(new UniqueIdentificationSet(low, high).Invert());
               }
               for (var val = low; val <= high; val++) {
                  AssertFalse(uidSet.Contains(val));
               }
            }
         }
      }