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\\\\]")); }
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)); }