Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 15
0
        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.");
        }
Ejemplo n.º 16
0
        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);
        }
Ejemplo n.º 17
0
        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);
        }