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); }
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); }