예제 #1
0
        public void ParsingAndPrinting()
        {
            IntSet empty = IntSet.Empty, all = IntSet.All;

            PrintAndParse(empty, "()");
            empty.IsCharSet = true;
            PrintAndParse(empty, "[]");
            empty.IsCharSet = false;             // design flaw here - mutable property on readonly static field
            PrintAndParse(all, "~()");
            all.IsCharSet = true;
            PrintAndParse(all, "[^]");
            all.IsCharSet = false;             // design flaw here - mutable property on readonly static field

            AreEqual(IntSet.WithCharRanges('a', 'd'), IntSet.Parse("[dacb]"));
            AreEqual(IntSet.With(1234), IntSet.Parse("(1234)"));
            AreEqual(IntSet.With(0x1234, '!'), IntSet.Parse("[\u1234!]"));
            AreEqual(IntSet.With(0x12, '!'), IntSet.Parse("[\x12!]"));
            IsNull(IntSet.TryParse("(12345678901)"));
            PrintAndParse(IntSet.WithCharRanges('a', 'd'), "[a-d]");
            PrintAndParse(IntSet.WithChars('$', '-', '[', ']'), @"[$\-[\]]");
            PrintAndParse(IntSet.WithoutCharRanges(-1, -1, '\n', '\n', '0', '9', '^', '^'), @"[^\$\n0-9^]");
            PrintAndParse(IntSet.With(2, 3, 5, 7, 11), "(2..3, 5, 7, 11)");
            PrintAndParse(IntSet.WithRanges(int.MinValue, 0), string.Format("({0}..0)", int.MinValue));
            PrintAndParse(IntSet.WithoutRanges(1, int.MaxValue), string.Format("~(1..{0})", int.MaxValue));

            // See the error? That's really a single backslash; to add backslash to
            // the set we need another backslash.
            int errorIndex;
            var set = IntSet.TryParse("[^\n\\]", out errorIndex);

            AreEqual(errorIndex, 4);
            AreEqual(IntSet.WithoutChars('\n', '\\'), IntSet.Parse("[^\n\\\\]"));
        }
예제 #2
0
        public void EdgeCases()
        {
            var min  = IntSet.With(int.MinValue);
            var max  = IntSet.With(int.MaxValue);
            var min2 = IntSet.WithoutRanges(int.MinValue + 1, int.MaxValue);
            var max2 = IntSet.WithoutRanges(int.MinValue, int.MaxValue - 1);

            IsTrue(min.Equals(min2, IntSet.S_Equivalent));
            IsTrue(max.Equals(max2, IntSet.S_Equivalent));
            IsFalse(min.Equals(min2, IntSet.S_Identical));
            IsFalse(max.Equals(max2, IntSet.S_Identical));
            IsTrue(min.EquivalentInverted().Equals(min2, IntSet.S_Identical));
            IsTrue(max.EquivalentInverted().Equals(max2, IntSet.S_Identical));
            var minmax  = min.Union(max);
            var minmax2 = min2.Union(max2);

            IsFalse(minmax.IsInverted);
            IsTrue(minmax2.IsInverted);
            CheckRanges(minmax, new IntRange(int.MinValue), new IntRange(int.MaxValue));
            CheckRanges(minmax2, new IntRange(int.MinValue + 1, int.MaxValue - 1));

            var none = IntSet.Empty;
            var all  = IntSet.All;

            IsFalse(all.Equals(none, IntSet.S_Equivalent));
            IsTrue(all.Equals(none, IntSet.S_SameRangeList));
            CheckRanges(all);
            AreEqual(all, all.Union(none));
            AreEqual(all, all.Union(min));
            AreEqual(all, all.Union(min2));
            AreEqual(none, all.Intersection(none));
            AreEqual(min, all.Intersection(min));
            AreEqual(max, all.Intersection(max2));
            AreEqual(min, none.Union(min2));
            AreEqual(max, none.Union(max));
            AreEqual(none, min.Intersection(max));
            AreEqual(none, min2.Intersection(max2));

            IsTrue(min2.IsInverted && max2.IsInverted);
            min2 = min2.Inverted();
            max2 = max2.Inverted();
            AreEqual(all, min2.Union(max2));
            CheckRanges(min2.Intersection(max2), new IntRange(int.MinValue + 1, int.MaxValue - 1));
        }