public void BasicStringHostTest()
        {
            var host = new RazorStringHostContainer();
            
            // add model assembly - ie. this assembly
            host.AddAssemblyFromType(this);

            host.UseAppDomain = false;

            host.Start();
              
            Person person = new Person()
            {
                Name = "Rick",
                Company = "West Wind",
                Entered = DateTime.Now,
                Address = new Address()
                {
                    Street = "32 Kaiea",
                    City = "Paia"
                }
            };
            
            string result = host.RenderTemplate(Templates.BasicTemplateStringWithPersonModel,person);
            
            Console.WriteLine(result);
            Console.WriteLine("---");
            Console.WriteLine(host.Engine.LastGeneratedCode);

            if (result == null)
                Assert.Fail(host.ErrorMessage);
            
            host.Stop();
        }
        public void ManualCompileAndRunTest()
        {
            RazorEngine<RazorTemplateBase> host = CreateHost();
            if (host == null)
                Assert.Fail("Unable to create RazorEngine " + host.ErrorMessage);

            Person person = new Person()
            {
                Name = "Rick",
                Company = "West WInd",
                Entered = DateTime.Now,
                Address = new Address()
                {
                    Street = "32 Kaiea",
                    City = "Paia"
                }
            };

            // we have to explicitly add a reference to the model's assembly
            // if we're compiling manually - the compiler doesn't know about
            // the model.
            host.AddAssemblyFromType(person);
            
            string templateId = host.CompileTemplate(
                            Templates.BasicTemplateStringWithPersonModel,
                            "__RazorHost", "ManualCompileAndRun");

            if (templateId == null)
                Assert.Fail("Unable to compile Template: " + host.ErrorMessage);
            
            string result = host.RenderTemplateFromAssembly(templateId, person);

            if (result == null)
            {
                Assert.Fail(host.ErrorMessage);
                return;
            }

            Console.WriteLine(result);
            Console.WriteLine("--- Source Code ---");
            Console.WriteLine(host.LastGeneratedCode);
        }
        public void BasicRazorEngineToTextWriterTest()
        {
            RazorEngine<RazorTemplateBase> host = CreateHost();
            if (host == null)
                Assert.Fail("Unable to create RazorEngine " + host.ErrorMessage);

            Person person = new Person()
            {
                Name = "Rick",
                Company = "West Wind",
                Entered = DateTime.Now
            };

            var curAssemlblyPath = Path.GetFileName(typeof(Person).Assembly.CodeBase.Replace("file:///", "").Replace("/", "\\"));
            string outputFile = Path.Combine(Environment.CurrentDirectory,"templateoutput.txt");
            File.Delete(outputFile);


            using (TextWriter writer = new StreamWriter(outputFile, false, Encoding.UTF8))
            {
                // when rendering to writer result is empty (success) or null (failure)
                string result = host.RenderTemplate(
                    // template to render
                        Templates.BasicTemplateStringWithPersonModel,
                    // Model
                        person,                  
                    // write to textwriter
                        writer
                    );

                if (result == null)
                {
                    Assert.Fail(host.ErrorMessage);
                    return;
                }
            }

            Assert.IsTrue(File.Exists(outputFile),"Template output not created");
            string text = File.ReadAllText(outputFile);
            Console.WriteLine(text); 
            Assert.IsTrue(text.Contains("West Wind"), "Text not found in generated template");

            File.Delete(outputFile);
            
            Console.WriteLine("--- Source Code ---");
            Console.WriteLine(host.LastGeneratedCode);
        }
        public void BasicRazorEngineTextReaderRenderingTest()
        {
            RazorEngine<RazorTemplateBase> host = CreateHost();
            if (host == null)
                Assert.Fail("Unable to create RazorEngine " + host.ErrorMessage);

            Person person = new Person()
            {
                Name = "Rick",
                Company = "West WInd",
                Entered = DateTime.Now
            };

            var curAssemlblyPath = Path.GetFileName(typeof(Person).Assembly.CodeBase.Replace("file:///", "").Replace("/", "\\"));

            TextReader reader = new StringReader(Templates.BasicTemplateStringWithPersonModel);

            string result = host.RenderTemplate(
                // template to render
                    reader,
                // Model
                    person                
               );

            if (result == null)
            {
                Assert.Fail(host.ErrorMessage);
                return;
            }

            Console.WriteLine(result);
            Console.WriteLine("--- Source Code ---");
            Console.WriteLine(host.LastGeneratedCode);
        }
        public void BasicRazorEngineStringRenderingTest()
        {
            RazorEngine<RazorTemplateBase> host = CreateHost();
            if (host == null)
                Assert.Fail("Unable to create RazorEngine " + host.ErrorMessage);


            Person person = new Person()
            {
                Name = "Rick",
                Company = "West WInd",
                Entered = DateTime.Now,
                Address = new Address()
                {
                    Street = "32 Kaiea",
                    City = "Paia"
                }
            };

            string result = host.RenderTemplate(
                    // template to render
                    Templates.BasicTemplateStringWithPersonModel,
                    // Model
                    person);                   

            if (result == null)
            {
                Assert.Fail(host.ErrorMessage);
                return;
            }

            Console.WriteLine(result);
            Console.WriteLine("--- Source Code ---");
            Console.WriteLine(host.LastGeneratedCode);
        }
        public void FolderHostWithLayoutPageTest()
        {
            using (var host = new RazorFolderHostContainer())
            {
                host.TemplatePath     = Path.GetFullPath(@"..\..\FileTemplates\");
                host.BaseBinaryFolder = Environment.CurrentDirectory;
                Console.WriteLine(host.TemplatePath);

                // point at the folder where dependent assemblies can be found
                // this applies only to separate AppDomain hosting
                host.BaseBinaryFolder = Environment.CurrentDirectory;

                // add model assembly - ie. this assembly
                host.AddAssemblyFromType(typeof(Person));

                // NOTE: If you use AppDomains you will need to add a /bin folder
                //       with all dependencies OR run out of the current folder
                //       and all models have to be serializable or MarshalByRefObj
                host.UseAppDomain = false;

                //host.Configuration.CompileToMemory = true;
                //host.Configuration.TempAssemblyPath = Environment.CurrentDirectory;

                // Always must start the host
                host.Start();

                // create a model to pass
                Person person = new Person()
                {
                    Name    = "John Doe",
                    Company = "Doeboy Incorporated",
                    Entered = DateTime.Now,
                    Address = new Address()
                    {
                        Street = "32 Kaiea",
                        City   = "Paia"
                    }
                };

                Console.WriteLine("-----Layout page only (rendered)");
                // just show what a layout template looks like on its own
                string layout = host.RenderTemplate("~/_Layout.cshtml", person);
                Console.WriteLine(layout);


                Console.WriteLine("----- Content page In Layout Container");

                // render a template and pass the model
                string result = host.RenderTemplate("~/LayoutPageExample.cshtml", person);

                //result = layout.Replace("@RenderBody", result);

                //Assert.True(result != null, "Template didn't return any data: " + host.ErrorMessage);

                Console.WriteLine("---");
                Console.WriteLine(result);
                Console.WriteLine("---");

                Assert.IsNotNull(result, host.ErrorMessage);
            }
        }
        public void BasicStringHostWithInferredModelTest()
        {
            var host = new RazorStringHostContainer();

            // add model assembly - ie. this assembly
            host.AddAssemblyFromType(this);

            host.UseAppDomain = false;

            host.Start();

            Person person = new Person()
            {
                Name = "Rick",
                Company = "West Wind",
                Entered = DateTime.Now,
                Address = new Address()
                {
                    Street = "32 Kaiea",
                    City = "Paia"
                }
            };

            
            string template = @"
<div>@Model.Name
<div>
@foreach (var addr in Model.Addresses.OrderBy( ad=> ad.Street))
{
        <div>@addr.Street, @addr.Phone</div>    
}
</div>
";   

            string result = host.RenderTemplate(template, person,inferModelType: true);

            Console.WriteLine(result);
            Console.WriteLine("---");            

            Assert.IsNotNull(result, "Result shouldn't be null: " + host.ErrorMessage);
                
            host.Stop();
        }
        public void BasicStringHostRuntimeErrorlTest()
        {
            var host = new RazorStringHostContainer();

            // add model assembly - ie. this assembly
            host.AddAssemblyFromType(this);

            host.UseAppDomain = false;

            host.Start();

            Person person = new Person()
            {
                Name = "Rick",
                Company = "West Wind",
                Entered = DateTime.Now,
                Address = new Address()
                {
                    Street = "32 Kaiea",
                    City = "Paia"
                }
            };


            string template = @"
@{
   Model.Name = null;   
}
<div>
    Fail here with Null exception: 
    @Model.Name.ToLower()
<div>
";

            string result = host.RenderTemplate(template, person, inferModelType: true);

            Assert.IsNull(result, "Result should have failed with a runtime error.");
            Console.WriteLine(result);
            Console.WriteLine(host.ErrorMessage);

            host.Stop();
        }
        public void BasicFolderTest()
        {
            var host = new RazorFolderHostContainer();

            host.TemplatePath = Path.GetFullPath(@"..\..\FileTemplates\");
            host.BaseBinaryFolder = Environment.CurrentDirectory;

            // add model assembly - ie. this assembly
            host.AddAssemblyFromType(typeof(Person));
            host.UseAppDomain = true;

            //host.Configuration.CompileToMemory = true;
            //host.Configuration.TempAssemblyPath = Environment.CurrentDirectory;

            host.Start();

            Person person = new Person()
            {
                Name = "Rick",
                Company = "West Wind",
                Entered = DateTime.Now,
                Address = new Address()
                {
                    Street = "32 Kaiea",
                    City = "Paia"
                }
            };

            string result = host.RenderTemplate("~/HelloWorld.cshtml", person);



            Console.WriteLine(result);
            Console.WriteLine("---");
            Console.WriteLine(host.Engine.LastGeneratedCode);

            host.Stop();

            if (result == null)
                Assert.Fail(host.ErrorMessage);

            Assert.IsTrue(result.Contains("West Wind"));
        }