Ejemplo n.º 1
0
        private void ShouldReturnExclusionsMarkedByStars(string xamlWithStars)
        {
            // Stars mark the boundaries of the excluded areas - there should always be an even number
            Assert.AreEqual(0, xamlWithStars.Count(c => c.ToString() == "☆") % 2, "Missing '☆' in xaml.");

            var expected = new Dictionary <int, int>()
            {
            };

            var actualXaml = xamlWithStars;

            while (actualXaml.Contains("☆"))
            {
                var areaStart = actualXaml.IndexOf("☆", StringComparison.Ordinal);
                var areaEnd   = actualXaml.IndexOf("☆", areaStart + 1, StringComparison.Ordinal) - 1; // remove 1 to account for the opening placeholder

                expected.Add(areaStart, areaEnd);

                actualXaml = actualXaml.Remove(areaStart, 1);
                actualXaml = actualXaml.Remove(areaEnd, 1);
            }

            var exclusions = InsertRowDefinitionAction.GetExclusions(actualXaml);

            Assert.IsNotNull(exclusions);
            Assert.AreEqual(expected.Count, exclusions.Count);

            foreach (var expectedKey in expected.Keys)
            {
                Assert.IsTrue(exclusions.ContainsKey(expectedKey), $"Missing expected exclusion starting {expectedKey}");
                Assert.AreEqual(exclusions[expectedKey], expected[expectedKey], $"Missing expected exclusion ending {expected[expectedKey]}");
            }
        }
        public void SwapReplacements_IgnoresSingleExclusion()
        {
            var original = "<Page>"
                           + Environment.NewLine + "    <Grid>"
                           + Environment.NewLine + "        <Grid.RowDefinitions>"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"Auto\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "        </Grid.RowDefinitions>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Text=\"Header\" Grid.Row=\"0\" />"
                           + Environment.NewLine + "        <Grid>"
                           + Environment.NewLine + "            <Grid.RowDefinitions>"
                           + Environment.NewLine + "                <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "                <RowDefinition Height=\"Auto\" />"
                           + Environment.NewLine + "                <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            </Grid.RowDefinitions>"
                           + Environment.NewLine + "            <TextBlock Text=\"nested-Body\" Grid.Row=\"1\" />"
                           + Environment.NewLine + "        </Grid>"
                           + Environment.NewLine + "        <TextBlock Text=\"Footer\" Grid.Row=\"2\" />"
                           + Environment.NewLine + "    </Grid>"
                           + Environment.NewLine + "</Page>";

            var expected = "<Page>"
                           + Environment.NewLine + "    <Grid>"
                           + Environment.NewLine + "        <Grid.RowDefinitions>"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"Auto\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "        </Grid.RowDefinitions>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Text=\"Header\" Grid.Row=\"0\" />"
                           + Environment.NewLine + "        <Grid>"
                           + Environment.NewLine + "            <Grid.RowDefinitions>"
                           + Environment.NewLine + "                <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "                <RowDefinition Height=\"Auto\" />"
                           + Environment.NewLine + "                <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            </Grid.RowDefinitions>"
                           + Environment.NewLine + "            <TextBlock Text=\"nested-Body\" Grid.Row=\"1\" />"
                           + Environment.NewLine + "        </Grid>"
                           + Environment.NewLine + "        <TextBlock Text=\"Footer\" Grid.Row=\"3\" />"
                           + Environment.NewLine + "    </Grid>"
                           + Environment.NewLine + "</Page>";

            // Get the position of the first grid and use it to find exclusions
            var exclusionGridPos = original.IndexOf("<Grid>", StringComparison.Ordinal);
            var exclusions       = InsertRowDefinitionAction.GetExclusions(original.Substring(exclusionGridPos));

            var actual = InsertRowDefinitionAction.SwapReplacements(
                original,
                InsertRowDefinitionAction.GetReplacements(1, 3),
                exclusions);

            StringAssert.AreEqual(expected, actual);
        }
        public void CreatePreviewCorrectly_WithNestedGrid_MultipleIdenticalRows()
        {
            var original = "<Page>"
                           + Environment.NewLine + "    <Grid>"
                           + Environment.NewLine + "        <Grid.RowDefinitions>"
                           + Environment.NewLine + "            ☆<RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"Auto\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "        </Grid.RowDefinitions>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <Grid Grid.Row=\"1\">"
                           + Environment.NewLine + "            <!-- content -->"
                           + Environment.NewLine + "        </Grid>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Text=\"Footer\" Grid.Row=\"2\" />"
                           + Environment.NewLine + "        <TextBlock Text=\"OtherFooter\" Grid.Row=\"2\" />"
                           + Environment.NewLine + "    </Grid>"
                           + Environment.NewLine + "</Page>";

            var expected = "<Page>"
                           + Environment.NewLine + "    <Grid>"
                           + Environment.NewLine + "        <Grid.RowDefinitions>"
                           + Environment.NewLine + "            <RowDefinition Height=\"XXX\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"Auto\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "        </Grid.RowDefinitions>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <Grid Grid.Row=\"2\">"
                           + Environment.NewLine + "            <!-- content -->"
                           + Environment.NewLine + "        </Grid>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Text=\"Footer\" Grid.Row=\"3\" />"
                           + Environment.NewLine + "        <TextBlock Text=\"OtherFooter\" Grid.Row=\"3\" />"
                           + Environment.NewLine + "    </Grid>"
                           + Environment.NewLine + "</Page>";

            var tag = new InsertRowDefinitionTag(new Span(0, 0), new FakeTextSnapshot(), "testfile.xaml", DefaultTestLogger.Create())
            {
                XamlTag      = "<RowDefinition Height=\"XXX\" />",
                InsertPoint  = original.IndexOf("☆", StringComparison.Ordinal),
                GridStartPos = 12,
            };

            var actual = InsertRowDefinitionAction.GetPreviewText(
                original.Replace("☆", string.Empty),
                InsertRowDefinitionAction.GetReplacements(1, 3),
                null,
                tag);

            StringAssert.AreEqual(expected, actual);
        }
