diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/ICSharpCode.AvalonEdit.Tests.csproj b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/ICSharpCode.AvalonEdit.Tests.csproj index d81a412734..6798784599 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/ICSharpCode.AvalonEdit.Tests.csproj +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/ICSharpCode.AvalonEdit.Tests.csproj @@ -19,6 +19,7 @@ 4 false ..\..\..\..\bin\UnitTests\ + OnBuildSuccess true @@ -38,7 +39,7 @@ False Auto 4194304 - AnyCPU + x86 4096 @@ -87,6 +88,7 @@ + Always diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/XmlParser/TextReplacementTests.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/XmlParser/TextReplacementTests.cs new file mode 100644 index 0000000000..7e82a95fb8 --- /dev/null +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/XmlParser/TextReplacementTests.cs @@ -0,0 +1,119 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using ICSharpCode.AvalonEdit.Document; +using ICSharpCode.AvalonEdit.Xml; +using NUnit.Framework; + +namespace ICSharpCode.AvalonEdit.Xml +{ + [TestFixture] + public class TextReplacementTests + { + #region Test Data + string initialDocumentText = @" + + + +"; + + string finalDocumentText = @" + + + + + + + + + + + + +"; + + int offset = @" +".Length; + + string original = @" + + "; + + string replacement = @" + + + + + + + + + + + "; + #endregion + + [Test] + public void ReplacementTest1() + { + /* + * REPRODUCTION STEPS + * + * 1. Run XmlDOM project + * 2. paste text from initialDocumentText (see Test Data region) + * 3. select lines 4 to 6 + * 4. replace with replacement (see Test Data region) + * 5. exception thrown: + * ICSharpCode.AvalonEdit.Xml.InternalException : Assertion failed: cached elements must not have zero length + * at ICSharpCode.AvalonEdit.Xml.AXmlParser.Assert(Boolean condition, String message) + * in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\Xml\AXmlParser.cs:line 121 + * at ICSharpCode.AvalonEdit.Xml.TagReader.TryReadFromCacheOrNew[T](T& res, Predicate`1 condition) + * in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\Xml\TagReader.cs:line 39 + * at ICSharpCode.AvalonEdit.Xml.TagReader.d__12.MoveNext() + * in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\Xml\TagReader.cs:line 456 + * at System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1 collection) + * at System.Collections.Generic.List`1.AddRange(IEnumerable`1 collection) + * at ICSharpCode.AvalonEdit.Xml.TagReader.ReadAllTags() + * in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\Xml\TagReader.cs:line 73 + * at ICSharpCode.AvalonEdit.Xml.AXmlParser.Parse(String input, IEnumerable`1 changesSinceLastParse) + * in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\Xml\AXmlParser.cs:line 161 + * at ICSharpCode.AvalonEdit.Tests.XmlParser.TextReplacementTests.RunTest() + * in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit.Tests\XmlParser\TextReplacementTests.cs:line 114 + * at ICSharpCode.AvalonEdit.Tests.XmlParser.TextReplacementTests.TestMethod( + * ) in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit.Tests\XmlParser\TextReplacementTests.cs:line 97 + * */ + Assert.DoesNotThrow(RunTest1); + } + + void RunTest1() + { + AXmlParser parser = new AXmlParser(); + + try { + parser.Lock.EnterWriteLock(); + + parser.Parse(initialDocumentText, null); // full reparse + + IList changes = new List(); + + changes.Add(new DocumentChangeEventArgs(offset, original, replacement)); + + parser.Parse(finalDocumentText, changes); + } finally { + parser.Lock.ExitWriteLock(); + } + } + } +} diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Xml/TrackedSegmentCollection.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Xml/TrackedSegmentCollection.cs index 32dbcb2c1f..92cb3e1ec0 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Xml/TrackedSegmentCollection.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Xml/TrackedSegmentCollection.cs @@ -40,11 +40,11 @@ namespace ICSharpCode.AvalonEdit.Xml segments.UpdateOffsets(change); // Remove any items affected by the change - AXmlParser.Log("Changed offset {0}", change.Offset); + AXmlParser.Log("Changed {0}-{1}", change.Offset, change.Offset + change.InsertionLength); // Removing will cause one of the ends to be set to change.Offset // FindSegmentsContaining includes any segments touching // so that conviniently takes care of the +1 byte - var segmentsContainingOffset = segments.FindSegmentsContaining(change.Offset); + var segmentsContainingOffset = segments.FindOverlappingSegments(change.Offset, change.InsertionLength); foreach(AXmlObject obj in segmentsContainingOffset.OfType().Where(o => o.IsCached)) { InvalidateCache(obj, false); }