public void SkipWordBorder3() { var strategy = SearchStrategyFactory.Create("// find", false, true, SearchMode.Normal); var text = new StringTextSource(" // findtest"); var results = strategy.FindAll(text, 0, text.TextLength).ToArray(); Assert.IsEmpty(results, "No results should be found!"); }
public void ResultAtEnd() { var strategy = SearchStrategyFactory.Create("me", false, true, SearchMode.Normal); var text = new StringTextSource("result // find me"); var results = strategy.FindAll(text, 0, text.TextLength).ToArray(); Assert.AreEqual(1, results.Length, "One result should be found!"); Assert.AreEqual("result // find ".Length, results[0].Offset); Assert.AreEqual("me".Length, results[0].Length); }
void DoReplace(int offset, int length, ITextSource newText, OffsetChangeMap offsetChangeMap) { if (length == 0 && newText.TextLength == 0) { return; } // trying to replace a single character in 'Normal' mode? // for single characters, 'CharacterReplace' mode is equivalent, but more performant // (we don't have to touch the anchorTree at all in 'CharacterReplace' mode) if (length == 1 && newText.TextLength == 1 && offsetChangeMap == null) { offsetChangeMap = OffsetChangeMap.Empty; } ITextSource removedText; if (length == 0) { removedText = StringTextSource.Empty; } else if (length < 100) { removedText = new StringTextSource(rope.ToString(offset, length)); } else { // use a rope if the removed string is long removedText = new RopeTextSource(rope.GetRange(offset, length)); } DocumentChangeEventArgs args = new DocumentChangeEventArgs(offset, removedText, newText, offsetChangeMap); // fire DocumentChanging event if (Changing != null) { Changing(this, args); } if (textChanging != null) { textChanging(this, args); } undoStack.Push(this, args); cachedText = null; // reset cache of complete document text fireTextChanged = true; DelayedEvents delayedEvents = new DelayedEvents(); lock (lockObject) { // create linked list of checkpoints versionProvider.AppendChange(args); // now update the textBuffer and lineTree if (offset == 0 && length == rope.Length) { // optimize replacing the whole document rope.Clear(); if (newText is RopeTextSource newRopeTextSource) { rope.InsertRange(0, newRopeTextSource.GetRope()); } else { rope.InsertText(0, newText.Text); } lineManager.Rebuild(); } else { rope.RemoveRange(offset, length); lineManager.Remove(offset, length); #if DEBUG lineTree.CheckProperties(); #endif if (newText is RopeTextSource newRopeTextSource) { rope.InsertRange(offset, newRopeTextSource.GetRope()); } else { rope.InsertText(offset, newText.Text); } lineManager.Insert(offset, newText); #if DEBUG lineTree.CheckProperties(); #endif } } // update text anchors if (offsetChangeMap == null) { anchorTree.HandleTextChange(args.CreateSingleChangeMapEntry(), delayedEvents); } else { foreach (OffsetChangeMapEntry entry in offsetChangeMap) { anchorTree.HandleTextChange(entry, delayedEvents); } } lineManager.ChangeComplete(args); // raise delayed events after our data structures are consistent again delayedEvents.RaiseEvents(); // fire DocumentChanged event if (Changed != null) { Changed(this, args); } if (textChanged != null) { textChanged(this, args); } }
public void SimpleTest() { var strategy = SearchStrategyFactory.Create("AllTests", false, false, SearchMode.Normal); var text = new StringTextSource("name=\"FindAllTests "); var results = strategy.FindAll(text, 0, text.TextLength).ToArray(); Assert.AreEqual(1, results.Length, "One result should be found!"); Assert.AreEqual("name=\"Find".Length, results[0].Offset); Assert.AreEqual("AllTests".Length, results[0].Length); }