Example #1
0
		public void NewCodePointSetHasNoElements()
		{
			// Act
			var sut = new CodePointSet();

			// Assert
			Assert.That(sut.IsEmpty, Is.True);
			Assert.That(sut.Count, Is.EqualTo(0));
		}
Example #2
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))));
		}
Example #3
0
		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) }));
		}
Example #4
0
		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;
		}
Example #6
0
		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) }));
		}
Example #7
0
		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;
		}