Ejemplo n.º 4
0
        public void CreatePreviewCorrectly_Row1()
        {
            var original = "<Page>"
                           + Environment.NewLine + "    <Grid>"
                           + Environment.NewLine + "        <Grid.RowDefinitions>"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            ☆<RowDefinition Height=\"Auto\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "        </Grid.RowDefinitions>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Text=\"Footer\" Grid.Row=\"2\" />"
                           + Environment.NewLine + "    </Grid>"
                           + Environment.NewLine + "</Page>";

            var expected = "<Page>"
                           + Environment.NewLine + "    <Grid>"
                           + Environment.NewLine + "        <Grid.RowDefinitions>"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"XXX\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"Auto\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "        </Grid.RowDefinitions>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Text=\"Footer\" Grid.Row=\"3\" />"
                           + Environment.NewLine + "    </Grid>"
                           + Environment.NewLine + "</Page>";

            var tag = new InsertRowDefinitionTag(new Span(0, 0), new FakeTextSnapshot())
            {
                XamlTag      = "<RowDefinition Height=\"XXX\" />",
                InsertPoint  = original.IndexOf("☆", StringComparison.Ordinal),
                GridStartPos = 12,
            };

            var actual = InsertRowDefinitionAction.GetPreviewText(
                original.Replace("☆", string.Empty),
                InsertRowDefinitionAction.GetReplacements(1, 3),
                null,
                tag);

            StringAssert.AreEqual(expected, actual);
        }
        public IEnumerable <SuggestedActionSet> GetSuggestedActions(ISuggestedActionCategorySet requestedActionCategories, SnapshotSpan range, CancellationToken cancellationToken)
        {
            var list = new List <SuggestedActionSet>();

            try
            {
                var rxTags = this.GetTags(range);

                foreach (var rxTag in rxTags)
                {
                    switch (rxTag.SuggestedAction.Name)
                    {
                    case nameof(HardCodedStringAction):
                        list.AddRange(this.CreateActionSet(rxTag, new HardCodedStringAction(this.file, this.view, (HardCodedStringTag)rxTag)));
                        break;

                    case nameof(InsertRowDefinitionAction):
                        list.AddRange(this.CreateActionSet(rxTag, InsertRowDefinitionAction.Create((InsertRowDefinitionTag)rxTag, this.file, this.view)));
                        break;

                    case nameof(AddRowDefinitionsAction):
                        list.AddRange(this.CreateActionSet(rxTag, AddRowDefinitionsAction.Create((AddRowDefinitionsTag)rxTag, this.file)));
                        break;

                    case nameof(AddColumnDefinitionsAction):
                        list.AddRange(this.CreateActionSet(rxTag, AddColumnDefinitionsAction.Create((AddColumnDefinitionsTag)rxTag, this.file)));
                        break;

                    case nameof(AddRowAndColumnDefinitionsAction):
                        list.AddRange(this.CreateActionSet(rxTag, AddRowAndColumnDefinitionsAction.Create((AddRowAndColumnDefinitionsTag)rxTag, this.file)));
                        break;

                    case nameof(AddMissingRowDefinitionsAction):
                        list.AddRange(this.CreateActionSet(rxTag, AddMissingRowDefinitionsAction.Create((MissingRowDefinitionTag)rxTag, this.file)));
                        break;

                    case nameof(AddMissingColumnDefinitionsAction):
                        list.AddRange(this.CreateActionSet(rxTag, AddMissingColumnDefinitionsAction.Create((MissingColumnDefinitionTag)rxTag, this.file)));
                        break;

                    case nameof(RowSpanOverflowAction):
                        list.AddRange(this.CreateActionSet(rxTag, RowSpanOverflowAction.Create((RowSpanOverflowTag)rxTag, this.file)));
                        break;

                    case nameof(ColumnSpanOverflowAction):
                        list.AddRange(this.CreateActionSet(rxTag, ColumnSpanOverflowAction.Create((ColumnSpanOverflowTag)rxTag, this.file)));
                        break;

                    case nameof(AddTextBoxInputScopeAction):
                        list.AddRange(this.CreateActionSet(rxTag, AddTextBoxInputScopeAction.Create((AddTextBoxInputScopeTag)rxTag, this.file)));
                        break;

                    case nameof(MissingCheckBoxEventAction):
                        list.AddRange(this.CreateActionSet(rxTag, MissingCheckBoxEventAction.Create((CheckBoxCheckedAndUncheckedEventsTag)rxTag, this.file)));
                        break;

                    case nameof(MediaElementAction):
                        list.AddRange(this.CreateActionSet(rxTag, MediaElementAction.Create((UseMediaPlayerElementTag)rxTag, this.file)));
                        break;

                    case nameof(MakeNameStartWithCapitalAction):
                        list.AddRange(this.CreateActionSet(rxTag, MakeNameStartWithCapitalAction.Create((NameTitleCaseTag)rxTag, this.file)));
                        break;

                    case nameof(MakeUidStartWithCapitalAction):
                        list.AddRange(this.CreateActionSet(rxTag, MakeUidStartWithCapitalAction.Create((UidTitleCaseTag)rxTag, this.file)));
                        break;

                    case nameof(SelectedItemBindingModeAction):
                        list.AddRange(this.CreateActionSet(rxTag, SelectedItemBindingModeAction.Create((SelectedItemBindingModeTag)rxTag, this.file)));
                        break;

                    case nameof(CustomAnalysisAction):
                        list.AddRange(this.CreateActionSet(rxTag, CustomAnalysisAction.Create((CustomAnalysisTag)rxTag, this.file)));
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                SharedRapidXamlPackage.Logger?.RecordException(e);
            }

            return(list);
        }
        public IEnumerable <SuggestedActionSet> GetSuggestedActions(ISuggestedActionCategorySet requestedActionCategories, SnapshotSpan range, CancellationToken cancellationToken)
        {
            var list = new List <SuggestedActionSet>();

            try
            {
                var rxTags = this.GetTags(range);

                foreach (var rxTag in rxTags)
                {
                    switch (rxTag.SuggestedAction.Name)
                    {
                    case nameof(HardCodedStringAction):
                        list.AddRange(this.CreateActionSet(rxTag.Span, new HardCodedStringAction(this.file, this.view, (HardCodedStringTag)rxTag)));
                        break;

                    case nameof(InsertRowDefinitionAction):
                        list.AddRange(this.CreateActionSet(rxTag.Span, InsertRowDefinitionAction.Create((InsertRowDefinitionTag)rxTag, this.file, this.view)));
                        break;

                    case nameof(AddRowDefinitionsAction):
                        list.AddRange(this.CreateActionSet(rxTag.Span, AddRowDefinitionsAction.Create((AddRowDefinitionsTag)rxTag, this.file)));
                        break;

                    case nameof(AddColumnDefinitionsAction):
                        list.AddRange(this.CreateActionSet(rxTag.Span, AddColumnDefinitionsAction.Create((AddColumnDefinitionsTag)rxTag, this.file)));
                        break;

                    case nameof(AddRowAndColumnDefinitionsAction):
                        list.AddRange(this.CreateActionSet(rxTag.Span, AddRowAndColumnDefinitionsAction.Create((AddRowAndColumnDefinitionsTag)rxTag, this.file)));
                        break;

                    case nameof(AddMissingRowDefinitionsAction):
                        list.AddRange(this.CreateActionSet(rxTag.Span, AddMissingRowDefinitionsAction.Create((MissingRowDefinitionTag)rxTag, this.file)));
                        break;

                    case nameof(AddMissingColumnDefinitionsAction):
                        list.AddRange(this.CreateActionSet(rxTag.Span, AddMissingColumnDefinitionsAction.Create((MissingColumnDefinitionTag)rxTag, this.file)));
                        break;

                    case nameof(RowSpanOverflowAction):
                        list.AddRange(this.CreateActionSet(rxTag.Span, RowSpanOverflowAction.Create((RowSpanOverflowTag)rxTag, this.file)));
                        break;

                    case nameof(ColumnSpanOverflowAction):
                        list.AddRange(this.CreateActionSet(rxTag.Span, ColumnSpanOverflowAction.Create((ColumnSpanOverflowTag)rxTag, this.file)));
                        break;

                    case nameof(AddEntryKeyboardAction):
                        list.AddRange(this.CreateActionSet(rxTag.Span, AddEntryKeyboardAction.Create((AddEntryKeyboardTag)rxTag, this.file)));
                        break;

                    case nameof(AddTextBoxInputScopeAction):
                        list.AddRange(this.CreateActionSet(rxTag.Span, AddTextBoxInputScopeAction.Create((AddTextBoxInputScopeTag)rxTag, this.file)));
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                RapidXamlPackage.Logger?.RecordException(e);
            }

            return(list);
        }
        public void RealWorldExample()
        {
            var original = ""
                           + Environment.NewLine + "<Window"
                           + Environment.NewLine + "    x:Class=\"RxtWpfDemo.MainWindow\""
                           + Environment.NewLine + "    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\""
                           + Environment.NewLine + "    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\""
                           + Environment.NewLine + "    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\""
                           + Environment.NewLine + "    xmlns:local=\"clr-namespace:RxtWpfDemo\""
                           + Environment.NewLine + "    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\""
                           + Environment.NewLine + "    Title=\"MainWindow\""
                           + Environment.NewLine + "    Width=\"800\""
                           + Environment.NewLine + "    Height=\"450\""
                           + Environment.NewLine + "    mc:Ignorable=\"d\">"
                           + Environment.NewLine + "    <Grid>"
                           + Environment.NewLine + "        <Grid.RowDefinitions>"
                           + Environment.NewLine + "            <RowDefinition />"
                           + Environment.NewLine + "            ☆<RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition />"
                           + Environment.NewLine + "            <RowDefinition />"
                           + Environment.NewLine + "            <RowDefinition />"
                           + Environment.NewLine + "        </Grid.RowDefinitions>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Text=\"hello\" />"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Text=\"world\" />"
                           + Environment.NewLine + ""
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Grid.Row=\"2\" Text=\"line 3\" />"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <Grid>"
                           + Environment.NewLine + "            <TextBlock Text=\"hello world\" />"
                           + Environment.NewLine + "        </Grid>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <Button Grid.Row=\"1\" Content=\"click here\" />"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "    </Grid>"
                           + Environment.NewLine + "</Window>";

            var expected = ""
                           + Environment.NewLine + "<Window"
                           + Environment.NewLine + "    x:Class=\"RxtWpfDemo.MainWindow\""
                           + Environment.NewLine + "    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\""
                           + Environment.NewLine + "    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\""
                           + Environment.NewLine + "    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\""
                           + Environment.NewLine + "    xmlns:local=\"clr-namespace:RxtWpfDemo\""
                           + Environment.NewLine + "    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\""
                           + Environment.NewLine + "    Title=\"MainWindow\""
                           + Environment.NewLine + "    Width=\"800\""
                           + Environment.NewLine + "    Height=\"450\""
                           + Environment.NewLine + "    mc:Ignorable=\"d\">"
                           + Environment.NewLine + "    <Grid>"
                           + Environment.NewLine + "        <Grid.RowDefinitions>"
                           + Environment.NewLine + "            <RowDefinition />"
                           + Environment.NewLine + "            <RowDefinition Height=\"XXX\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition />"
                           + Environment.NewLine + "            <RowDefinition />"
                           + Environment.NewLine + "            <RowDefinition />"
                           + Environment.NewLine + "        </Grid.RowDefinitions>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Text=\"hello\" />"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Text=\"world\" />"
                           + Environment.NewLine + ""
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Grid.Row=\"3\" Text=\"line 3\" />"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <Grid>"
                           + Environment.NewLine + "            <TextBlock Text=\"hello world\" />"
                           + Environment.NewLine + "        </Grid>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <Button Grid.Row=\"2\" Content=\"click here\" />"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "    </Grid>"
                           + Environment.NewLine + "</Window>";

            var tag = new InsertRowDefinitionTag(new Span(0, 0), new FakeTextSnapshot(), "testfile.xaml", DefaultTestLogger.Create())
            {
                XamlTag      = "<RowDefinition Height=\"XXX\" />",
                InsertPoint  = original.IndexOf("☆", StringComparison.Ordinal),
                GridStartPos = 451,
            };

            var actual = InsertRowDefinitionAction.GetPreviewText(
                original.Replace("☆", string.Empty),
                InsertRowDefinitionAction.GetReplacements(1, 5),
                null,
                tag);

            StringAssert.AreEqual(expected, actual);
        }
        public void CreatePreviewCorrectly_WithNestedGrid_AndExclusions()
        {
            var original = "<Page>"
                           + Environment.NewLine + "    <Grid>"
                           + Environment.NewLine + "        <Grid.RowDefinitions>"
                           + Environment.NewLine + "            ☆<RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"Auto\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "        </Grid.RowDefinitions>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <Grid Grid.Row=\"1\">"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "            <TextBlock Tex=\"Excluded\" Grid.Row=\"2\" />"
                           + Environment.NewLine + "        </Grid>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Text=\"Footer\" Grid.Row=\"2\" />"
                           + Environment.NewLine + "    </Grid>"
                           + Environment.NewLine + "</Page>";

            var expected = "<Page>"
                           + Environment.NewLine + "    <Grid>"
                           + Environment.NewLine + "        <Grid.RowDefinitions>"
                           + Environment.NewLine + "            <RowDefinition Height=\"XXX\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"Auto\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "        </Grid.RowDefinitions>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <Grid Grid.Row=\"2\">"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + "            <RowDefinition Height=\"*\" />"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "            <TextBlock Tex=\"Excluded\" Grid.Row=\"2\" />"
                           + Environment.NewLine + "        </Grid>"
                           + Environment.NewLine + ""
                           + Environment.NewLine + "        <TextBlock Text=\"Footer\" Grid.Row=\"3\" />"
                           + Environment.NewLine + "    </Grid>"
                           + Environment.NewLine + "</Page>";

            var tag = new InsertRowDefinitionTag(new Span(0, 0), new FakeTextSnapshot(), "testfile.xaml", DefaultTestLogger.Create())
            {
                XamlTag      = "<RowDefinition Height=\"XXX\" />",
                InsertPoint  = original.IndexOf("☆", StringComparison.Ordinal),
                GridStartPos = 12,
            };

            var actualXaml = original.Replace("☆", string.Empty);

            // Get the position of the first grid and use it to find exclusions
            var exclusionGridPos = actualXaml.IndexOf("<Grid>", StringComparison.Ordinal);
            var exclusions       = InsertRowDefinitionAction.GetExclusions(actualXaml.Substring(exclusionGridPos));

            var actual = InsertRowDefinitionAction.GetPreviewText(
                actualXaml,
                InsertRowDefinitionAction.GetReplacements(1, 3),
                exclusions,
                tag);

            StringAssert.AreEqual(expected, actual);
        }