public void NewCodePointSetHasNoElements() { // Act var sut = new CodePointSet(); // Assert Assert.That(sut.IsEmpty, Is.True); Assert.That(sut.Count, Is.EqualTo(0)); }
public void AddManyUnrelatedElements() { // Arrange var sut = new CodePointSet(); var arr = new [] { new CodePoint(1234), new CodePoint(123), new CodePoint(456), new CodePoint(5678), new CodePoint(789) }; // Act foreach(var v in arr) sut.Add(v); // Assert Assert.That(sut.IsEmpty, Is.False); Assert.That(sut.Count, Is.EqualTo(arr.Length)); Assert.That(sut, Is.EquivalentTo(arr.OrderBy(i => i))); foreach(var v in arr) Assert.That(sut.Contains(v), Is.True); Assert.That(sut.GetRanges(), Is.EquivalentTo(arr.Select(i => new CodePointRange(i, i)))); }
public void AddOneElement() { // Arrange var sut = new CodePointSet(); var v = new CodePoint(123); // Act sut.Add(v); // Assert Assert.That(sut.IsEmpty, Is.False); Assert.That(sut.Count, Is.EqualTo(1)); Assert.That(sut, Is.EquivalentTo(new [] { v })); Assert.That(sut.Contains(v), Is.True); Assert.That(sut.Contains(v - 1), Is.False); Assert.That(sut.Contains(v + 1), Is.False); Assert.That(sut.GetRanges(), Is.EquivalentTo(new []{ new CodePointRange(v, v) })); }
public void AddAdjacentElementBeforeMerges() { // Arrange var sut = new CodePointSet(); var v1 = new CodePoint(123); var v2 = v1 + 1; // Act sut.Add(v2); sut.Add(v1); // Assert Assert.That(sut.IsEmpty, Is.False); Assert.That(sut.Count, Is.EqualTo(2)); Assert.That(sut, Is.EquivalentTo(new [] { v1, v2 })); Assert.That(sut.Contains(v1), Is.True); Assert.That(sut.Contains(v2), Is.True); Assert.That(sut.GetRanges(), Is.EquivalentTo(new[] { new CodePointRange(v1, v2) })); }
/// <summary> /// Parses a character set from the parse table. /// </summary> /// <param name="listTerm">A list of characters and character ranges.</param> /// <returns>The parsed character set.</returns> /// <example> /// The list term might look like this: /// <code> /// [range(9,10),13,32] /// </code> /// </example> private IReadOnlySet<CodePoint> ParseCharacterRanges(IListTerm listTerm) { #region Contract Contract.Requires<ArgumentNullException>(listTerm != null); Contract.Ensures(Contract.Result<IReadOnlySet<CodePoint>>() != null); #endregion CodePointSet characters = new CodePointSet(); foreach (var term in listTerm.SubTerms) { int? charValue = term.AsInt32(); IConsTerm rangeTerm = term.AsCons("range", 2); if (charValue != null) { if (charValue <= SpoofaxParseTableFormat.CharacterMax) characters.Add(new CodePoint((int)charValue)); // Else: ignore. It's a label which we'll add later. } else if (rangeTerm != null) { int start = rangeTerm[0].ToInt32(); // Clip the end to the max character we read. int end = Math.Min(rangeTerm[1].ToInt32(), SpoofaxParseTableFormat.CharacterMax); if (start <= SpoofaxParseTableFormat.CharacterMax) characters.AddRange(new CodePoint(start), new CodePoint(end)); // Else: ignore. It's a range of labels which we'll add later. } else throw new InvalidParseTableException("Unrecognized term: " + term); } // If the range contains the 8-bit Eof, change it into the 16-bit Eof. if (characters.Contains(new CodePoint(256))) { characters.Remove(new CodePoint(256)); characters.Add(CodePoint.Eof); } return characters; }
public void RemoveElementInMiddleOfRange() { // Arrange var sut = new CodePointSet(); var v1 = new CodePoint(123); var v2 = v1 + 1; var v3 = v2 + 1; sut.Add(v1); sut.Add(v2); sut.Add(v3); // Act sut.Remove(v2); // Assert Assert.That(sut.IsEmpty, Is.False); Assert.That(sut.Count, Is.EqualTo(2)); Assert.That(sut, Is.EquivalentTo(new [] { v1, v3 })); Assert.That(sut.Contains(v1), Is.True); Assert.That(sut.Contains(v2), Is.False); Assert.That(sut.Contains(v3), Is.True); Assert.That(sut.GetRanges(), Is.EquivalentTo(new []{ new CodePointRange(v1, v1), new CodePointRange(v3, v3) })); }
public void RemoveStandAloneElement() { // Arrange var sut = new CodePointSet(); var arr = new [] { new CodePoint(1234), new CodePoint(123), new CodePoint(456), new CodePoint(5678), new CodePoint(789) }; foreach(var v in arr) sut.Add(v); // Act sut.Remove(arr[2]); // Assert Assert.That(sut.IsEmpty, Is.False); Assert.That(sut.Count, Is.EqualTo(arr.Length - 1)); Assert.That(sut, Is.EquivalentTo(arr.Where(i => i != arr[2]).OrderBy(i => i))); foreach(var v in arr.Where(i => i != arr[2])) Assert.That(sut.Contains(v), Is.True); Assert.That(sut.GetRanges(), Is.EquivalentTo(arr.Where(i => i != arr[2]).Select(i => new CodePointRange(i, i)))); }
/// <summary> /// Reads a character set from a list term. /// </summary> /// <param name="listTerm">A list of characters and character ranges.</param> /// <returns>The read character set.</returns> /// <example> /// The list term might look like this: /// <code> /// [range(9,10),13,32] /// </code> /// </example> private IReadOnlySet<CodePoint> ReadCharacterRanges(IListTerm listTerm) { #region Contract Contract.Requires<ArgumentNullException>(listTerm != null); Contract.Ensures(Contract.Result<IReadOnlySet<CodePoint>>() != null); #endregion CodePointSet characters = new CodePointSet(); foreach (var term in listTerm.SubTerms) { int? charValue = term.AsInt32(); IConsTerm rangeTerm = term.AsCons("range", 2); if (charValue != null) { characters.Add(new CodePoint((int)charValue)); } else if (rangeTerm != null) { int start = rangeTerm[0].ToInt32(); int end = rangeTerm[1].ToInt32(); characters.AddRange(new CodePoint(start), new CodePoint(end)); } else throw new InvalidOperationException("Unrecognized term: " + term); } // If the range contains the 8-bit Eof, change it into the 16-bit Eof. if (characters.Contains(new CodePoint(256))) { characters.Remove(new CodePoint(256)); characters.Add(CodePoint.Eof); } return characters; }