public void DetectsWhenConstructorContentIsNotAlreadySet() { var profile = TestProfile.CreateEmpty(); profile.Datacontext.CodeBehindConstructorContent = "DataContext = ViewModel"; var logger = DefaultTestLogger.Create(); var vs = new TestVisualStudioAbstraction { ActiveDocumentFileName = "TestPage.xaml.vb", ActiveDocumentText = @"Public NotInheritable Class TestPage Inherits Page Sub New() InitializeComponent() End Sub End Class", }; var fs = new TestFileSystem(); var sut = new SetDataContextCommandLogic(profile, logger, vs, fs); var result = sut.ShouldEnableCommand(); Assert.IsTrue(result); }
public void DetectsWhenPageContentIsNotAlreadySet() { var profile = TestProfile.CreateEmpty(); profile.ViewGeneration.XamlFileSuffix = "Page"; profile.ViewGeneration.ViewModelFileSuffix = "ViewModel"; profile.Datacontext.CodeBehindPageContent = @"Public ReadOnly Property ViewModel As $viewmodelclass$ Get Return New $viewmodelclass$ End Get End Property"; var logger = DefaultTestLogger.Create(); var vs = new TestVisualStudioAbstraction { ActiveDocumentFileName = "TestPage.xaml.vb", ActiveDocumentText = @"Public NotInheritable Class TestPage Inherits Page Sub New() InitializeComponent() End Sub End Class", }; var fs = new TestFileSystem(); var sut = new SetDataContextCommandLogic(profile, logger, vs, fs); var result = sut.ShouldEnableCommand(); Assert.IsTrue(result); }
public void CanDetectWhereAndWhenToInsertConstructorAndPageContentWhenConstructorExists() { var pageContent = "Public ReadOnly Property ViewModel As $viewmodelclass$" + Environment.NewLine + " Get" + Environment.NewLine + " Return New $viewmodelclass$" + Environment.NewLine + " End Get" + Environment.NewLine + "End Property"; var profile = TestProfile.CreateEmpty(); profile.ViewGeneration.XamlFileSuffix = "Page"; profile.ViewGeneration.ViewModelFileSuffix = "ViewModel"; profile.Datacontext.CodeBehindConstructorContent = "DataContext = ViewModel"; profile.Datacontext.CodeBehindPageContent = pageContent; var logger = DefaultTestLogger.Create(); var fs = new TestFileSystem { FileText = @"Public NotInheritable Class TestPage Inherits Page Sub New() InitializeComponent() End Sub End Class", }; var synTree = VisualBasicSyntaxTree.ParseText(fs.FileText); var vs = new TestVisualStudioAbstraction { ActiveDocumentFileName = "TestPage.xaml.vb", ActiveDocumentText = fs.FileText, SyntaxTree = synTree, DocumentIsCSharp = false, }; var sut = new SetDataContextCommandLogic(profile, logger, vs, fs); var documentRoot = synTree.GetRoot(); var result = sut.GetCodeBehindContentToAdd("TestPage", "TestViewModel", "TestVmNamespace", documentRoot); Assert.IsTrue(result[0].anythingToAdd); Assert.AreEqual(5, result[0].lineNoToAddAfter); StringAssert.AreEqual($"{Environment.NewLine}{Environment.NewLine}DataContext = ViewModel", result[0].contentToAdd); var expectedContent = "" + Environment.NewLine + "" + Environment.NewLine + "Public ReadOnly Property ViewModel As TestViewModel" + Environment.NewLine + " Get" + Environment.NewLine + " Return New TestViewModel" + Environment.NewLine + " End Get" + Environment.NewLine + "End Property"; Assert.IsTrue(result[1].anythingToAdd); Assert.AreEqual(8, result[1].lineNoToAddAfter); StringAssert.AreEqual(expectedContent, result[1].contentToAdd); }
public void CanDetectWhereAndWhatToInsert() { var profile = TestProfile.CreateEmpty(); profile.Datacontext.XamlPageAttribute = "DataContext=\"HasBeenSet\""; var logger = DefaultTestLogger.Create(); var vs = new TestVisualStudioAbstraction { ActiveDocumentFileName = "test.xaml", ActiveDocumentText = @"<Page xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" > <!-- Content would go here --> </Page>", }; var fs = new TestFileSystem(); var sut = new SetDataContextCommandLogic(profile, logger, vs, fs); var result = sut.GetPageAttributeToAdd("TestViewModel"); Assert.IsTrue(result.anythingToAdd); Assert.AreEqual(2, result.lineNoToAddAfter); Assert.AreEqual($"{Environment.NewLine} DataContext=\"HasBeenSet\"", result.contentToAdd); }
private void ParseWithoutError(string filePath, ProjectType projType) { var result = new RapidXamlDocument(); var text = File.ReadAllText(filePath); var snapshot = new FakeTextSnapshot(text.Length); var vsa = new TestVisualStudioAbstraction(); var logger = DefaultTestLogger.Create(); try { XamlElementExtractor.Parse( Path.GetFileName(filePath), snapshot, text, RapidXamlDocument.GetAllProcessors(projType, string.Empty, vsa, logger), result.Tags, null, RapidXamlDocument.GetEveryElementProcessor(projType, null, vsa), logger); } catch (Exception exc) { Assert.Fail($"Parsing failed for '{filePath}'{Environment.NewLine}{exc}"); } }
protected void EachPositionBetweenStarsShouldProduceExpected(string code, ParserOutput expected, bool isCSharp, Profile profileOverload) { this.EnsureTwoStars(code); var(startPos, endPos, actualCode) = this.GetCodeAndCursorRange(code); var syntaxTree = isCSharp ? CSharpSyntaxTree.ParseText(actualCode) : VisualBasicSyntaxTree.ParseText(actualCode); Assert.IsNotNull(syntaxTree); var semModel = isCSharp ? CSharpCompilation.Create(string.Empty).AddSyntaxTrees(syntaxTree).GetSemanticModel(syntaxTree, ignoreAccessibility: true) : VisualBasicCompilation.Create(string.Empty).AddSyntaxTrees(syntaxTree).GetSemanticModel(syntaxTree, ignoreAccessibility: true); var positionsTested = 0; for (var pos = startPos; pos < endPos; pos++) { var indent = new TestVisualStudioAbstraction().XamlIndent; var parser = isCSharp ? new CSharpParser(DefaultTestLogger.Create(), profileOverload.ProjectType, indent, profileOverload) as IDocumentParser : new VisualBasicParser(DefaultTestLogger.Create(), profileOverload.ProjectType, indent, profileOverload); var actual = parser.GetSingleItemOutput(syntaxTree.GetRoot(), semModel, pos); Assert.AreEqual(expected.OutputType, actual.OutputType, $"Failure at {pos} ({startPos}-{endPos})"); Assert.AreEqual(expected.Name, actual.Name, $"Failure at {pos} ({startPos}-{endPos})"); StringAssert.AreEqual(expected.Output, actual.Output, $"Failure at {pos} ({startPos}-{endPos})"); positionsTested += 1; } this.TestContext.WriteLine($"{positionsTested} different positions tested."); }
public void CanDetectIfNotAlreadySet() { var profile = TestProfile.CreateEmpty(); profile.Datacontext.XamlPageAttribute = "DataContext=\"HasBeenSet\""; var logger = DefaultTestLogger.Create(); var vs = new TestVisualStudioAbstraction { ActiveDocumentFileName = "test.xaml", ActiveDocumentText = @"<Page > <!-- Content would go here --> </Page>", }; var fs = new TestFileSystem(); var sut = new SetDataContextCommandLogic(profile, logger, vs, fs); var result = sut.ShouldEnableCommand(); Assert.IsTrue(result); }
public async Task FileExistsAndDoNotOverwriteMeansNoNewFileCreatedAsync() { var profile = this.GetDefaultTestProfile(); profile.ViewGeneration.AllInSameProject = true; profile.ViewGeneration.ViewModelDirectoryName = "ViewModels"; profile.ViewGeneration.ViewModelFileSuffix = "ViewModel"; profile.ViewGeneration.XamlFileDirectoryName = "Views"; profile.ViewGeneration.XamlFileSuffix = "Page"; var fs = new TestFileSystem { FileExistsResponse = true, FileText = " public class TestViewModel { public string OnlyProperty { get; set;} }", }; var synTree = CSharpSyntaxTree.ParseText(fs.FileText); var semModel = CSharpCompilation.Create(string.Empty).AddSyntaxTrees(synTree).GetSemanticModel(synTree, ignoreAccessibility: true); var vsa = new TestVisualStudioAbstraction { UserConfirmsResult = false, SyntaxTree = synTree, SemanticModel = semModel, ActiveProject = new ProjectWrapper() { Name = "App", FileName = @"C:\Test\App\App.csproj" }, }; var sut = new CreateViewCommandLogic(DefaultTestLogger.Create(), vsa, fs, profile); await sut.ExecuteAsync(@"C:\Test\App\ViewModels\TestViewModel.cs"); Assert.IsFalse(sut.CreateView); }
public void DetectsWhenConstructorContentIsNotAlreadySet() { var profile = TestProfile.CreateEmpty(); profile.Datacontext.CodeBehindConstructorContent = "this.DataContext = this.ViewModel;"; var logger = DefaultTestLogger.Create(); var vs = new TestVisualStudioAbstraction { ActiveDocumentFileName = "test.xaml.cs", ActiveDocumentText = @"class TestPage { public TestPage() { this.Initialize(); } }", }; var fs = new TestFileSystem(); var sut = new SetDataContextCommandLogic(profile, logger, vs, fs); var result = sut.ShouldEnableCommand(); Assert.IsTrue(result); }
public void OnlyElementsThatContainAreAnalyzed() { var xaml = @" <StackPanel> <TextBlock Text=""Something"" /> <TextBlock Text=""{Binding SomeVmProperty}"" /> <TextBlock Text=""{x:Bind}"" /> </StackPanel>"; var result = new RapidXamlDocument(); var snapshot = new FakeTextSnapshot(); var logger = DefaultTestLogger.Create(); var vsa = new TestVisualStudioAbstraction(); var processors = RapidXamlDocument.WrapCustomProcessors( new List <ICustomAnalyzer> { new AnyContainingCustomAnalyzer() }, ProjectType.Unknown, string.Empty, logger, vsa); XamlElementExtractor.Parse("Generic.xaml", snapshot, xaml, processors.ToList(), result.Tags, null, null, logger); Assert.AreEqual(1, AnyContainingCustomAnalyzer.AnalyzeCallCount); }
public void DetectsWhenPageContentIsNotAlreadySet() { var profile = TestProfile.CreateEmpty(); profile.ViewGeneration.XamlFileSuffix = "Page"; profile.ViewGeneration.ViewModelFileSuffix = "ViewModel"; profile.Datacontext.CodeBehindPageContent = @"public $viewmodelclass$ ViewModel { get { return new $viewmodelclass$(); } }"; var logger = DefaultTestLogger.Create(); var vs = new TestVisualStudioAbstraction { ActiveDocumentFileName = "Testpage.xaml.cs", ActiveDocumentText = @"class TestPage { public TestPage() { this.Initialize(); } }", }; var fs = new TestFileSystem(); var sut = new SetDataContextCommandLogic(profile, logger, vs, fs); var result = sut.ShouldEnableCommand(); Assert.IsTrue(result); }
public void CanDetectWhereAndWhenToInsertPageContentAndConstructorExists() { var pageContent = "public $viewmodelclass$ ViewModel" + Environment.NewLine + "{" + Environment.NewLine + " get" + Environment.NewLine + " {" + Environment.NewLine + " return new $viewmodelclass$();" + Environment.NewLine + " }" + Environment.NewLine + "}"; var profile = TestProfile.CreateEmpty(); profile.ViewGeneration.XamlFileSuffix = "Page"; profile.ViewGeneration.ViewModelFileSuffix = "ViewModel"; profile.Datacontext.CodeBehindPageContent = pageContent; var logger = DefaultTestLogger.Create(); var fileText = "class TestPage" + Environment.NewLine + "{" + Environment.NewLine + " public TestPage()" + Environment.NewLine + " {" + Environment.NewLine + " this.Initialize();" + Environment.NewLine + " }" + Environment.NewLine + "}"; var fs = new TestFileSystem { FileText = fileText, }; var synTree = CSharpSyntaxTree.ParseText(fs.FileText); var vs = new TestVisualStudioAbstraction { ActiveDocumentFileName = "TestPage.xaml.cs", ActiveDocumentText = fs.FileText, SyntaxTree = synTree, DocumentIsCSharp = true, }; var sut = new SetDataContextCommandLogic(profile, logger, vs, fs); var (anythingToAdd, lineNoToAddAfter, contentToAdd) = sut.GetCodeBehindPageContentToAdd(vs.ActiveDocumentText, vs.SyntaxTree.GetRoot(), "TestViewModel", "TestVmNamespace"); var expectedContent = "" + Environment.NewLine + "" + Environment.NewLine + "public TestViewModel ViewModel" + Environment.NewLine + "{" + Environment.NewLine + " get" + Environment.NewLine + " {" + Environment.NewLine + " return new TestViewModel();" + Environment.NewLine + " }" + Environment.NewLine + "}"; Assert.IsTrue(anythingToAdd); Assert.AreEqual(6, lineNoToAddAfter); StringAssert.AreEqual(expectedContent, contentToAdd); }
public void Parse(string fileName) { var result = new RapidXamlDocument(); var text = File.ReadAllText($".\\files\\{fileName}"); var snapshot = new FakeTextSnapshot(text.Length); var vsa = new TestVisualStudioAbstraction(); var logger = DefaultTestLogger.Create(); XamlElementExtractor.Parse(fileName, snapshot, text, RapidXamlDocument.GetAllProcessors(ProjectType.Uwp, string.Empty, vsa, logger), result.Tags, null, RapidXamlDocument.GetEveryElementProcessor(ProjectType.Uwp, null, vsa), logger); }
public void CanDetectWhereAndWhenToInsertPageContentAndConstructorExists() { var profile = TestProfile.CreateEmpty(); profile.ViewGeneration.XamlFileSuffix = "Page"; profile.ViewGeneration.ViewModelFileSuffix = "ViewModel"; profile.Datacontext.CodeBehindPageContent = @"Public ReadOnly Property ViewModel As $viewmodelclass$ Get Return New $viewmodelclass$ End Get End Property"; var logger = DefaultTestLogger.Create(); var fs = new TestFileSystem { FileText = @"Public NotInheritable Class TestPage Inherits Page Sub New() InitializeComponent() End Sub End Class", }; var synTree = VisualBasicSyntaxTree.ParseText(fs.FileText); var vs = new TestVisualStudioAbstraction { ActiveDocumentFileName = "TestPage.xaml.vb", ActiveDocumentText = fs.FileText, SyntaxTree = synTree, DocumentIsCSharp = false, }; var sut = new SetDataContextCommandLogic(profile, logger, vs, fs); var(anythingToAdd, lineNoToAddAfter, contentToAdd) = sut.GetCodeBehindPageContentToAdd(vs.ActiveDocumentText, vs.SyntaxTree.GetRoot(), "TestViewModel", "TestVmNamespace"); var expectedContent = @" Public ReadOnly Property ViewModel As TestViewModel Get Return New TestViewModel End Get End Property"; Assert.IsTrue(anythingToAdd); Assert.AreEqual(6, lineNoToAddAfter); Assert.AreEqual(expectedContent, contentToAdd); }
public void Real_AsyncRelayCommandPage() { var result = new RapidXamlDocument(); var text = File.ReadAllText(".\\Misc\\AsyncRelayCommandPage.xaml"); var snapshot = new FakeTextSnapshot(text.Length); var vsa = new TestVisualStudioAbstraction(); var logger = DefaultTestLogger.Create(); XamlElementExtractor.Parse("AsyncRelayCommandPage.xaml", snapshot, text, RapidXamlDocument.GetAllProcessors(ProjectType.Uwp, string.Empty, vsa, logger), result.Tags, null, RapidXamlDocument.GetEveryElementProcessor(ProjectType.Uwp, null, vsa), logger); Assert.IsTrue(true, "Got here without error."); }
public void CanDetectWhereAndWhenToInsertConstructorContentAndConstructorDoesNotExist() { var defaultConstructor = "Sub New()" + Environment.NewLine + " InitializeComponent()" + Environment.NewLine + "End Sub"; var profile = TestProfile.CreateEmpty(); profile.Datacontext.CodeBehindConstructorContent = "DataContext = ViewModel"; profile.Datacontext.DefaultCodeBehindConstructor = defaultConstructor; var logger = DefaultTestLogger.Create(); var fs = new TestFileSystem { FileText = @"Public NotInheritable Class TestPage Inherits Page End Class", }; var synTree = VisualBasicSyntaxTree.ParseText(fs.FileText); var vs = new TestVisualStudioAbstraction { ActiveDocumentFileName = "TestPage.xaml.vb", ActiveDocumentText = fs.FileText, SyntaxTree = synTree, DocumentIsCSharp = false, }; var sut = new SetDataContextCommandLogic(profile, logger, vs, fs); var(anythingToAdd, lineNoToAddAfter, contentToAdd, constructorAdded) = sut.GetCodeBehindConstructorContentToAdd(vs.ActiveDocumentText, vs.SyntaxTree.GetRoot(), "TestPage", "TestViewModel"); var expectedContent = "" + Environment.NewLine + "Sub New()" + Environment.NewLine + " InitializeComponent()" + Environment.NewLine + "" + Environment.NewLine + "DataContext = ViewModel" + Environment.NewLine + "End Sub" + Environment.NewLine + ""; Assert.IsTrue(anythingToAdd); Assert.AreEqual(2, lineNoToAddAfter); StringAssert.AreEqual(expectedContent, contentToAdd); Assert.IsTrue(constructorAdded); }
public void Real_Generic() { var result = new RapidXamlDocument(); var text = File.ReadAllText(".\\Misc\\Generic.xaml"); var snapshot = new FakeTextSnapshot(); var vsa = new TestVisualStudioAbstraction(); var logger = DefaultTestLogger.Create(); XamlElementExtractor.Parse("Generic.xaml", snapshot, text, RapidXamlDocument.GetAllProcessors(ProjectType.Uwp, string.Empty, vsa, logger), result.Tags, null, RapidXamlDocument.GetEveryElementProcessor(ProjectType.Uwp, null, vsa), logger); Assert.AreEqual(0, result.Tags.OfType <MissingRowDefinitionTag>().Count()); Assert.AreEqual(0, result.Tags.OfType <MissingColumnDefinitionTag>().Count()); }
public void CanDetectWhereAndWhenToInsertConstructorContentAndConstructorDoesNotExist() { var profile = TestProfile.CreateEmpty(); profile.Datacontext.CodeBehindConstructorContent = "this.DataContext = this.ViewModel;"; profile.Datacontext.DefaultCodeBehindConstructor = @"public $viewclass$() { this.Initialize(); }"; var logger = DefaultTestLogger.Create(); var fs = new TestFileSystem { FileText = @"class TestPage { }", }; var synTree = CSharpSyntaxTree.ParseText(fs.FileText); var vs = new TestVisualStudioAbstraction { ActiveDocumentFileName = "test.xaml.cs", ActiveDocumentText = fs.FileText, SyntaxTree = synTree, DocumentIsCSharp = true, }; var sut = new SetDataContextCommandLogic(profile, logger, vs, fs); var(anythingToAdd, lineNoToAddAfter, contentToAdd, constructorAdded) = sut.GetCodeBehindConstructorContentToAdd(vs.ActiveDocumentText, vs.SyntaxTree.GetRoot(), "TestPage", "TestViewModel"); var expectedContent = @" public TestPage() { this.Initialize(); this.DataContext = this.ViewModel; } "; Assert.IsTrue(anythingToAdd); Assert.AreEqual(2, lineNoToAddAfter); Assert.AreEqual(expectedContent, contentToAdd); Assert.IsTrue(constructorAdded); }
protected async Task PositionAtStarShouldProduceExpectedUsingAdditionalLibraries(string code, ParserOutput expected, bool isCSharp, Profile profileOverload, params string[] additionalLibraryPaths) { this.EnsureOneStar(code); var(pos, actualCode) = this.GetCodeAndCursorPos(code); var projectId = ProjectId.CreateNewId(); var documentId = DocumentId.CreateNewId(projectId); var language = isCSharp ? LanguageNames.CSharp : LanguageNames.VisualBasic; var fileExt = isCSharp ? "cs" : "vb"; Solution solution; using (var adhocWorkspace = new AdhocWorkspace()) { solution = adhocWorkspace.CurrentSolution .AddProject(projectId, "MyProject", "MyProject", language) .AddDocument(documentId, $"MyFile.{fileExt}", actualCode); } foreach (var libPath in additionalLibraryPaths) { var lib = MetadataReference.CreateFromFile(libPath); solution = solution.AddMetadataReference(projectId, lib); } var document = solution.GetDocument(documentId); var semModel = await document.GetSemanticModelAsync(); var syntaxTree = await document.GetSyntaxTreeAsync(); var indent = new TestVisualStudioAbstraction().XamlIndent; var parser = isCSharp ? new CSharpParser(DefaultTestLogger.Create(), profileOverload.ProjectType, indent, profileOverload) as IDocumentParser : new VisualBasicParser(DefaultTestLogger.Create(), profileOverload.ProjectType, indent, profileOverload); var actual = parser.GetSingleItemOutput(await syntaxTree.GetRootAsync(), semModel, pos); this.AssertOutput(expected, actual); }
public void LazyLoading_Children_GetsCorrectLocations() { var xaml = "<StackPanel>" + Environment.NewLine + " <Container>" + Environment.NewLine + " <TextBlock Text=\"Repeated\" />" + Environment.NewLine + " </Container>" + Environment.NewLine + " <Container>" + Environment.NewLine + " <TextBlock Text=\"Repeated\" />" + Environment.NewLine + " </Container>" + Environment.NewLine + " <Grid>" + Environment.NewLine + " <Container>" + Environment.NewLine + " <TextBlock Text=\"Repeated\" />" + Environment.NewLine + " </Container>" + Environment.NewLine + " </Grid>" + Environment.NewLine + "</StackPanel>"; var result = new RapidXamlDocument(); var snapshot = new FakeTextSnapshot(xaml.Length); var logger = DefaultTestLogger.Create(); var vsa = new TestVisualStudioAbstraction(); var analyzer = new LazyLoadingTestAnalyzer(); var processors = RapidXamlDocument.WrapCustomProcessors( new List <ICustomAnalyzer> { analyzer }, ProjectType.Unknown, string.Empty, logger, vsa); XamlElementExtractor.Parse("Generic.xaml", snapshot, xaml, processors.ToList(), result.Tags, null, null, logger); var e1 = analyzer.Elements[1]; var e2 = analyzer.Elements[3]; var e3 = analyzer.Elements[5]; Assert.AreEqual(37 + (Environment.NewLine.Length * 1), e1.Children[0].Location.Start); Assert.AreEqual(105 + (Environment.NewLine.Length * 4), e2.Children[0].Location.Start); Assert.AreEqual(191 + (Environment.NewLine.Length * 8), e3.Children[0].Location.Start); }
protected (IFileSystemAbstraction fs, IVisualStudioAbstraction vsa) GetVbAbstractions(string fileContents) { var fs = new TestFileSystem { FileExistsResponse = true, FileText = fileContents, }; var synTree = VisualBasicSyntaxTree.ParseText(fs.FileText); var semModel = VisualBasicCompilation.Create(string.Empty).AddSyntaxTrees(synTree).GetSemanticModel(synTree, ignoreAccessibility: true); var vsa = new TestVisualStudioAbstraction { SyntaxTree = synTree, SemanticModel = semModel, XamlIndent = 4, }; return(fs, vsa); }
protected void PositionAtStarShouldProduceExpected(string code, ParserOutput expected, bool isCSharp, Profile profileOverload) { this.EnsureOneStar(code); var(pos, actualCode) = this.GetCodeAndCursorPos(code); var syntaxTree = isCSharp ? CSharpSyntaxTree.ParseText(actualCode) : VisualBasicSyntaxTree.ParseText(actualCode); Assert.IsNotNull(syntaxTree); var semModel = isCSharp ? CSharpCompilation.Create(string.Empty).AddSyntaxTrees(syntaxTree).GetSemanticModel(syntaxTree, true) : VisualBasicCompilation.Create(string.Empty).AddSyntaxTrees(syntaxTree).GetSemanticModel(syntaxTree, true); var indent = new TestVisualStudioAbstraction().XamlIndent; var parser = isCSharp ? new CSharpParser(DefaultTestLogger.Create(), indent, profileOverload) as IDocumentParser : new VisualBasicParser(DefaultTestLogger.Create(), indent, profileOverload); var actual = parser.GetSingleItemOutput(syntaxTree.GetRoot(), semModel, pos); this.AssertOutput(expected, actual); }
public void PassNoXmlnsToAnalyzers() { var tags = new TagList(); var xaml = "<Page>" + Environment.NewLine + " <TestElement />" + Environment.NewLine + "</Page>"; var snapshot = new FakeTextSnapshot(xaml.Length); var vsa = new TestVisualStudioAbstraction(); var logger = DefaultTestLogger.Create(); var analyzer = new XmnlsCounterAnalyzer(); var processors = new List <(string, XamlElementProcessor)> { (analyzer.TargetType(), new CustomProcessorWrapper(analyzer, ProjectType.Any, string.Empty, logger, vsa)), }; XamlElementExtractor.Parse("testfile.xaml", snapshot, xaml, processors, tags, null, RapidXamlDocument.GetEveryElementProcessor(ProjectType.Any, null, vsa), logger); Assert.AreEqual(0, analyzer.Count); }
protected void SelectionBetweenStarsShouldProduceExpected(string code, AnalyzerOutput expected, bool isCSharp, Profile profileOverload) { this.EnsureTwoStars(code); var(startPos, endPos, actualCode) = this.GetCodeAndCursorRange(code); var syntaxTree = isCSharp ? CSharpSyntaxTree.ParseText(actualCode) : VisualBasicSyntaxTree.ParseText(actualCode); Assert.IsNotNull(syntaxTree); var semModel = isCSharp ? CSharpCompilation.Create(string.Empty).AddSyntaxTrees(syntaxTree).GetSemanticModel(syntaxTree, true) : VisualBasicCompilation.Create(string.Empty).AddSyntaxTrees(syntaxTree).GetSemanticModel(syntaxTree, true); var indent = new TestVisualStudioAbstraction().XamlIndent; var analyzer = isCSharp ? new CSharpAnalyzer(DefaultTestLogger.Create(), indent) as IDocumentAnalyzer : new VisualBasicAnalyzer(DefaultTestLogger.Create(), indent); var actual = analyzer.GetSelectionOutput(syntaxTree.GetRoot(), semModel, startPos, endPos, profileOverload); this.AssertOutput(expected, actual); }
protected void PositionAtStarShouldProduceExpectedUsingAdditonalReferences(string code, AnalyzerOutput expected, bool isCSharp, Profile profileOverload, params string[] additionalReferences) { this.EnsureOneStar(code); var(pos, actualCode) = this.GetCodeAndCursorPos(code); var projectId = ProjectId.CreateNewId(); var documentId = DocumentId.CreateNewId(projectId); var language = isCSharp ? LanguageNames.CSharp : LanguageNames.VisualBasic; var fileExt = isCSharp ? "cs" : "vb"; var solution = new AdhocWorkspace().CurrentSolution .AddProject(projectId, "MyProject", "MyProject", language) .AddDocument(documentId, $"MyFile.{fileExt}", actualCode); foreach (var addRef in additionalReferences) { var lib = MetadataReference.CreateFromFile(Type.GetType(addRef)?.Assembly.Location); solution = solution.AddMetadataReference(projectId, lib); } var document = solution.GetDocument(documentId); var semModel = document.GetSemanticModelAsync().Result; var syntaxTree = document.GetSyntaxTreeAsync().Result; var indent = new TestVisualStudioAbstraction().XamlIndent; var analyzer = isCSharp ? new CSharpAnalyzer(DefaultTestLogger.Create(), indent) as IDocumentAnalyzer : new VisualBasicAnalyzer(DefaultTestLogger.Create(), indent); var actual = analyzer.GetSingleItemOutput(syntaxTree.GetRoot(), semModel, pos, profileOverload); this.AssertOutput(expected, actual); }
public void CheckEveryElementVisited() { var xaml = @" <Page x:Name=""lowerCased1""> <Grid x:Name=""lowerCased2""> <TextBlock x:Name=""lowerCased3""></TextBlock> <TextBlock x:Name=""lowerCased4"" /> </Grid> <TextBlock x:Name=""lowerCased5"" /> </Page>"; var result = new RapidXamlDocument(); var snapshot = new FakeTextSnapshot(xaml.Length); var logger = DefaultTestLogger.Create(); var vsa = new TestVisualStudioAbstraction(); var procesors = RapidXamlDocument.GetAllProcessors(ProjectType.Uwp, string.Empty, vsa, logger); XamlElementExtractor.Parse("Generic.xaml", snapshot, xaml, procesors, result.Tags, null, RapidXamlDocument.GetEveryElementProcessor(ProjectType.Uwp, null, vsa), logger); Assert.AreEqual(5, result.Tags.OfType <NameTitleCaseTag>().Count()); }
public void EnsureCustomAnalyzersGetTheRightAnalyzedElement() { var tags = new TagList(); var xaml = "<Page>" + Environment.NewLine + "<WebView></WebView>" + Environment.NewLine + "<WebView></WebView>" + Environment.NewLine + "</Page>"; var snapshot = new FakeTextSnapshot(xaml.Length); var vsa = new TestVisualStudioAbstraction(); var logger = DefaultTestLogger.Create(); var processors = new List <(string, XamlElementProcessor)> { ("WebView", new CustomProcessorWrapper(new WebViewToWebView2Basic(), ProjectType.Any, string.Empty, logger, vsa)), }; XamlElementExtractor.Parse("testfile.xaml", snapshot, xaml, processors, tags, null, RapidXamlDocument.GetEveryElementProcessor(ProjectType.Any, null, vsa), logger); Assert.AreEqual(2, tags.Count); Assert.AreEqual(8, (tags[0] as CustomAnalysisTag).AnalyzedElement.Location.Start); Assert.AreEqual(29, (tags[1] as CustomAnalysisTag).AnalyzedElement.Location.Start); }
public async Task CorrectOutputInOtherProjectAsync() { var profile = this.GetDefaultTestProfile(); profile.ViewGeneration.AllInSameProject = false; profile.ViewGeneration.XamlProjectSuffix = string.Empty; profile.ViewGeneration.ViewModelProjectSuffix = ".ViewModels"; profile.ViewGeneration.ViewModelDirectoryName = ""; profile.ViewGeneration.ViewModelFileSuffix = "ViewModel"; profile.ViewGeneration.XamlFileDirectoryName = "Views"; profile.ViewGeneration.XamlFileSuffix = "Page"; var fs = new TestFileSystem { FileExistsResponse = false, FileText = @"Public Class TestViewModel Public Property OnlyProperty As String End Class", }; var synTree = VisualBasicSyntaxTree.ParseText(fs.FileText); var semModel = VisualBasicCompilation.Create(string.Empty).AddSyntaxTrees(synTree).GetSemanticModel(synTree, ignoreAccessibility: true); var vsa = new TestVisualStudioAbstraction { SyntaxTree = synTree, SemanticModel = semModel, ActiveProject = new ProjectWrapper { Name = "App.ViewModels", FileName = @"C:\Test\App.ViewModels\App.ViewModels.vbproj" }, NamedProject = new ProjectWrapper { Name = "App", FileName = @"C:\Test\App\App.vbproj" }, }; var sut = new CreateViewCommandLogic(DefaultTestLogger.Create(), vsa, fs, profile); await sut.ExecuteAsync(@"C:\Test\App.ViewModels\TestViewModel.vb"); var expectedXaml = "<Page" + Environment.NewLine + " x:Class=\"App.Views.TestPage\">" + Environment.NewLine + " <Grid>" + Environment.NewLine + " <StackPanel>" + Environment.NewLine + " <TextBlock FB=\"True\" Text=\"OnlyProperty\" />" + Environment.NewLine + " </StackPanel>" + Environment.NewLine + " </Grid>" + Environment.NewLine + "</Page>" + Environment.NewLine + ""; var expectedCodeBehind = "Imports System" + Environment.NewLine + "Imports Windows.UI.Xaml.Controls" + Environment.NewLine + "Imports App.ViewModels" + Environment.NewLine + "" + Environment.NewLine + "Namespace Views" + Environment.NewLine + "" + Environment.NewLine + " Public NotInheritable Partial Class TestPage" + Environment.NewLine + " Inherits Page" + Environment.NewLine + "" + Environment.NewLine + " Public Property ViewModel As TestViewModel" + Environment.NewLine + "" + Environment.NewLine + " Public Sub New()" + Environment.NewLine + " Me.InitializeComponent()" + Environment.NewLine + " Me.ViewModel = New TestViewModel()" + Environment.NewLine + " End Sub" + Environment.NewLine + " End Class" + Environment.NewLine + "End Namespace" + Environment.NewLine + ""; Assert.IsTrue(sut.CreateView); Assert.AreEqual(@"C:\Test\App\Views\TestPage.xaml", sut.XamlFileName); Assert.AreEqual(@"C:\Test\App\Views\TestPage.xaml.vb", sut.CodeFileName); StringAssert.AreEqual(expectedXaml, sut.XamlFileContents); StringAssert.AreEqual(expectedCodeBehind, sut.CodeFileContents); }
public async Task CorrectOutputInSameFolderAsync() { var profile = this.GetDefaultTestProfile(); profile.ViewGeneration.AllInSameProject = true; profile.ViewGeneration.ViewModelDirectoryName = "Files"; profile.ViewGeneration.ViewModelFileSuffix = "ViewModel"; profile.ViewGeneration.XamlFileDirectoryName = "Files"; profile.ViewGeneration.XamlFileSuffix = "Page"; var fs = new TestFileSystem { FileExistsResponse = false, FileText = @"Public Class TestViewModel Public Property OnlyProperty As String End Class", }; var synTree = VisualBasicSyntaxTree.ParseText(fs.FileText); var semModel = VisualBasicCompilation.Create(string.Empty).AddSyntaxTrees(synTree).GetSemanticModel(synTree, ignoreAccessibility: true); var vsa = new TestVisualStudioAbstraction { SyntaxTree = synTree, SemanticModel = semModel, ActiveProject = new ProjectWrapper() { Name = "App", FileName = @"C:\Test\App\App.vbproj" }, }; var sut = new CreateViewCommandLogic(profile, DefaultTestLogger.Create(), vsa, fs); await sut.ExecuteAsync(@"C:\Test\App\Files\TestViewModel.vb"); var expectedXaml = @"<Page x:Class=""App.Files.TestPage""> <Grid> <StackPanel> <TextBlock FB=""True"" Text=""OnlyProperty"" /> </StackPanel> </Grid> </Page> "; var expectedCodeBehind = @"Imports System Imports Windows.UI.Xaml.Controls Imports App.Files Namespace Files Public NotInheritable Partial Class TestPage Inherits Page Public Property ViewModel As TestViewModel Public Sub New() Me.InitializeComponent() Me.ViewModel = New TestViewModel() End Sub End Class End Namespace "; Assert.IsTrue(sut.CreateView); Assert.AreEqual(@"C:\Test\App\Files\TestPage.xaml", sut.XamlFileName); Assert.AreEqual(@"C:\Test\App\Files\TestPage.xaml.vb", sut.CodeFileName); Assert.AreEqual(expectedXaml, sut.XamlFileContents); Assert.AreEqual(expectedCodeBehind, sut.CodeFileContents); }
public void CanDetectWhereAndWhenToInsertConstructorAndPageContentWhenConstructorDoesNotExist() { var profile = TestProfile.CreateEmpty(); profile.ViewGeneration.XamlFileSuffix = "Page"; profile.ViewGeneration.ViewModelFileSuffix = "ViewModel"; profile.Datacontext.CodeBehindConstructorContent = "this.DataContext = this.ViewModel;"; profile.Datacontext.DefaultCodeBehindConstructor = @"public $viewclass$() { this.Initialize(); }"; profile.Datacontext.CodeBehindPageContent = @"public $viewmodelclass$ ViewModel { get { return new $viewmodelclass$(); } }"; var logger = DefaultTestLogger.Create(); var fs = new TestFileSystem { FileText = @"class TestPage { }", }; var synTree = CSharpSyntaxTree.ParseText(fs.FileText); var vs = new TestVisualStudioAbstraction { ActiveDocumentFileName = "TestPage.xaml.cs", ActiveDocumentText = fs.FileText, SyntaxTree = synTree, DocumentIsCSharp = true, }; var sut = new SetDataContextCommandLogic(profile, logger, vs, fs); var documentRoot = synTree.GetRoot(); var result = sut.GetCodeBehindContentToAdd("TestPage", "TestViewModel", "TestVmNamespace", documentRoot); var expectedContent0 = @" public TestPage() { this.Initialize(); this.DataContext = this.ViewModel; } "; Assert.IsTrue(result[0].anythingToAdd); Assert.AreEqual(2, result[0].lineNoToAddAfter); Assert.AreEqual(expectedContent0, result[0].contentToAdd); var expectedContent1 = @" public TestViewModel ViewModel { get { return new TestViewModel(); } }"; Assert.IsTrue(result[1].anythingToAdd); Assert.AreEqual(8, result[1].lineNoToAddAfter); Assert.AreEqual(expectedContent1, result[1].contentToAdd); }