using System; using Amphora; using Glass.Text; using UnitTestSharp; namespace Glass.UnitTests.Text { public class StyleCursorTests : TestFixture { public static DynamicArray Spans(params (int start, int end)[] ranges) { var returnMe = new DynamicArray(capacity: ranges.Length); foreach ((int start, int end) in ranges) { returnMe.Add(new StyleSpan(start, end, new TextStyle())); } return returnMe; } public class SpanAtTests : TestFixture { public void NullSpans_HoldNothing() { var cursor = new StyleCursor(null); CheckEqual(-1, cursor.SpanAt(0)); CheckEqual(-1, cursor.SpanAt(5)); } public void NoSpans_HoldNothing() { var cursor = new StyleCursor(Spans()); CheckEqual(-1, cursor.SpanAt(0)); } public void CharacterInsideASpan_IsThatSpan() { var cursor = new StyleCursor(Spans((2, 5))); CheckEqual(0, cursor.SpanAt(3)); } public void SpansStart_IsInside() { var cursor = new StyleCursor(Spans((2, 5))); CheckEqual(0, cursor.SpanAt(2)); } public void SpansEnd_IsOutside() { var cursor = new StyleCursor(Spans((2, 5))); CheckEqual(-1, cursor.SpanAt(5)); } public void CharacterBeforeTheFirstSpan_HoldsNothing() { var cursor = new StyleCursor(Spans((2, 5))); CheckEqual(-1, cursor.SpanAt(1)); } public void CharacterBetweenSpans_HoldsNothing() { var cursor = new StyleCursor(Spans((0, 2), (4, 6))); CheckEqual(-1, cursor.SpanAt(3)); } public void WalkingTheText_FindsEachCharactersSpan() { var cursor = new StyleCursor(Spans((1, 3), (3, 4), (6, 8))); var found = new int[9]; for (int i = 0; i < found.Length; ++i) { found[i] = cursor.SpanAt(i); } CheckEqual(new[] { -1, 0, 0, 1, -1, -1, 2, 2, -1 }, found); } public void AskingTheSameCharacterAgain_FindsTheSameSpan() { var cursor = new StyleCursor(Spans((1, 3))); cursor.SpanAt(1); CheckEqual(0, cursor.SpanAt(1)); } public void SkippingPastSpans_FindsTheLaterOne() { var cursor = new StyleCursor(Spans((0, 1), (2, 3), (4, 5))); CheckEqual(2, cursor.SpanAt(4)); } public void OverlappingSpans_TheFirstOneStillHoldingTheCharacterWins() { var cursor = new StyleCursor(Spans((0, 10), (5, 7))); CheckEqual(0, cursor.SpanAt(6)); CheckEqual(0, cursor.SpanAt(9)); } public void AfterAnOverlappedSpanEnds_FindsTheOneThatOutlastedIt() { var cursor = new StyleCursor(Spans((0, 4), (2, 8))); cursor.SpanAt(3); CheckEqual(1, cursor.SpanAt(5)); } public void AnEarlierCharacter_Throws() { var cursor = new StyleCursor(Spans((0, 10))); cursor.SpanAt(5); CheckThrow(typeof(ArgumentOutOfRangeException)); cursor.SpanAt(4); } public void AnEarlierCharacterWithNoSpans_Throws() { var cursor = new StyleCursor(null); cursor.SpanAt(5); CheckThrow(typeof(ArgumentOutOfRangeException)); cursor.SpanAt(4); } } } }