public void ShouldBeAbleToSpecifyArbitraryProjectName()
        {
            // Arrange
            var solutionManager = new MockSolutionManagerBuilder(
                new MockProject("firstProject"),
                new MockProject("secondProject")
            {
                RootPath = "second:\\root"
            }
                ).Build();
            var mockFileSystem = new Mock <IFileSystem>().WithExampleTemplate("requestedTemplate", "fixedStringTemplate");

            // Act
            var results = new InvokeScaffoldTemplateCmdlet(solutionManager, mockFileSystem.Object)
            {
                OutputPath = "someFolder\\someFile.ext",
                Template   = "requestedTemplate",
                Project    = "secondProject"
            }.GetResults <string>();

            // Assert
            Assert.AreEqual("someFolder\\someFile.ext", results.Single());
            mockFileSystem.Verify(x => x.WriteAllText("second:\\root\\someFolder\\someFile.ext", "Fixed string output from template"));
            Assert.IsNotNull(solutionManager.GetProject("secondProject").GetProjectItem("someFolder\\someFile.ext"));
        }
        private static string RunTemplateRenderingTest(string exampleTemplateName, Hashtable model, IEnumerable <Assembly> projectAssemblyReferences = null, string expectedOutputExtension = null)
        {
            // Arrange: Project containing a single folder
            var solutionManager = new MockSolutionManagerBuilder(new MockProject(new MockFolder("someFolder"))
            {
                RootPath   = "z:\\proj",
                References = projectAssemblyReferences != null ? projectAssemblyReferences.Select(x => x.Location) : new string[] { }
            }).Build();

            // Arrange: Filesystem that has template and captures attempt to write rendered output to disk
            var requestedOutputPath             = "someFolder\\nonExistentFolder\\file.ext";
            var expectedOutputPathWithExtension = requestedOutputPath;

            if (!string.IsNullOrEmpty(expectedOutputExtension))
            {
                expectedOutputPathWithExtension += "." + expectedOutputExtension;
            }
            var    mockFileSystem = new Mock <IFileSystem>().WithExampleTemplate("requestedTemplate", exampleTemplateName);
            string templateOutput = null;

            mockFileSystem.Setup(x => x.WriteAllText("z:\\proj\\" + expectedOutputPathWithExtension, It.IsAny <string>()))
            .Callback <string, string>((filename, writtenText) => { templateOutput = writtenText; });

            // Act: Invoke the template
            try
            {
                var results = new InvokeScaffoldTemplateCmdlet(solutionManager, mockFileSystem.Object)
                {
                    OutputPath = requestedOutputPath,
                    Template   = "requestedTemplate",
                    Model      = model
                }.GetResults <string>();

                // Assert
                Assert.AreEqual(expectedOutputPathWithExtension, results.Single());
                Assert.IsNotNull(solutionManager.DefaultProject.GetProjectItem(expectedOutputPathWithExtension));
                return(templateOutput);
            }
            catch (InvalidOperationException ex) {
                // If it was a template rendering error, throw a more descriptive exception
                var templateErrors = ex.Data["CmdletOutput"] as IList <object>;
                if ((templateErrors != null) && (templateErrors.Any()) && (templateErrors.First() is IEnumerable <CompilerError>))
                {
                    throw new InvalidOperationException("Template rendering error: " + string.Join(Environment.NewLine, ((IEnumerable <CompilerError>)templateErrors.First()).Select(x => x.ToString())));
                }
                throw;
            }
        }
        public void ShouldSkipRenderingIfPhysicalFileAlreadyExistsAndForceIsOff()
        {
            // Arrange
            var solutionManager = new MockSolutionManagerBuilder(new MockProject {
                RootPath = "z:\\proj"
            }).Build();
            var mockFileSystem = new Mock <IFileSystem>().WithExampleTemplate("requestedTemplate", "fixedStringTemplate")
                                 .WithFile("z:\\proj\\someFolder\\someFile.ext");

            // Act
            var results = new InvokeScaffoldTemplateCmdlet(solutionManager, mockFileSystem.Object)
            {
                Template   = "requestedTemplate",
                OutputPath = "someFolder\\someFile.ext"
            }.GetResults <string>();

            // Assert
            Assert.AreEqual(0, results.Count()); // Did not write any files
        }
        public void ShouldBeAbleToGetOutputAsStringIfNoOutputPathIsSpecified()
        {
            // Arrange
            var solutionManager = new MockSolutionManagerBuilder(new MockProject()).Build();
            var mockFileSystem  = new Mock <IFileSystem>().WithExampleTemplate("requestedTemplate", "simpleTemplate");

            // Act
            var results = new InvokeScaffoldTemplateCmdlet(solutionManager, mockFileSystem.Object)
            {
                Model = new Hashtable {
                    { "Name", "Bert" },
                    { "Values", new [] { 1, 2, 3, 4 } }
                },
                Template = "requestedTemplate"
            }.GetResults <string>();

            // Assert
            Assert.AreEqual("The name is Bert. There are 4 values.", results.Single());
        }
        public void ShouldPerformRenderingIfPhysicalFileDoesNotExistButIsReferencedByProject()
        {
            // Arrange
            var solutionManager = new MockSolutionManagerBuilder(new MockProject(
                                                                     new MockFolder("someFolder", new MockItem("someFile.ext"))
                                                                     )
            {
                RootPath = "z:\\proj"
            }).Build();
            var mockFileSystem = new Mock <IFileSystem>().WithExampleTemplate("requestedTemplate", "fixedStringTemplate");

            // Act
            var results = new InvokeScaffoldTemplateCmdlet(solutionManager, mockFileSystem.Object)
            {
                OutputPath = "someFolder\\someFile.ext",
                Template   = "requestedTemplate",
            }.GetResults <string>();

            // Assert
            Assert.AreEqual("someFolder\\someFile.ext", results.Single());
            mockFileSystem.Verify(x => x.WriteAllText("z:\\proj\\someFolder\\someFile.ext", "Fixed string output from template"));
        }
        public void ShouldPerformRenderingIfPhysicalFileExistsAndIsNotReferencedByProjectAndForceIsOn()
        {
            // Arrange
            var solutionManager = new MockSolutionManagerBuilder(new MockProject {
                RootPath = "z:\\proj"
            }).Build();
            var mockFileSystem = new Mock <IFileSystem>().WithExampleTemplate("requestedTemplate", "fixedStringTemplate")
                                 .WithFile("z:\\proj\\someFolder\\someFile.ext");

            // Act
            var results = new InvokeScaffoldTemplateCmdlet(solutionManager, mockFileSystem.Object)
            {
                OutputPath = "someFolder\\someFile.ext",
                Template   = "requestedTemplate",
                Force      = new SwitchParameter(true)
            }.GetResults <string>();

            // Assert
            Assert.AreEqual("someFolder\\someFile.ext", results.Single());
            mockFileSystem.Verify(x => x.WriteAllText("z:\\proj\\someFolder\\someFile.ext", "Fixed string output from template"));
            Assert.IsNotNull(solutionManager.DefaultProject.GetProjectItem("someFolder\\someFile.ext"));
        }
        public void ShouldBeAbleToLocateProjectRelativeTemplates()
        {
            // Arrange
            var solutionManager = new MockSolutionManagerBuilder(new MockProject(
                                                                     new MockFolder("myTemplates", new MockItem("someTemplate.ext.t4"))
                                                                     )
            {
                RootPath = "z:\\proj"
            }).Build();
            var mockFileSystem = new Mock <IFileSystem>().WithTextFile("z:\\proj\\myTemplates\\someTemplate.ext.t4", "My project-relative template contents");

            // Act
            var results = new InvokeScaffoldTemplateCmdlet(solutionManager, mockFileSystem.Object)
            {
                OutputPath = "someFolder\\someFile.ext",
                Template   = "myTemplates\\someTemplate.ext.t4"
            }.GetResults <string>();

            // Assert
            Assert.AreEqual("someFolder\\someFile.ext", results.Single());
            mockFileSystem.Verify(x => x.WriteAllText("z:\\proj\\someFolder\\someFile.ext", "My project-relative template contents"));
            Assert.IsNotNull(solutionManager.DefaultProject.GetProjectItem("someFolder\\someFile.ext"));
        }